diff --git a/2023/icons/studiolibrary.png b/2023/icons/studiolibrary.png new file mode 100644 index 0000000..98a8ea1 Binary files /dev/null and b/2023/icons/studiolibrary.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/README.md b/2023/scripts/animation_tools/studiolibrary/README.md new file mode 100644 index 0000000..b634ca3 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/README.md @@ -0,0 +1,64 @@ +# Studio Library + +Studio Library 是一个免费的动画库工具,用于在 Autodesk Maya 中管理姿势和动画。 + +## 版本 + +Studio Library 2.20.2 + +## 官方信息 + +- **官网**: https://www.studiolibrary.com +- **GitHub**: https://github.com/krathjen/studiolibrary +- **作者**: Kurt Rathjen + +## 功能特性 + +- 保存和加载动画姿势 +- 管理动画片段 +- 镜像姿势和动画 +- 选择集管理 +- 自定义缩略图 +- 支持多个库 +- 拖放操作 +- 搜索和过滤 + +## 使用方法 + +### 在 Python 中启动 + +```python +import sys +import os + +studiolibrary_path = r'h:\Workspace\Raw\Tools\Plugins\Maya\2023\scripts\animation_tools\studiolibrary' +if studiolibrary_path not in sys.path: + sys.path.insert(0, studiolibrary_path) + +import studiolibrary +studiolibrary.main() +``` + +### 从工具架启动 + +点击动画工具架上的 **StudioLib** 按钮即可启动。 + +## 模块结构 + +此模块包含以下子模块: + +- **studiolibrary**: 核心库模块 +- **studiolibrarymaya**: Maya 集成模块 +- **mutils**: Maya 工具函数 +- **studioqt**: Qt 界面组件 +- **studiovendor**: 第三方依赖 + +## 注意事项 + +- 首次使用需要设置库路径 +- 支持 Maya 2017 及更高版本 +- 需要 PySide2 或 PySide6(Maya 自带) + +## 许可证 + +GNU Lesser General Public License v3.0 diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/README.md b/2023/scripts/animation_tools/studiolibrary/mutils/README.md new file mode 100644 index 0000000..680f783 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/mutils/README.md @@ -0,0 +1,5 @@ +# Welcome to mutils! + +`mutils` is a python package containing many Maya utility functions for managing poses and animations in Maya. + +* www.studiolibrary.com diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/__init__.py b/2023/scripts/animation_tools/studiolibrary/mutils/__init__.py new file mode 100644 index 0000000..3e1f48c --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/mutils/__init__.py @@ -0,0 +1,30 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +from .cmds import * +from .decorators import * + +from . import playblast +from . import namespace + +from .scriptjob import ScriptJob +from .matchnames import matchNames, groupObjects + +from .node import Node +from .attribute import Attribute + +from .transferobject import TransferObject + +from .selectionset import SelectionSet, saveSelectionSet +from .pose import Pose, savePose, loadPose +from .animation import Animation, PasteOption, saveAnim, loadAnims +from .mirrortable import MirrorTable, MirrorOption, saveMirrorTable diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/animation.py b/2023/scripts/animation_tools/studiolibrary/mutils/animation.py new file mode 100644 index 0000000..ad6c8b8 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/mutils/animation.py @@ -0,0 +1,839 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +import os +import shutil +import logging + +from studiovendor.Qt import QtWidgets + +import mutils +import mutils.gui + +try: + import maya.cmds +except ImportError: + import traceback + traceback.print_exc() + +logger = logging.getLogger(__name__) + + +MIN_TIME_LIMIT = -10000 +MAX_TIME_LIMIT = 100000 +DEFAULT_FILE_TYPE = "mayaBinary" # "mayaAscii" + +# A feature flag that will be removed in the future. +FIX_SAVE_ANIM_REFERENCE_LOCKED_ERROR = True + + +class PasteOption: + + Insert = "insert" + Replace = "replace" + ReplaceAll = "replace all" + ReplaceCompletely = "replaceCompletely" + + +class AnimationTransferError(Exception): + """Base class for exceptions in this module.""" + pass + + +class OutOfBoundsError(AnimationTransferError): + """Exceptions for clips or ranges that are outside the expected range""" + pass + + +def validateAnimLayers(): + """ + Check if the selected animation layer can be exported. + + :raise: AnimationTransferError + """ + if maya.cmds.about(q=True, batch=True): + return + + animLayers = maya.mel.eval('$gSelectedAnimLayers=$gSelectedAnimLayers') + + # Check if more than one animation layer has been selected. + if len(animLayers) > 1: + msg = "More than one animation layer is selected! " \ + "Please select only one animation layer for export!" + + raise AnimationTransferError(msg) + + # Check if the selected animation layer is locked + if len(animLayers) == 1: + if maya.cmds.animLayer(animLayers[0], query=True, lock=True): + msg = "Cannot export an animation layer that is locked! " \ + "Please unlock the anim layer before exporting animation!" + + raise AnimationTransferError(msg) + + +def saveAnim( + objects, + path, + time=None, + sampleBy=1, + fileType="", + metadata=None, + iconPath="", + sequencePath="", + bakeConnected=True +): + """ + Save the anim data for the given objects. + + Example: + import mutils + mutils.saveAnim( + path="c:/example.anim", + objects=["control1", "control2"] + time=(1, 20), + metadata={'description': 'Example anim'} + ) + + :type path: str + :type objects: None or list[str] + :type time: (int, int) or None + :type fileType: str or None + :type sampleBy: int + :type iconPath: str + :type sequencePath: str + :type metadata: dict or None + :type bakeConnected: bool + + :rtype: mutils.Animation + """ + # Copy the icon path to the temp location + if iconPath: + shutil.copyfile(iconPath, path + "/thumbnail.jpg") + + # Copy the sequence path to the temp location + if sequencePath: + shutil.move(sequencePath, path + "/sequence") + + # Save the animation to the temp location + anim = mutils.Animation.fromObjects(objects) + anim.updateMetadata(metadata) + anim.save( + path, + time=time, + sampleBy=sampleBy, + fileType=fileType, + bakeConnected=bakeConnected + ) + return anim + + +def clampRange(srcTime, dstTime): + """ + Clips the given source time to within the given destination time. + + Example: + print clampRange((15, 35), (20, 30)) + # 20, 30 + + print clampRange((25, 45), (20, 30)) + # 25, 30 + + :type srcTime: (int, int) + :type dstTime: (int, int) + :rtype: (int, int) + """ + srcStart, srcEnd = srcTime + dstStart, dstEnd = dstTime + + if srcStart > dstEnd or srcEnd < dstStart: + msg = "The src and dst time do not overlap. " \ + "Unable to clamp (src=%s, dest=%s)" + raise OutOfBoundsError(msg, srcTime, dstTime) + + if srcStart < dstStart: + srcStart = dstStart + + if srcEnd > dstEnd: + srcEnd = dstEnd + + return srcStart, srcEnd + + +def moveTime(time, start): + """ + Move the given time to the given start time. + + Example: + print moveTime((15, 35), 5) + # 5, 20 + + :type time: (int, int) + :type start: int + :rtype: (int, int) + """ + srcStartTime, srcEndTime = time + duration = srcEndTime - srcStartTime + + if start is None: + startTime = srcStartTime + else: + startTime = start + + endTime = startTime + duration + + if startTime == endTime: + endTime = startTime + 1 + + return startTime, endTime + + +def findFirstLastKeyframes(curves, time=None): + """ + Return the first and last frame of the given animation curves + + :type curves: list[str] + :type time: (int, int) + :rtype: (int, int) + """ + first = maya.cmds.findKeyframe(curves, which='first') + last = maya.cmds.findKeyframe(curves, which='last') + + result = (first, last) + + if time: + + # It's possible (but unlikely) that the curves will not lie within the + # first and last frame + try: + result = clampRange(time, result) + except OutOfBoundsError as error: + logger.warning(error) + + return result + + +def insertKeyframe(curves, time): + """ + Insert a keyframe on the given curves at the given time. + + :type curves: list[str] + :type time: (int, int) + """ + startTime, endTime = time + + for curve in curves: + insertStaticKeyframe(curve, time) + + firstFrame = maya.cmds.findKeyframe(curves, time=(startTime, startTime), which='first') + lastFrame = maya.cmds.findKeyframe(curves, time=(endTime, endTime), which='last') + + if firstFrame < startTime < lastFrame: + maya.cmds.setKeyframe(curves, insert=True, time=(startTime, startTime)) + + if firstFrame < endTime < lastFrame: + maya.cmds.setKeyframe(curves, insert=True, time=(endTime, endTime)) + + +def insertStaticKeyframe(curve, time): + """ + Insert a static keyframe on the given curve at the given time. + + :type curve: str + :type time: (int, int) + :rtype: None + """ + startTime, endTime = time + + lastFrame = maya.cmds.findKeyframe(curve, which='last') + firstFrame = maya.cmds.findKeyframe(curve, which='first') + + if firstFrame == lastFrame: + maya.cmds.setKeyframe(curve, insert=True, time=(startTime, endTime)) + maya.cmds.keyTangent(curve, time=(startTime, startTime), ott="step") + + if startTime < firstFrame: + nextFrame = maya.cmds.findKeyframe(curve, time=(startTime, startTime), which='next') + if startTime < nextFrame < endTime: + maya.cmds.setKeyframe(curve, insert=True, time=(startTime, nextFrame)) + maya.cmds.keyTangent(curve, time=(startTime, startTime), ott="step") + + if endTime > lastFrame: + previousFrame = maya.cmds.findKeyframe(curve, time=(endTime, endTime), which='previous') + if startTime < previousFrame < endTime: + maya.cmds.setKeyframe(curve, insert=True, time=(previousFrame, endTime)) + maya.cmds.keyTangent(curve, time=(previousFrame, previousFrame), ott="step") + + +def duplicateNode(node, name): + """Duplicate the given node. + + :param node: Maya path. + :type node: str + :param name: Name for the duplicated node. + :type name: str + :returns: Duplicated node names. + :rtype: list[str] + """ + if maya.cmds.nodeType(node) in ["transform", "joint"]: + new = maya.cmds.duplicate(node, name=name, parentOnly=True)[0] + else: + # Please let us know if this logic is causing issues. + new = maya.cmds.duplicate(node, name=name)[0] + shapes = maya.cmds.listRelatives(new, shapes=True) or [] + if shapes: + return [shapes[0], new] + return [new] + + +def loadAnims( + paths, + spacing=1, + objects=None, + option=None, + connect=False, + namespaces=None, + startFrame=None, + mirrorTable=None, + currentTime=None, + showDialog=False, +): + """ + Load the animations in the given order of paths with the spacing specified. + + :type paths: list[str] + :type spacing: int + :type connect: bool + :type objects: list[str] + :type namespaces: list[str] + :type startFrame: int + :type option: PasteOption + :type currentTime: bool + :type mirrorTable: bool + :type showDialog: bool + """ + isFirstAnim = True + + if spacing < 1: + spacing = 1 + + if option is None or option == "replace all": + option = PasteOption.ReplaceCompletely + + if currentTime and startFrame is None: + startFrame = int(maya.cmds.currentTime(query=True)) + + if showDialog: + + msg = "Load the following animation in sequence;\n" + + for i, path in enumerate(paths): + msg += "\n {0}. {1}".format(i, os.path.basename(path)) + + msg += "\n\nPlease choose the spacing between each animation." + + spacing, accepted = QtWidgets.QInputDialog.getInt( + None, + "Load animation sequence", + msg, + spacing, + QtWidgets.QInputDialog.NoButtons, + ) + + if not accepted: + raise Exception("Dialog canceled!") + + for path in paths: + + anim = mutils.Animation.fromPath(path) + + if startFrame is None and isFirstAnim: + startFrame = anim.startFrame() + + if option == "replaceCompletely" and not isFirstAnim: + option = "insert" + + anim.load( + option=option, + objects=objects, + connect=connect, + startFrame=startFrame, + namespaces=namespaces, + currentTime=currentTime, + mirrorTable=mirrorTable, + ) + + duration = anim.endFrame() - anim.startFrame() + startFrame += duration + spacing + isFirstAnim = False + + +class Animation(mutils.Pose): + + IMPORT_NAMESPACE = "REMOVE_IMPORT" + + @classmethod + def fromPath(cls, path): + """ + Create and return an Anim object from the give path. + + Example: + anim = Animation.fromPath("/temp/example.anim") + print anim.endFrame() + # 14 + + :type path: str + :rtype: Animation + """ + anim = cls() + anim.setPath(path) + anim.read() + return anim + + def __init__(self): + mutils.Pose.__init__(self) + + try: + timeUnit = maya.cmds.currentUnit(q=True, time=True) + linearUnit = maya.cmds.currentUnit(q=True, linear=True) + angularUnit = maya.cmds.currentUnit(q=True, angle=True) + + self.setMetadata("timeUnit", timeUnit) + self.setMetadata("linearUnit", linearUnit) + self.setMetadata("angularUnit", angularUnit) + except NameError as msg: + logger.exception(msg) + + def select(self, objects=None, namespaces=None, **kwargs): + """ + Select the objects contained in the animation. + + :type objects: list[str] or None + :type namespaces: list[str] or None + :rtype: None + """ + selectionSet = mutils.SelectionSet.fromPath(self.poseJsonPath()) + selectionSet.load(objects=objects, namespaces=namespaces, **kwargs) + + def startFrame(self): + """ + Return the start frame for anim object. + + :rtype: int + """ + return self.metadata().get("startFrame") + + def endFrame(self): + """ + Return the end frame for anim object. + + :rtype: int + """ + return self.metadata().get("endFrame") + + def mayaPath(self): + """ + :rtype: str + """ + mayaPath = os.path.join(self.path(), "animation.mb") + if not os.path.exists(mayaPath): + mayaPath = os.path.join(self.path(), "animation.ma") + return mayaPath + + def poseJsonPath(self): + """ + :rtype: str + """ + return os.path.join(self.path(), "pose.json") + + def paths(self): + """ + Return all the paths for Anim object. + + :rtype: list[str] + """ + result = [] + if os.path.exists(self.mayaPath()): + result.append(self.mayaPath()) + + if os.path.exists(self.poseJsonPath()): + result.append(self.poseJsonPath()) + + return result + + def animCurve(self, name, attr, withNamespace=False): + """ + Return the animCurve for the given object name and attribute. + + :type name: str + :type attr: str + :type withNamespace: bool + + :rtype: str + """ + curve = self.attr(name, attr).get("curve", None) + if curve and withNamespace: + curve = Animation.IMPORT_NAMESPACE + ":" + curve + return curve + + def setAnimCurve(self, name, attr, curve): + """ + Set the animCurve for the given object name and attribute. + + :type name: str + :type attr: str + :type curve: str + """ + self.objects()[name].setdefault("attrs", {}) + self.objects()[name]["attrs"].setdefault(attr, {}) + self.objects()[name]["attrs"][attr]["curve"] = curve + + def read(self, path=None): + """ + Read all the data to be used by the Anim object. + + :rtype: None + """ + path = self.poseJsonPath() + + logger.debug("Reading: " + path) + mutils.Pose.read(self, path=path) + logger.debug("Reading Done") + + def isAscii(self, s): + """Check if the given string is a valid ascii string.""" + return all(ord(c) < 128 for c in s) + + @mutils.unifyUndo + @mutils.restoreSelection + def open(self): + """ + The reason we use importing and not referencing is because we + need to modify the imported animation curves and modifying + referenced animation curves is only supported in Maya 2014+ + """ + self.close() # Make sure everything is cleaned before importing + + if not self.isAscii(self.mayaPath()): + msg = "Cannot load animation using non-ascii paths." + raise IOError(msg) + + nodes = maya.cmds.file( + self.mayaPath(), + i=True, + groupLocator=True, + ignoreVersion=True, + returnNewNodes=True, + namespace=Animation.IMPORT_NAMESPACE, + ) + + return nodes + + def close(self): + """ + Clean up all imported nodes, as well as the namespace. + Should be called in a finally block. + """ + nodes = maya.cmds.ls(Animation.IMPORT_NAMESPACE + ":*", r=True) or [] + if nodes: + maya.cmds.delete(nodes) + + # It is important that we remove the imported namespace, + # otherwise another namespace will be created on next + # animation open. + namespaces = maya.cmds.namespaceInfo(ls=True) or [] + + if Animation.IMPORT_NAMESPACE in namespaces: + maya.cmds.namespace(set=':') + maya.cmds.namespace(rm=Animation.IMPORT_NAMESPACE) + + def cleanMayaFile(self, path): + """ + Clean up all commands in the exported maya file that are + not createNode. + """ + results = [] + + if path.endswith(".mb"): + return + + with open(path, "r") as f: + for line in f.readlines(): + if not line.startswith("select -ne"): + results.append(line) + else: + results.append("// End") + break + + with open(path, "w") as f: + f.writelines(results) + + @mutils.timing + @mutils.unifyUndo + @mutils.showWaitCursor + @mutils.restoreSelection + def save( + self, + path, + time=None, + sampleBy=1, + fileType="", + bakeConnected=True + ): + """ + Save all animation data from the objects set on the Anim object. + + :type path: str + :type time: (int, int) or None + :type sampleBy: int + :type fileType: str + :type bakeConnected: bool + + :rtype: None + """ + objects = list(self.objects().keys()) + + fileType = fileType or DEFAULT_FILE_TYPE + + if not time: + time = mutils.selectedObjectsFrameRange(objects) + start, end = time + + # Check selected animation layers + validateAnimLayers() + + # Check frame range + if start is None or end is None: + msg = "Please specify a start and end frame!" + raise AnimationTransferError(msg) + + if start >= end: + msg = "The start frame cannot be greater than or equal to the end frame!" + raise AnimationTransferError(msg) + + # Check if animation exists + if mutils.getDurationFromNodes(objects or [], time=time) <= 0: + msg = "No animation was found on the specified object/s! " \ + "Please create a pose instead!" + raise AnimationTransferError(msg) + + self.setMetadata("endFrame", end) + self.setMetadata("startFrame", start) + + end += 1 + validCurves = [] + deleteObjects = [] + + msg = u"Animation.save(path={0}, time={1}, bakeConnections={2}, sampleBy={3})" + msg = msg.format(path, str(time), str(bakeConnected), str(sampleBy)) + logger.debug(msg) + + try: + if bakeConnected: + maya.cmds.undoInfo(openChunk=True) + mutils.bakeConnected(objects, time=(start, end), sampleBy=sampleBy) + + for name in objects: + if maya.cmds.copyKey(name, time=(start, end), includeUpperBound=False, option="keys"): + dstNodes = duplicateNode(name, "CURVE") + dstNode = dstNodes[0] + deleteObjects.extend(dstNodes) + + if not FIX_SAVE_ANIM_REFERENCE_LOCKED_ERROR: + mutils.disconnectAll(dstNode) + + # Make sure we delete all proxy attributes, otherwise pasteKey will duplicate keys + mutils.Attribute.deleteProxyAttrs(dstNode) + maya.cmds.pasteKey(dstNode) + + attrs = maya.cmds.listAttr(dstNode, unlocked=True, keyable=True) or [] + attrs = list(set(attrs) - set(['translate', 'rotate', 'scale'])) + + for attr in attrs: + dstAttr = mutils.Attribute(dstNode, attr) + dstCurve = dstAttr.animCurve() + + if dstCurve: + + dstCurve = maya.cmds.rename(dstCurve, "CURVE") + deleteObjects.append(dstCurve) + + srcAttr = mutils.Attribute(name, attr) + srcCurve = srcAttr.animCurve() + + if srcCurve: + preInfinity = maya.cmds.getAttr(srcCurve + ".preInfinity") + postInfinity = maya.cmds.getAttr(srcCurve + ".postInfinity") + curveColor = maya.cmds.getAttr(srcCurve + ".curveColor") + useCurveColor = maya.cmds.getAttr(srcCurve + ".useCurveColor") + + maya.cmds.setAttr(dstCurve + ".preInfinity", preInfinity) + maya.cmds.setAttr(dstCurve + ".postInfinity", postInfinity) + maya.cmds.setAttr(dstCurve + ".curveColor", *curveColor[0]) + maya.cmds.setAttr(dstCurve + ".useCurveColor", useCurveColor) + + if maya.cmds.keyframe(dstCurve, query=True, time=(start, end), keyframeCount=True): + self.setAnimCurve(name, attr, dstCurve) + maya.cmds.cutKey(dstCurve, time=(MIN_TIME_LIMIT, start - 1)) + maya.cmds.cutKey(dstCurve, time=(end + 1, end + MAX_TIME_LIMIT)) + validCurves.append(dstCurve) + + fileName = "animation.ma" + if fileType == "mayaBinary": + fileName = "animation.mb" + + mayaPath = os.path.join(path, fileName) + posePath = os.path.join(path, "pose.json") + mutils.Pose.save(self, posePath) + + if validCurves: + maya.cmds.select(validCurves) + logger.info("Saving animation: %s" % mayaPath) + maya.cmds.file(mayaPath, force=True, options='v=0', type=fileType, uiConfiguration=False, exportSelected=True) + self.cleanMayaFile(mayaPath) + + finally: + if bakeConnected: + # HACK! Undo all baked connections. :) + maya.cmds.undoInfo(closeChunk=True) + maya.cmds.undo() + elif deleteObjects: + maya.cmds.delete(deleteObjects) + + self.setPath(path) + + @mutils.timing + @mutils.showWaitCursor + def load( + self, + objects=None, + namespaces=None, + attrs=None, + startFrame=None, + sourceTime=None, + option=None, + connect=False, + mirrorTable=None, + currentTime=None + ): + """ + Load the animation data to the given objects or namespaces. + + :type objects: list[str] + :type namespaces: list[str] + :type startFrame: int + :type sourceTime: (int, int) or None + :type attrs: list[str] + :type option: PasteOption or None + :type connect: bool + :type mirrorTable: mutils.MirrorTable + :type currentTime: bool or None + """ + logger.info(u'Loading: {0}'.format(self.path())) + + connect = bool(connect) # Make false if connect is None + + if not sourceTime: + sourceTime = (self.startFrame(), self.endFrame()) + + if option and option.lower() == "replace all": + option = "replaceCompletely" + + if option is None or option == PasteOption.ReplaceAll: + option = PasteOption.ReplaceCompletely + + self.validate(namespaces=namespaces) + + objects = objects or [] + + logger.debug("Animation.load(objects=%s, option=%s, namespaces=%s, srcTime=%s, currentTime=%s)" % + (len(objects), str(option), str(namespaces), str(sourceTime), str(currentTime))) + + srcObjects = self.objects().keys() + + if mirrorTable: + self.setMirrorTable(mirrorTable) + + valid = False + matches = list(mutils.matchNames(srcObjects=srcObjects, dstObjects=objects, dstNamespaces=namespaces)) + + for srcNode, dstNode in matches: + if dstNode.exists(): + valid = True + break + + if not matches or not valid: + + text = "No objects match when loading data. " \ + "Turn on debug mode to see more details." + + raise mutils.NoMatchFoundError(text) + + # Load the animation data. + srcCurves = self.open() + + try: + maya.cmds.flushUndo() + maya.cmds.undoInfo(openChunk=True) + + if currentTime and startFrame is None: + startFrame = int(maya.cmds.currentTime(query=True)) + + srcTime = findFirstLastKeyframes(srcCurves, sourceTime) + dstTime = moveTime(srcTime, startFrame) + + if option != PasteOption.ReplaceCompletely: + insertKeyframe(srcCurves, srcTime) + + for srcNode, dstNode in matches: + + # Remove the first pipe in-case the object has a parent + dstNode.stripFirstPipe() + + for attr in self.attrs(srcNode.name()): + + # Filter any attributes if the parameter has been set + if attrs is not None and attr not in attrs: + continue + + dstAttr = mutils.Attribute(dstNode.name(), attr) + + if not dstAttr.exists(): + logger.debug('Skipping attribute: The destination attribute "%s" does not exist!' % dstAttr.fullname()) + continue + + if dstAttr.isProxy(): + logger.debug('Skipping attribute: The destination attribute "%s" is a proxy attribute!', dstAttr.fullname()) + continue + + srcCurve = self.animCurve(srcNode.name(), attr, withNamespace=True) + + if srcCurve: + dstAttr.setAnimCurve( + srcCurve, + time=dstTime, + option=option, + source=srcTime, + connect=connect + ) + else: + value = self.attrValue(srcNode.name(), attr) + dstAttr.setStaticKeyframe(value, dstTime, option) + + finally: + self.close() + maya.cmds.undoInfo(closeChunk=True) + + # Return the focus to the Maya window + maya.cmds.setFocus("MayaWindow") + + logger.info(u'Loaded: {0}'.format(self.path())) diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/attribute.py b/2023/scripts/animation_tools/studiolibrary/mutils/attribute.py new file mode 100644 index 0000000..27e4b0f --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/mutils/attribute.py @@ -0,0 +1,565 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . +""" +Example: + +import mutils + +attr = mutils.Attribute("sphere1", "translateX") +attr.set(100) +""" +import logging +from studiovendor import six + +try: + import maya.cmds +except ImportError: + import traceback + traceback.print_exc() + + +logger = logging.getLogger(__name__) + + +VALID_CONNECTIONS = [ + "animCurve", + "animBlend", + "pairBlend", + "character" +] + +VALID_BLEND_ATTRIBUTES = [ + "int", + "long", + "float", + "short", + "double", + "doubleAngle", + "doubleLinear", +] + +VALID_ATTRIBUTE_TYPES = [ + "int", + "long", + "enum", + "bool", + "string", + "float", + "short", + "double", + "doubleAngle", + "doubleLinear", +] + + +class AttributeError(Exception): + """Base class for exceptions in this module.""" + pass + + +class Attribute(object): + + + @classmethod + def listAttr(cls, name, **kwargs): + """ + Return a list of Attribute from the given name and matching criteria. + + If no flags are specified all attributes are listed. + + :rtype: list[Attribute] + """ + attrs = maya.cmds.listAttr(name, **kwargs) or [] + return [cls(name, attr) for attr in attrs] + + @classmethod + def deleteProxyAttrs(cls, name): + """Delete all the proxy attributes for the given object name.""" + attrs = cls.listAttr(name, unlocked=True, keyable=True) or [] + for attr in attrs: + if attr.isProxy(): + attr.delete() + + def __init__(self, name, attr=None, value=None, type=None, cache=True): + """ + :type name: str + :type attr: str | None + :type type: str | None + :type value: object | None + :type cache: bool + """ + if "." in name: + name, attr = name.split(".") + + if attr is None: + msg = "Cannot initialise attribute instance without a given attr." + raise AttributeError(msg) + + self._name = six.text_type(name) + self._attr = six.text_type(attr) + self._type = type + self._value = value + self._cache = cache + self._fullname = None + + def __str__(self): + """ + :rtype: str + """ + return str(self.toDict()) + + def name(self): + """ + Return the Maya object name for the attribute. + + :rtype: str + """ + return self._name + + def attr(self): + """ + Return the attribute name. + + :rtype: str + """ + return self._attr + + def isLocked(self): + """ + Return true if the attribute is locked. + + :rtype: bool + """ + return maya.cmds.getAttr(self.fullname(), lock=True) + + def isUnlocked(self): + """ + Return true if the attribute is unlocked. + + :rtype: bool + """ + return not self.isLocked() + + def toDict(self): + """ + Return a dictionary of the attribute object. + + :rtype: dict + """ + result = { + "type": self.type(), + "value": self.value(), + "fullname": self.fullname(), + } + return result + + def isValid(self): + """ + Return true if the attribute type is valid. + + :rtype: bool + """ + return self.type() in VALID_ATTRIBUTE_TYPES + + def isProxy(self): + """ + Return true if the attribute is a proxy + + :rtype: bool + """ + if not maya.cmds.addAttr(self.fullname(), query=True, exists=True): + return False + + return maya.cmds.addAttr(self.fullname(), query=True, usedAsProxy=True) + + def delete(self): + """Delete the attribute""" + maya.cmds.deleteAttr(self.fullname()) + + def exists(self): + """ + Return true if the object and attribute exists in the scene. + + :rtype: bool + """ + return maya.cmds.objExists(self.fullname()) + + def prettyPrint(self): + """ + Print the command for setting the attribute value + """ + msg = 'maya.cmds.setAttr("{0}", {1})' + msg = msg.format(self.fullname(), self.value()) + print(msg) + + def clearCache(self): + """ + Clear all cached values + """ + self._type = None + self._value = None + + def update(self): + """ + This method will be deprecated. + """ + self.clearCache() + + def query(self, **kwargs): + """ + Convenience method for Maya's attribute query command + + :rtype: object + """ + return maya.cmds.attributeQuery(self.attr(), node=self.name(), **kwargs) + + def listConnections(self, **kwargs): + """ + Convenience method for Maya's list connections command + + :rtype: list[str] + """ + return maya.cmds.listConnections(self.fullname(), **kwargs) + + def sourceConnection(self, **kwargs): + """ + Return the source connection for this attribute. + + :rtype: str | None + """ + try: + return self.listConnections(destination=False, **kwargs)[0] + except IndexError: + return None + + def fullname(self): + """ + Return the name with the attr name. + + :rtype: str + """ + if self._fullname is None: + self._fullname = '{0}.{1}'.format(self.name(), self.attr()) + return self._fullname + + def value(self): + """ + Return the value of the attribute. + + :rtype: float | str | list + """ + if self._value is None or not self._cache: + + try: + self._value = maya.cmds.getAttr(self.fullname()) + except Exception: + msg = 'Cannot GET attribute VALUE for "{0}"' + msg = msg.format(self.fullname()) + logger.exception(msg) + + return self._value + + def type(self): + """ + Return the type of data currently in the attribute. + + :rtype: str + """ + if self._type is None: + + try: + self._type = maya.cmds.getAttr(self.fullname(), type=True) + self._type = six.text_type(self._type) + except Exception: + msg = 'Cannot GET attribute TYPE for "{0}"' + msg = msg.format(self.fullname()) + logger.exception(msg) + + return self._type + + def set(self, value, blend=100, key=False, clamp=True, additive=False): + """ + Set the value for the attribute. + + :type key: bool + :type clamp: bool + :type value: float | str | list + :type blend: float + """ + try: + if additive and self.type() != 'bool': + if self.attr().startswith('scale'): + value = self.value() * (1 + (value - 1) * (blend/100.0)) + else: + value = self.value() + value * (blend/100.0) + elif int(blend) == 0: + value = self.value() + else: + _value = (value - self.value()) * (blend/100.00) + value = self.value() + _value + except TypeError as error: + msg = 'Cannot BLEND or ADD attribute {0}: Error: {1}' + msg = msg.format(self.fullname(), error) + logger.debug(msg) + + try: + if self.type() in ["string"]: + maya.cmds.setAttr(self.fullname(), value, type=self.type()) + elif self.type() in ["list", "matrix"]: + maya.cmds.setAttr(self.fullname(), *value, type=self.type()) + else: + maya.cmds.setAttr(self.fullname(), value, clamp=clamp) + except (ValueError, RuntimeError) as error: + msg = "Cannot SET attribute {0}: Error: {1}" + msg = msg.format(self.fullname(), error) + logger.debug(msg) + + try: + if key: + self.setKeyframe(value=value) + except TypeError as error: + msg = 'Cannot KEY attribute {0}: Error: {1}' + msg = msg.format(self.fullname(), error) + logger.debug(msg) + + def setKeyframe(self, value, respectKeyable=True, **kwargs): + """ + Set a keyframe with the given value. + + :value: object + :respectKeyable: bool + :rtype: None + """ + if self.query(minExists=True): + minimum = self.query(minimum=True)[0] + if value < minimum: + value = minimum + + if self.query(maxExists=True): + maximum = self.query(maximum=True)[0] + if value > maximum: + value = maximum + + kwargs.setdefault("value", value) + kwargs.setdefault("respectKeyable", respectKeyable) + + maya.cmds.setKeyframe(self.fullname(), **kwargs) + + def setStaticKeyframe(self, value, time, option): + """ + Set a static keyframe at the given time. + + :type value: object + :type time: (int, int) + :type option: PasteOption + """ + if option == "replaceCompletely": + maya.cmds.cutKey(self.fullname()) + self.set(value, key=False) + + # This should be changed to only look for animation. + # Also will need to support animation layers ect... + elif self.isConnected(): + + # TODO: Should also support static attrs when there is animation. + if option == "replace": + maya.cmds.cutKey(self.fullname(), time=time) + self.insertStaticKeyframe(value, time) + + elif option == "replace": + self.insertStaticKeyframe(value, time) + + else: + self.set(value, key=False) + + def insertStaticKeyframe(self, value, time): + """ + Insert a static keyframe at the given time with the given value. + + :type value: float | str + :type time: (int, int) + :rtype: None + """ + startTime, endTime = time + duration = endTime - startTime + try: + # Offset all keyframes from the start position. + maya.cmds.keyframe(self.fullname(), relative=True, time=(startTime, 1000000), timeChange=duration) + + # Set a key at the given start and end time + self.setKeyframe(value, time=(startTime, startTime), ott='step') + self.setKeyframe(value, time=(endTime, endTime), itt='flat', ott='flat') + + # Set the tangent for the next keyframe to flat + nextFrame = maya.cmds.findKeyframe(self.fullname(), time=(endTime, endTime), which='next') + maya.cmds.keyTangent(self.fullname(), time=(nextFrame, nextFrame), itt='flat') + except TypeError as error: + msg = "Cannot insert static key frame for attribute {0}: Error: {1}" + msg = msg.format(self.fullname(), error) + logger.debug(msg) + + def setAnimCurve(self, curve, time, option, source=None, connect=False): + """ + Set/Paste the give animation curve to this attribute. + + :type curve: str + :type option: PasteOption + :type time: (int, int) + :type source: (int, int) + :type connect: bool + :rtype: None + """ + fullname = self.fullname() + startTime, endTime = time + + if self.isProxy(): + logger.debug("Cannot set anim curve for proxy attribute") + return + + if not self.exists(): + logger.debug("Attr does not exists") + return + + if self.isLocked(): + logger.debug("Cannot set anim curve when the attr locked") + return + + if source is None: + first = maya.cmds.findKeyframe(curve, which='first') + last = maya.cmds.findKeyframe(curve, which='last') + source = (first, last) + + # We run the copy key command twice to check we have a valid curve. + # It needs to run before the cutKey command, otherwise if it fails + # we have cut keys for no reason! + success = maya.cmds.copyKey(curve, time=source) + if not success: + msg = "Cannot copy keys from the anim curve {0}" + msg = msg.format(curve) + logger.debug(msg) + return + + if option == "replace": + maya.cmds.cutKey(fullname, time=time) + else: + time = (startTime, startTime) + + try: + # Update the clip board with the give animation curve + maya.cmds.copyKey(curve, time=source) + + # Note: If the attribute is connected to referenced + # animation then the following command will not work. + maya.cmds.pasteKey(fullname, option=option, time=time, connect=connect) + + if option == "replaceCompletely": + + # The pasteKey cmd doesn't support all anim attributes + # so we need to manually set theses. + dstCurve = self.animCurve() + if dstCurve: + curveColor = maya.cmds.getAttr(curve + ".curveColor") + preInfinity = maya.cmds.getAttr(curve + ".preInfinity") + postInfinity = maya.cmds.getAttr(curve + ".postInfinity") + useCurveColor = maya.cmds.getAttr(curve + ".useCurveColor") + + maya.cmds.setAttr(dstCurve + ".preInfinity", preInfinity) + maya.cmds.setAttr(dstCurve + ".postInfinity", postInfinity) + maya.cmds.setAttr(dstCurve + ".curveColor", *curveColor[0]) + maya.cmds.setAttr(dstCurve + ".useCurveColor", useCurveColor) + + except RuntimeError: + msg = 'Cannot paste anim curve "{0}" to attribute "{1}"' + msg = msg.format(curve, fullname) + logger.exception(msg) + + def animCurve(self): + """ + Return the connected animation curve. + + :rtype: str | None + """ + result = None + + if self.exists(): + + n = self.listConnections(plugs=True, destination=False) + + if n and "animCurve" in maya.cmds.nodeType(n): + result = n + + elif n and "character" in maya.cmds.nodeType(n): + n = maya.cmds.listConnections(n, plugs=True, + destination=False) + if n and "animCurve" in maya.cmds.nodeType(n): + result = n + + if result: + return result[0].split(".")[0] + + def isConnected(self, ignoreConnections=None): + """ + Return true if the attribute is connected. + + :type ignoreConnections: list[str] + :rtype: bool + """ + if ignoreConnections is None: + ignoreConnections = [] + try: + connection = self.listConnections(destination=False) + except ValueError: + return False + + if connection: + if ignoreConnections: + connectionType = maya.cmds.nodeType(connection) + for ignoreType in ignoreConnections: + if connectionType.startswith(ignoreType): + return False + return True + else: + return False + + def isBlendable(self): + """ + Return true if the attribute can be blended. + + :rtype: bool + """ + return self.type() in VALID_BLEND_ATTRIBUTES + + def isSettable(self, validConnections=None): + """ + Return true if the attribute can be set. + + :type validConnections: list[str] + :rtype: bool + """ + if validConnections is None: + validConnections = VALID_CONNECTIONS + + if not self.exists(): + return False + + if not maya.cmds.listAttr(self.fullname(), unlocked=True, keyable=True, multi=True, scalar=True): + return False + + connection = self.listConnections(destination=False) + if connection: + connectionType = maya.cmds.nodeType(connection) + for validType in validConnections: + if connectionType.startswith(validType): + return True + return False + else: + return True diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/cmds.py b/2023/scripts/animation_tools/studiolibrary/mutils/cmds.py new file mode 100644 index 0000000..d88b9a4 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/mutils/cmds.py @@ -0,0 +1,425 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +import logging +import platform +import traceback + +from studiovendor.Qt import QtCore +from studiovendor.Qt import QtWidgets + +try: + import maya.mel + import maya.cmds +except ImportError: + traceback.print_exc() + +import mutils + + +logger = logging.getLogger(__name__) + + +class MayaUtilsError(Exception): + """Base class for exceptions in this module.""" + + +class ObjectsError(MayaUtilsError): + pass + + +class SelectionError(MayaUtilsError): + pass + + +class NoMatchFoundError(MayaUtilsError): + pass + + +class NoObjectFoundError(MayaUtilsError): + pass + + +class MoreThanOneObjectFoundError(MayaUtilsError): + pass + + +class ModelPanelNotInFocusError(MayaUtilsError): + pass + + +def system(): + """ + Return the current platform in lowercase. + + :rtype: str + """ + return platform.system().lower() + + +def isMac(): + """ + Return True if the current OS is Mac. + + :rtype: bool + """ + return system().startswith("os") or \ + system().startswith("mac") or \ + system().startswith("darwin") + + +def isLinux(): + """ + Return True if the current OS is linux. + + :rtype: bool + """ + return system().lower().startswith("lin") + + +def isWindows(): + """ + Return True if the current OS is windows. + + :rtype: bool + """ + return system().lower().startswith("win") + + +def isMaya(): + """ + Return True if the current python session is in Maya. + + :rtype: bool + """ + try: + import maya.cmds + maya.cmds.about(batch=True) + return True + except ImportError: + return False + + +def selectionModifiers(): + """ + Return a dictionary of the current key modifiers + + :rtype: dict + """ + result = {"add": False, "deselect": False} + modifiers = QtWidgets.QApplication.keyboardModifiers() + + if modifiers == QtCore.Qt.ShiftModifier: + result["deselect"] = True + elif modifiers == QtCore.Qt.ControlModifier: + result["add"] = True + + return result + + +def ls(*args, **kwargs): + """ + List all the node objects for the given options. + + :type args: list + :type kwargs: dict + """ + return [mutils.Node(name) for name in maya.cmds.ls(*args, **kwargs) or []] + + +def listAttr(name, **kwargs): + """ + List all the attributes for the given object name. + + :type name: str + :type kwargs: str + :rtype: list[mutils.Attribute] + """ + attrs = maya.cmds.listAttr(name, **kwargs) or [] + attrs = list(set(attrs)) + return [mutils.Attribute(name, attr) for attr in attrs] + + +def disconnectAll(name): + """ + Disconnect all connections from the given object name. + + :type name: str + """ + plugins = maya.cmds.listConnections(name, plugs=True, source=False) or [] + + for plug in plugins: + source, = maya.cmds.listConnections(plug, plugs=True) + maya.cmds.disconnectAttr(source, plug) + + +def animCurve(fullname): + """ + Return the animation curve name for the give attribute. + + :type fullname: str or None + :rtype: str or None + """ + attribute = mutils.Attribute(fullname) + return attribute.animCurve() + + +def deleteUnknownNodes(): + """Delete all unknown nodes in the Maya scene.""" + nodes = maya.cmds.ls(type="unknown") + if nodes: + for node in nodes: + if maya.cmds.objExists(node) and \ + maya.cmds.referenceQuery(node, inr=True): + maya.cmds.delete(node) + + +def currentModelPanel(): + """ + Get the current model panel name. + + :rtype: str or None + """ + currentPanel = maya.cmds.getPanel(withFocus=True) + currentPanelType = maya.cmds.getPanel(typeOf=currentPanel) + + if currentPanelType not in ['modelPanel']: + return None + + return currentPanel + + +def getBakeAttrs(objects): + """ + Get the attributes that are not connected to an animation curve. + + :type objects: list[str] + :rtype: list[str] + """ + result = [] + + if not objects: + raise Exception("No objects specified") + + connections = maya.cmds.listConnections( + objects, + plugs=True, + source=True, + connections=True, + destination=False + ) or [] + + for i in range(0, len(connections), 2): + dstObj = connections[i] + srcObj = connections[i + 1] + + nodeType = maya.cmds.nodeType(srcObj) + + if "animCurve" not in nodeType: + result.append(dstObj) + + return result + + +def bakeConnected(objects, time, sampleBy=1): + """ + Bake the given objects. + + :type objects: list[str] + :type time: (int, int) + :type sampleBy: int + """ + bakeAttrs = getBakeAttrs(objects) + + if bakeAttrs: + maya.cmds.bakeResults( + bakeAttrs, + time=time, + shape=False, + simulation=True, + sampleBy=sampleBy, + controlPoints=False, + minimizeRotation=True, + bakeOnOverrideLayer=False, + preserveOutsideKeys=False, + sparseAnimCurveBake=False, + disableImplicitControl=True, + removeBakedAttributeFromLayer=False, + ) + else: + logger.error("Cannot find any connection to bake!") + + +def getSelectedObjects(): + """ + Get a list of the selected objects in Maya. + + :rtype: list[str] + :raises: mutils.SelectionError: + """ + selection = maya.cmds.ls(selection=True) + if not selection: + raise mutils.SelectionError("No objects selected!") + return selection + + +def getSelectedAttrs(): + """ + Get the attributes that are selected in the channel box. + + :rtype: list[str] + """ + attributes = maya.cmds.channelBox( + "mainChannelBox", + query=True, + selectedMainAttributes=True + ) + + if attributes is not None: + attributes = str(attributes) + attributes = attributes.replace("tx", "translateX") + attributes = attributes.replace("ty", "translateY") + attributes = attributes.replace("tz", "translateZ") + attributes = attributes.replace("rx", "rotateX") + attributes = attributes.replace("ry", "rotateY") + attributes = attributes.replace("rz", "rotateZ") + attributes = eval(attributes) + + return attributes + + +def currentFrameRange(): + """ + Get the current first and last frame depending on the context. + + :rtype: (int, int) + """ + start, end = selectedFrameRange() + + if end == start: + start, end = selectedObjectsFrameRange() + + if start == end: + start, end = playbackFrameRange() + + return start, end + + +def playbackFrameRange(): + """ + Get the first and last frame from the play back options. + + :rtype: (int, int) + """ + start = maya.cmds.playbackOptions(query=True, min=True) + end = maya.cmds.playbackOptions(query=True, max=True) + return start, end + + +def selectedFrameRange(): + """ + Get the first and last frame from the play back slider. + + :rtype: (int, int) + """ + result = maya.mel.eval("timeControl -q -range $gPlayBackSlider") + start, end = result.replace('"', "").split(":") + start, end = int(start), int(end) + if end - start == 1: + end = start + return start, end + + +def selectedObjectsFrameRange(objects=None): + """ + Get the first and last animation frame from the given objects. + + :type objects: list[str] + :rtype: (int, int) + """ + start = 0 + end = 0 + + if not objects: + objects = maya.cmds.ls(selection=True) or [] + + if objects: + start = int(maya.cmds.findKeyframe(objects, which='first')) + end = int(maya.cmds.findKeyframe(objects, which='last')) + + return start, end + + +def getDurationFromNodes(objects, time=None): + """ + Get the duration of the animation from the given object names. + + :type time: [str, str] + :type objects: list[str] + :rtype: float + """ + if objects: + + first = maya.cmds.findKeyframe(objects, which='first') + last = maya.cmds.findKeyframe(objects, which='last') + + if time: + startKey = maya.cmds.findKeyframe(objects, time=(time[0], time[0]), which="next") + if startKey > time[1] or startKey < time[0]: + return 0 + + if first == last: + if maya.cmds.keyframe(objects, query=True, keyframeCount=True) > 0: + return 1 + else: + return 0 + + return last - first + else: + return 0 + + +def getReferencePaths(objects, withoutCopyNumber=False): + """ + Get the reference paths for the given objects. + + :type objects: list[str] + :type withoutCopyNumber: bool + :rtype: list[str] + """ + paths = [] + for obj in objects: + if maya.cmds.referenceQuery(obj, isNodeReferenced=True): + paths.append(maya.cmds.referenceQuery(obj, f=True, wcn=withoutCopyNumber)) + + return list(set(paths)) + + +def getReferenceData(objects): + """ + Get the reference paths for the given objects. + + :type objects: list[str] + :rtype: list[dict] + """ + data = [] + paths = getReferencePaths(objects) + + for path in paths: + data.append({ + "filename": path, + "unresolved": maya.cmds.referenceQuery(path, filename=True, withoutCopyNumber=True), + "namespace": maya.cmds.file(path, q=True, namespace=True), + "node": maya.cmds.referenceQuery(path, referenceNode=True) + }) + + return data diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/decorators.py b/2023/scripts/animation_tools/studiolibrary/mutils/decorators.py new file mode 100644 index 0000000..8e15a79 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/mutils/decorators.py @@ -0,0 +1,166 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +import time +import logging + +try: + import maya.cmds +except ImportError: + import traceback + traceback.print_exc() + + +logger = logging.getLogger(__name__) + + +__all__ = [ + "timing", + "unifyUndo", + "disableUndo", + "disableViews", + "disableAutoKey", + "showWaitCursor", + "restoreSelection", + "restoreCurrentTime", +] + + +def timing(fn): + + def wrapped(*args, **kwargs): + time1 = time.time() + ret = fn(*args, **kwargs) + time2 = time.time() + logger.debug('%s function took %0.5f sec' % (fn.__name__, (time2 - time1))) + return ret + + return wrapped + + +def unifyUndo(fn): + + def wrapped(*args, **kwargs): + maya.cmds.undoInfo(openChunk=True) + try: + return fn(*args, **kwargs) + finally: + maya.cmds.undoInfo(closeChunk=True) + + wrapped.__name__ = fn.__name__ + wrapped.__doc__ = fn.__doc__ + + return wrapped + + +def disableUndo(fn): + + def wrapped(*args, **kwargs): + initialUndoState = maya.cmds.undoInfo(q=True, state=True) + maya.cmds.undoInfo(stateWithoutFlush=False) + try: + return fn(*args, **kwargs) + finally: + maya.cmds.undoInfo(stateWithoutFlush=initialUndoState) + + wrapped.__name__ = fn.__name__ + wrapped.__doc__ = fn.__doc__ + + return wrapped + + +def disableAutoKey(fn): + + def wrapped(*args, **kwargs): + initialState = maya.cmds.autoKeyframe(query=True, state=True) + maya.cmds.autoKeyframe(edit=True, state=False) + try: + return fn(*args, **kwargs) + finally: + maya.cmds.autoKeyframe(edit=True, state=initialState) + + wrapped.__name__ = fn.__name__ + wrapped.__doc__ = fn.__doc__ + + return wrapped + + +def restoreSelection(fn): + + def wrapped(*args, **kwargs): + selection = maya.cmds.ls(selection=True) or [] + try: + return fn(*args, **kwargs) + finally: + if selection: + maya.cmds.select(selection) + + wrapped.__name__ = fn.__name__ + wrapped.__doc__ = fn.__doc__ + + return wrapped + + +def restoreCurrentTime(fn): + + def wrapped(*args, **kwargs): + initialTime = maya.cmds.currentTime(query=True) + try: + return fn(*args, **kwargs) + finally: + maya.cmds.currentTime(initialTime, edit=True) + + wrapped.__name__ = fn.__name__ + wrapped.__doc__ = fn.__doc__ + + return wrapped + + +def showWaitCursor(fn): + + def wrapped(*args, **kwargs): + maya.cmds.waitCursor(state=True) + try: + return fn(*args, **kwargs) + finally: + maya.cmds.waitCursor(state=False) + + wrapped.__name__ = fn.__name__ + wrapped.__doc__ = fn.__doc__ + + return wrapped + + +def disableViews(fn): + + def wrapped(*args, **kwargs): + modelPanels = maya.cmds.getPanel(vis=True) + emptySelConn = maya.cmds.selectionConnection() + + for panel in modelPanels: + if maya.cmds.getPanel(to=panel) == 'modelPanel': + maya.cmds.isolateSelect(panel, state=True) + maya.cmds.modelEditor(panel, e=True, mlc=emptySelConn) + + try: + return fn(*args, **kwargs) + finally: + for panel in modelPanels: + if maya.cmds.getPanel(to=panel) == 'modelPanel': + maya.cmds.isolateSelect(panel, state=False) + + maya.cmds.deleteUI(emptySelConn) + + wrapped.__name__ = fn.__name__ + wrapped.__doc__ = fn.__doc__ + + return wrapped diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/gui/__init__.py b/2023/scripts/animation_tools/studiolibrary/mutils/gui/__init__.py new file mode 100644 index 0000000..7cf2579 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/mutils/gui/__init__.py @@ -0,0 +1,52 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +from studiovendor.Qt import QtCore +from studiovendor.Qt import QtCompat +from studiovendor.Qt import QtWidgets + +try: + import maya.OpenMayaUI as omui +except ImportError as error: + print(error) + +from .framerangemenu import FrameRangeMenu +from .framerangemenu import showFrameRangeMenu +from .modelpanelwidget import ModelPanelWidget +from .thumbnailcapturedialog import * +from .thumbnailcapturemenu import ThumbnailCaptureMenu + + +def mayaWindow(): + """ + Return the Maya main window as a QMainWindow object. + + :rtype: QMainWindow + """ + mainWindowPtr = omui.MQtUtil.mainWindow() + return QtCompat.wrapInstance(mainWindowPtr, QtWidgets.QMainWindow) + + +def makeMayaStandaloneWindow(w): + """ + Make a standalone window, though parented under Maya's mainWindow. + + The parenting under Maya's mainWindow is done so that the QWidget will + not auto-destroy itself when the instance variable goes out of scope. + """ + # Parent under the main Maya window + w.setParent(mayaWindow()) + + # Make this widget appear as a standalone window + w.setWindowFlags(QtCore.Qt.Window) + w.raise_() + w.show() diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/gui/framerangemenu.py b/2023/scripts/animation_tools/studiolibrary/mutils/gui/framerangemenu.py new file mode 100644 index 0000000..f35778f --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/mutils/gui/framerangemenu.py @@ -0,0 +1,67 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +from studiovendor.Qt import QtGui +from studiovendor.Qt import QtWidgets + +import mutils + + +__all__ = ["FrameRangeMenu", "showFrameRangeMenu"] + + +class FrameRangeAction(QtWidgets.QAction): + def __init__(self, *args): + super(FrameRangeAction, self).__init__(*args) + + self._frameRange = (0, 100) + + def frameRange(self): + return self._frameRange + + def setFrameRange(self, frameRange): + self._frameRange = frameRange + + +class FrameRangeMenu(QtWidgets.QMenu): + + def __init__(self, parent=None): + super(FrameRangeMenu, self).__init__(parent) + + action = FrameRangeAction("From Timeline", self) + action.setFrameRange(mutils.playbackFrameRange()) + self.addAction(action) + + action = FrameRangeAction("From Selected Timeline", self) + action.setFrameRange(mutils.selectedFrameRange()) + self.addAction(action) + + action = FrameRangeAction("From Selected Objects", self) + action.setFrameRange(mutils.selectedObjectsFrameRange()) + self.addAction(action) + + +def showFrameRangeMenu(): + """ + Show the frame range menu at the current cursor position. + + :rtype: QtWidgets.QAction + """ + menu = FrameRangeMenu() + position = QtGui.QCursor().pos() + action = menu.exec_(position) + return action + + +if __name__ == "__main__": + action = showFrameRangeMenu() + print(action.frameRange()) diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/gui/modelpanelwidget.py b/2023/scripts/animation_tools/studiolibrary/mutils/gui/modelpanelwidget.py new file mode 100644 index 0000000..8bb8e8c --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/mutils/gui/modelpanelwidget.py @@ -0,0 +1,100 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +import mutils +import mutils.gui + +from studiovendor.Qt import QtCore +from studiovendor.Qt import QtWidgets + +try: + import maya.cmds + import maya.OpenMayaUI as mui + isMaya = True +except ImportError: + isMaya = False + + +__all__ = ["ModelPanelWidget"] + + +class ModelPanelWidget(QtWidgets.QWidget): + + def __init__(self, parent, name="capturedModelPanel", **kwargs): + super(ModelPanelWidget, self).__init__(parent, **kwargs) + + uniqueName = name + str(id(self)) + self.setObjectName(uniqueName + 'Widget') + + layout = QtWidgets.QVBoxLayout() + layout.setContentsMargins(0, 0, 0, 0) + layout.setObjectName(uniqueName + "Layout") + self.setLayout(layout) + + maya.cmds.setParent(layout.objectName()) + self._modelPanel = maya.cmds.modelPanel(uniqueName, label="ModelPanel") + self.setModelPanelOptions() + + def setModelPanelOptions(self): + + modelPanel = self.name() + + maya.cmds.modelEditor(modelPanel, edit=True, allObjects=False) + maya.cmds.modelEditor(modelPanel, edit=True, grid=False) + maya.cmds.modelEditor(modelPanel, edit=True, dynamics=False) + maya.cmds.modelEditor(modelPanel, edit=True, activeOnly=False) + maya.cmds.modelEditor(modelPanel, edit=True, manipulators=False) + maya.cmds.modelEditor(modelPanel, edit=True, headsUpDisplay=False) + maya.cmds.modelEditor(modelPanel, edit=True, selectionHiliteDisplay=False) + + maya.cmds.modelEditor(modelPanel, edit=True, polymeshes=True) + maya.cmds.modelEditor(modelPanel, edit=True, nurbsSurfaces=True) + maya.cmds.modelEditor(modelPanel, edit=True, subdivSurfaces=True) + maya.cmds.modelEditor(modelPanel, edit=True, displayTextures=True) + maya.cmds.modelEditor(modelPanel, edit=True, displayAppearance="smoothShaded") + + currentModelPanel = mutils.currentModelPanel() + + if currentModelPanel: + camera = maya.cmds.modelEditor(currentModelPanel, query=True, camera=True) + displayLights = maya.cmds.modelEditor(currentModelPanel, query=True, displayLights=True) + displayTextures = maya.cmds.modelEditor(currentModelPanel, query=True, displayTextures=True) + + maya.cmds.modelEditor(modelPanel, edit=True, camera=camera) + maya.cmds.modelEditor(modelPanel, edit=True, displayLights=displayLights) + maya.cmds.modelEditor(modelPanel, edit=True, displayTextures=displayTextures) + + def name(self): + return self._modelPanel + + def modelPanel(self): + ptr = mui.MQtUtil.findControl(self._modelPanel) + return mutils.gui.wrapInstance(ptr, QtWidgets.QWidget) + + def barLayout(self): + name = maya.cmds.modelPanel(self._modelPanel, query=True, barLayout=True) + ptr = mui.MQtUtil.findControl(name) + return mutils.gui.wrapInstance(ptr, QtCore.QObject) + + def hideBarLayout(self): + self.barLayout().hide() + + def hideMenuBar(self): + maya.cmds.modelPanel(self._modelPanel, edit=True, menuBarVisible=False) + + def setCamera(self, name): + maya.cmds.modelPanel(self._modelPanel, edit=True, cam=name) + + +if __name__ == "__main__": + widget = ModelPanelWidget(None, "modelPanel") + widget.show() diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/gui/thumbnailcapturedialog.py b/2023/scripts/animation_tools/studiolibrary/mutils/gui/thumbnailcapturedialog.py new file mode 100644 index 0000000..0be4dfd --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/mutils/gui/thumbnailcapturedialog.py @@ -0,0 +1,290 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . +""" +The capture dialog is used for creating thumbnails and thumbnail playblasts. + +import mutils.gui +print mutils.gui.capture("c:/temp/test.jpg", startFrame=1, endFrame=100) +# c:/temp/test.0001.jpg +""" + +import os +import shutil + +from studiovendor.Qt import QtGui +from studiovendor.Qt import QtCore +from studiovendor.Qt import QtWidgets + +try: + import maya.cmds +except Exception: + import traceback + traceback.print_exc() + +import studioqt + +import mutils.gui +import mutils.gui.modelpanelwidget + + +__all__ = [ + "thumbnailCapture", + "ThumbnailCaptureDialog", + ] + + +_instance = None + + +def thumbnailCapture( + path, + startFrame=None, + endFrame=None, + step=1, + clearCache=False, + captured=None, + show=False, + modifier=True, +): + """ + Capture a playblast and save it to the given path. + + :type path: str + :type startFrame: int or None + :type endFrame: int or None + :type step: int + :type clearCache: bool + :type captured: func or None + :rtype: ThumbnailCaptureDialog + """ + + global _instance + + def _clearCache(): + dirname = os.path.dirname(path) + if os.path.exists(dirname): + shutil.rmtree(dirname) + + if _instance: + _instance.close() + + d = mutils.gui.ThumbnailCaptureDialog( + path=path, + startFrame=startFrame, + endFrame=endFrame, + step=step, + ) + + if captured: + d.captured.connect(captured) + + if clearCache: + d.capturing.connect(_clearCache) + + d.show() + + if not show and not (modifier and studioqt.isControlModifier()): + d.capture() + d.close() + + _instance = d + + return _instance + + +class ThumbnailCaptureDialog(QtWidgets.QDialog): + + DEFAULT_WIDTH = 250 + DEFAULT_HEIGHT = 250 + + captured = QtCore.Signal(str) + capturing = QtCore.Signal(str) + + def __init__(self, path="", parent=None, startFrame=None, endFrame=None, step=1): + """ + :type path: str + :type parent: QtWidgets.QWidget + :type startFrame: int + :type endFrame: int + :type step: int + """ + parent = parent or mutils.gui.mayaWindow() + + QtWidgets.QDialog.__init__(self, parent) + + self._path = path + self._step = step + self._endFrame = None + self._startFrame = None + self._capturedPath = None + + if endFrame is None: + endFrame = int(maya.cmds.currentTime(query=True)) + + if startFrame is None: + startFrame = int(maya.cmds.currentTime(query=True)) + + self.setEndFrame(endFrame) + self.setStartFrame(startFrame) + + self.setObjectName("CaptureWindow") + self.setWindowTitle("Capture Window") + + self._captureButton = QtWidgets.QPushButton("Capture") + self._captureButton.clicked.connect(self.capture) + + self._modelPanelWidget = mutils.gui.modelpanelwidget.ModelPanelWidget(self) + + vbox = QtWidgets.QVBoxLayout() + vbox.setObjectName(self.objectName() + "Layout") + vbox.addWidget(self._modelPanelWidget) + vbox.addWidget(self._captureButton) + + self.setLayout(vbox) + + width = (self.DEFAULT_WIDTH * 1.5) + height = (self.DEFAULT_HEIGHT * 1.5) + 50 + + self.setWidthHeight(width, height) + self.centerWindow() + + def path(self): + """ + Return the destination path. + + :rtype: str + """ + return self._path + + def setPath(self, path): + """ + Set the destination path. + + :type path: str + """ + self._path = path + + def endFrame(self): + """ + Return the end frame of the playblast. + + :rtype: int + """ + return self._endFrame + + def setEndFrame(self, endFrame): + """ + Specify the end frame of the playblast. + + :type endFrame: int + """ + self._endFrame = int(endFrame) + + def startFrame(self): + """ + Return the start frame of the playblast. + + :rtype: int + """ + return self._startFrame + + def setStartFrame(self, startFrame): + """ + Specify the start frame of the playblast. + + :type startFrame: int + """ + self._startFrame = int(startFrame) + + def step(self): + """ + Return the step amount of the playblast. + + Example: + if step is set to 2 it will playblast every second frame. + + :rtype: int + """ + return self._step + + def setStep(self, step): + """ + Set the step amount of the playblast. + + :type step: int + """ + self._step = step + + def setWidthHeight(self, width, height): + """ + Set the width and height of the window. + + :type width: int + :type height: int + :rtype: None + """ + x = self.geometry().x() + y = self.geometry().y() + self.setGeometry(x, y, width, height) + + def centerWindow(self): + """ + Center the widget to the center of the desktop. + + :rtype: None + """ + geometry = self.frameGeometry() + pos = QtGui.QCursor.pos() + screen = QtWidgets.QApplication.screenAt(pos) + centerPoint = screen.availableGeometry().center() + geometry.moveCenter(centerPoint) + self.move(geometry.topLeft()) + + def capturedPath(self): + """ + Return the location of the captured playblast. + + :rtype: + """ + return self._capturedPath + + def capture(self): + """ + Capture a playblast and save it to the given path. + + :rtype: None + """ + path = self.path() + + self.capturing.emit(path) + + modelPanel = self._modelPanelWidget.name() + startFrame = self.startFrame() + endFrame = self.endFrame() + step = self.step() + width = self.DEFAULT_WIDTH + height = self.DEFAULT_HEIGHT + + self._capturedPath = mutils.playblast.playblast( + path, + modelPanel, + startFrame, + endFrame, + width, + height, + step=step, + ) + + self.accept() + + self.captured.emit(self._capturedPath) + return self._capturedPath diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/gui/thumbnailcapturemenu.py b/2023/scripts/animation_tools/studiolibrary/mutils/gui/thumbnailcapturemenu.py new file mode 100644 index 0000000..f87487a --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/mutils/gui/thumbnailcapturemenu.py @@ -0,0 +1,149 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +import os +import shutil +import logging + +from studiovendor.Qt import QtGui +from studiovendor.Qt import QtCore +from studiovendor.Qt import QtWidgets + +import mutils.gui + +import studiolibrary.widgets + + +__all__ = [ + "ThumbnailCaptureMenu", + "testThumbnailCaptureMenu" +] + + +logger = logging.getLogger(__name__) + + +class ThumbnailCaptureMenu(QtWidgets.QMenu): + + captured = QtCore.Signal(str) + + def __init__(self, path, force=False, parent=None): + """ + Thumbnail capture menu. + + :type path: str + :type force: bool + :type parent: None or QtWidgets.QWidget + """ + QtWidgets.QMenu.__init__(self, parent) + + self._path = path + self._force = force + + changeImageAction = QtWidgets.QAction('Capture new image', self) + changeImageAction.triggered.connect(self.capture) + self.addAction(changeImageAction) + + changeImageAction = QtWidgets.QAction('Show Capture window', self) + changeImageAction.triggered.connect(self.showCaptureWindow) + self.addAction(changeImageAction) + + loadImageAction = QtWidgets.QAction('Load image from disk', self) + loadImageAction.triggered.connect(self.showLoadImageDialog) + self.addAction(loadImageAction) + + def path(self): + """ + Return the thumbnail path on disc. + + :rtype: str + """ + return self._path + + def showWarningDialog(self): + """Show a warning dialog for overriding the previous thumbnail.""" + title = "Override Thumbnail" + + text = u"This action will delete the previous thumbnail. The " \ + u"previous image cannot be backed up. Do you want to " \ + u"confirm the action to take a new image and delete " \ + u"the previous one?" + + clickedButton = studiolibrary.widgets.MessageBox.warning( + self.parent(), + title=title, + text=text, + enableDontShowCheckBox=True, + ) + + if clickedButton != QtWidgets.QDialogButtonBox.StandardButton.Yes: + raise Exception("Dialog was canceled!") + + def showCaptureWindow(self): + """Show the capture window for framing.""" + self.capture(show=True) + + def capture(self, show=False): + """ + Capture an image from the Maya viewport. + + :type show: bool + """ + if not self._force and os.path.exists(self.path()): + self.showWarningDialog() + + mutils.gui.thumbnailCapture( + show=show, + path=self.path(), + captured=self.captured.emit + ) + + def showLoadImageDialog(self): + """Show a file dialog for choosing an image from disc.""" + if not self._force and os.path.exists(self.path()): + self.showWarningDialog() + + fileDialog = QtWidgets.QFileDialog( + self, + caption="Open Image", + filter="Image Files (*.png *.jpg *.bmp)" + ) + + fileDialog.fileSelected.connect(self._fileSelected) + fileDialog.exec_() + + def _fileSelected(self, path): + """ + Triggered when the file dialog is accepted. + + :type path: str + """ + shutil.copy(path, self.path()) + self.captured.emit(self.path()) + + +def testThumbnailCaptureMenu(): + """A method for testing the thumbnail capture menu in Maya.""" + + def capturedCallback(path): + """ + Triggered when the captured menu has been accepted. + + :type path: str + """ + print("Captured thumbnail to:", path) + + path = "c:/tmp/test.png" + + menu = ThumbnailCaptureMenu(path, True) + menu.captured.connect(capturedCallback) + menu.exec_(QtGui.QCursor.pos()) diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/matchnames.py b/2023/scripts/animation_tools/studiolibrary/mutils/matchnames.py new file mode 100644 index 0000000..4eb66ee --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/mutils/matchnames.py @@ -0,0 +1,174 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +import logging + +import mutils +from collections import OrderedDict + +__all__ = [ + "matchNames", + "groupObjects", +] + + +logger = logging.getLogger(__name__) + + +def rotateSequence(seq, current): + """ + :type seq: + :type current: + :rtype: + """ + n = len(seq) + for i in range(n): + yield seq[(i + current) % n] + + +def groupObjects(objects): + """ + :type objects: + :rtype: + """ + results = OrderedDict() + for name in objects: + node = mutils.Node(name) + results.setdefault(node.namespace(), []) + results[node.namespace()].append(name) + results = OrderedDict(sorted(results.items(), key=lambda t: (t[0].count(":"), len(t[0])))) + return results + + +def indexObjects(objects): + """ + :type objects: list[str] + :rtype: dict + """ + result = {} + if objects: + for name in objects: + node = mutils.Node(name) + result.setdefault(node.shortname(), []) + result[node.shortname()].append(node) + return result + + +def matchInIndex(node, index): + """ + :type node: mutils.Node + :type index: dict[list[mutils.Node]] + :rtype: Node + """ + result = None + if node.shortname() in index: + nodes = index[node.shortname()] + if nodes: + for n in nodes: + if node.name().endswith(n.name()) or n.name().endswith(node.name()): + result = n + break + if result is not None: + index[node.shortname()].remove(result) + + return result + + +def matchNames(srcObjects, dstObjects=None, dstNamespaces=None, search=None, replace=None): + """ + :type srcObjects: list[str] + :type dstObjects: list[str] + :type dstNamespaces: list[str] + :rtype: list[(mutils.Node, mutils.Node)] + """ + results = [] + if dstObjects is None: + dstObjects = [] + + srcGroup = groupObjects(srcObjects) + srcNamespaces = srcGroup.keys() + + if not dstObjects and not dstNamespaces: # and not selection: + dstNamespaces = srcNamespaces + + if not dstNamespaces and dstObjects: + dstGroup = groupObjects(dstObjects) + dstNamespaces = dstGroup.keys() + + dstIndex = indexObjects(dstObjects) + # DESTINATION NAMESPACES NOT IN SOURCE OBJECTS + dstNamespaces2 = [x for x in dstNamespaces if x not in srcNamespaces] + + # DESTINATION NAMESPACES IN SOURCE OBJECTS + dstNamespaces1 = [x for x in dstNamespaces if x not in dstNamespaces2] + + # CACHE DESTINATION OBJECTS WITH NAMESPACES IN SOURCE OBJECTS + usedNamespaces = [] + notUsedNamespaces = [] + + # FIRST LOOP THROUGH ALL DESTINATION NAMESPACES IN SOURCE OBJECTS + for srcNamespace in srcNamespaces: + if srcNamespace in dstNamespaces1: + usedNamespaces.append(srcNamespace) + for name in srcGroup[srcNamespace]: + + srcNode = mutils.Node(name) + + if search is not None and replace is not None: + # Using the mirror table which supports * style replacing + name = mutils.MirrorTable.replace(name, search, replace) + + dstNode = mutils.Node(name) + + if dstObjects: + dstNode = matchInIndex(dstNode, dstIndex) + if dstNode: + results.append((srcNode, dstNode)) + yield (srcNode, dstNode) + else: + logger.debug("Cannot find matching destination object for %s" % srcNode.name()) + else: + notUsedNamespaces.append(srcNamespace) + + # SECOND LOOP THROUGH ALL OTHER DESTINATION NAMESPACES + srcNamespaces = notUsedNamespaces + srcNamespaces.extend(usedNamespaces) + _index = 0 + for dstNamespace in dstNamespaces2: + match = False + i = _index + for srcNamespace in rotateSequence(srcNamespaces, _index): + if match: + _index = i + break + i += 1 + for name in srcGroup[srcNamespace]: + srcNode = mutils.Node(name) + dstNode = mutils.Node(name) + dstNode.setNamespace(dstNamespace) + + if dstObjects: + dstNode = matchInIndex(dstNode, dstIndex) + elif dstNamespaces: + pass + + if dstNode: + match = True + results.append((srcNode, dstNode)) + yield (srcNode, dstNode) + else: + logger.debug("Cannot find matching destination object for %s" % srcNode.name()) + + if logger.parent.level == logging.DEBUG or logger.level == logging.DEBUG: + for dstNodes in dstIndex.values(): + for dstNode in dstNodes: + logger.debug("Cannot find matching source object for %s" % dstNode.name()) diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/mirrortable.py b/2023/scripts/animation_tools/studiolibrary/mutils/mirrortable.py new file mode 100644 index 0000000..c4daedc --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/mutils/mirrortable.py @@ -0,0 +1,918 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . +""" +# mirrortable.py + +import mutils + +# Example 1: +# Create a MirrorTable instance from the given objects +mt = mutils.MirrorTable.fromObjects(objects, "_l_", "_r_", MirrorPlane.YZ) + +# Example 2: +# Create a MirrorTable instance from the selected objects +objects = maya.cmds.ls(selection=True) +mt = mutils.MirrorTable.fromObjects(objects, "_l_", "_r_", MirrorPlane.YZ) + +# Example 3: +# Save the MirrorTable to the given JSON path +path = "/tmp/mirrortable.json" +mt.save(path) + +# Example 4: +# Create a MirrorTable instance from the given JSON path +path = "/tmp/mirrortable.json" +mt = mutils.MirrorTable.fromPath(path) + +# Example 5: +# Mirror all the objects from file +mt.load() + +# Example 6: +# Mirror only the selected objects +objects = maya.cmds.ls(selection=True) or [] +mt.load(objects=objects) + +# Example 7: +# Mirror all objects from file to the given namespaces +mt.load(namespaces=["character1", "character2"]) + +# Example 8: +# Mirror only the given objects +mt.load(objects=["character1:Hand_L", "character1:Finger_L"]) + +# Example 9: +# Mirror all objects from left to right +mt.load(option=mutils.MirrorOption.LeftToRight) + +# Example 10: +# Mirror all objects from right to left +mt.load(option=mutils.MirrorOption.RightToLeft) + +# Example 11: +# Mirror only the current pose +mt.load(animation=False) +""" + +import re +import mutils +import logging +import traceback + +from studiovendor import six + +try: + import maya.cmds +except ImportError: + traceback.print_exc() + + +__all__ = [ + "MirrorTable", + "MirrorPlane", + "MirrorOption", + "saveMirrorTable", +] + + +logger = logging.getLogger(__name__) + + +RE_LEFT_SIDE = "Left|left|Lf|lt_|_lt|lf_|_lf|_l_|_L|L_|:l_|^l_|_l$|:L|^L" +RE_RIGHT_SIDE = "Right|right|Rt|rt_|_rt|_r_|_R|R_|:r_|^r_|_r$|:R|^R" + +VALID_NODE_TYPES = ["joint", "transform"] + + +class MirrorPlane: + YZ = [-1, 1, 1] + XZ = [1, -1, 1] + XY = [1, 1, -1] + + +class MirrorOption: + Swap = 0 + LeftToRight = 1 + RightToLeft = 2 + + +class KeysOption: + All = "All Keys" + SelectedRange = "Selected Range" + + +def saveMirrorTable(path, objects, metadata=None, *args, **kwargs): + """ + Convenience function for saving a mirror table to the given disc location. + + :type path: str + :type objects: list[str] + :type metadata: dict or None + :type args: list + :type kwargs: dict + :rtype: MirrorTable + """ + mirrorTable = MirrorTable.fromObjects(objects, *args, **kwargs) + + if metadata: + mirrorTable.updateMetadata(metadata) + + mirrorTable.save(path) + + return mirrorTable + + +class MirrorTable(mutils.TransferObject): + + @classmethod + @mutils.timing + @mutils.unifyUndo + @mutils.showWaitCursor + @mutils.restoreSelection + def fromObjects( + cls, + objects, + leftSide=None, + rightSide=None, + mirrorPlane=None + ): + """ + Create a new Mirror Table instance from the given Maya object/controls. + + :type objects: list[str] + :type leftSide: str + :type rightSide: str + :type mirrorPlane: mirrortable.MirrorPlane or str + + :rtype: MirrorTable + """ + mirrorPlane = mirrorPlane or MirrorPlane.YZ + + if isinstance(mirrorPlane, six.string_types): + + if mirrorPlane.lower() == "yz": + mirrorPlane = MirrorPlane.YZ + + elif mirrorPlane.lower() == "xz": + mirrorPlane = MirrorPlane.XZ + + elif mirrorPlane.lower() == "xy": + mirrorPlane = MirrorPlane.XY + + mirrorTable = cls() + mirrorTable.setMetadata("left", leftSide) + mirrorTable.setMetadata("right", rightSide) + mirrorTable.setMetadata("mirrorPlane", mirrorPlane) + + for obj in objects: + nodeType = maya.cmds.nodeType(obj) + if nodeType in VALID_NODE_TYPES: + mirrorTable.add(obj) + else: + msg = "Node of type {0} is not supported. Node name: {1}" + msg = msg.format(nodeType, obj) + logger.info(msg) + + return mirrorTable + + @staticmethod + def findLeftSide(objects): + """ + Return the left side naming convention for the given objects + + :type objects: list[str] + :rtype: str + """ + return MirrorTable.findSide(objects, RE_LEFT_SIDE) + + @staticmethod + def findRightSide(objects): + """ + Return the right side naming convention for the given objects + + :type objects: list[str] + :rtype: str + """ + return MirrorTable.findSide(objects, RE_RIGHT_SIDE) + + @classmethod + def findSide(cls, objects, reSides): + """ + Return the naming convention for the given object names. + + :type objects: list[str] + :type reSides: str or list[str] + :rtype: str + """ + if isinstance(reSides, six.string_types): + reSides = reSides.split("|") + + # Compile the list of regular expressions into a re.object + reSides = [re.compile(side) for side in reSides] + + for obj in objects: + obj = obj.split("|")[-1] + obj = obj.split(":")[-1] + + for reSide in reSides: + + m = reSide.search(obj) + if m: + side = m.group() + + if obj.startswith(side): + side += "*" + + if obj.endswith(side): + side = "*" + side + + return side + + return "" + + @staticmethod + def matchSide(name, side): + """ + Return True if the name contains the given side. + + :type name: str + :type side: str + :rtype: bool + """ + if side: + return MirrorTable.rreplace(name, side, "X") != name + + return False + + @staticmethod + def rreplace(name, old, new): + """ + convenience method. + + Example: + print MirrorTable.rreplace("CHR1:RIG:RhandCON", ":R", ":L") + "CHR1:RIG:LhandCON" + + :type name: str + :type old: str + :type new: str + :rtype: str + """ + names = [] + + for n in name.split("|"): + + namespaces = '' + if ':' in n: + namespaces, n = n.rsplit(':', 1) + + other = mutils.mirrortable.MirrorTable.replace(n, old, new) + + if namespaces: + other = ':'.join([namespaces, other]) + + names.append(other) + + return "|".join(names) + + @staticmethod + def replace(name, old, new): + """ + A static method that is called by self.mirrorObject. + + :type name: str + :type old: str + :type new: str + :rtype: str + """ + # Support for replacing a prefix naming convention. + if old.endswith("*") or new.endswith("*"): + name = MirrorTable.replacePrefix(name, old, new) + + # Support for replacing a suffix naming convention. + elif old.startswith("*") or new.startswith("*"): + name = MirrorTable.replaceSuffix(name, old, new) + + # Support for all other naming conventions. + else: + name = name.replace(old, new) + + return name + + @staticmethod + def replacePrefix(name, old, new): + """ + Replace the given old prefix with the given new prefix. + It should also support long names. + + # Example: + self.replacePrefix("R_footRoll", "R", "L") + # Result: "L_footRoll" and not "L_footLoll". + + self.replacePrefix("Grp|Ch1:R_footExtra|Ch1:R_footRoll", "R_", "L_") + # Result: "Grp|Ch1:L_footExtra|Ch1:L_footRoll" + + :type name: str + :type old: str + :type new: str + :rtype: str + """ + old = old.replace("*", "") + new = new.replace("*", "") + + if name.startswith(old): + name = name.replace(old, new, 1) + + return name + + @staticmethod + def replaceSuffix(name, old, new): + """ + Replace the given old suffix with the given new suffix. + It should also support long names. + + # Example: + self.replaceSuffix("footRoll_R", "R", "L") + # Result: "footRoll_L" and not "footLoll_L". + + self.replaceSuffix("Grp|Ch1:footExtra_R|Ch1:footRoll_R", "_R", "_L") + # Result: "Grp|Ch1:footExtra_L|Ch1:footRoll_L" + + :type name: str + :type old: str + :type new: str + :rtype: str + """ + old = old.replace("*", "") + new = new.replace("*", "") + + if name.endswith(old): + name = name[:-len(old)] + new + + return name + + def mirrorObject(self, obj): + """ + Return the other/opposite side for the given name. + + Example: + print self.mirrorObject("FKSholder_L") + # FKShoulder_R + + :type obj: str + :rtype: str or None + """ + leftSide = self.leftSide() + rightSide = self.rightSide() + return self._mirrorObject(obj, leftSide, rightSide) + + @staticmethod + def _mirrorObject(obj, leftSide, rightSide): + """ + A static method that is called by self.mirrorObject. + + :type obj: str + :rtype: str or None + """ + dstName = MirrorTable.rreplace(obj, leftSide, rightSide) + + if obj == dstName: + dstName = MirrorTable.rreplace(obj, rightSide, leftSide) + + if dstName != obj: + return dstName + + # Return None as the given name is probably a center control + # and doesn't have an opposite side. + return None + + @staticmethod + def animCurve(obj, attr): + """ + :type obj: str + :type attr: str + :rtype: str + """ + fullname = obj + "." + attr + connections = maya.cmds.listConnections(fullname, d=False, s=True) + if connections: + return connections[0] + return None + + @staticmethod + def scaleKey(obj, attr, time=None): + """ + :type obj: str + :type attr: str + """ + curve = MirrorTable.animCurve(obj, attr) + if curve: + maya.cmds.selectKey(curve) + if time: + maya.cmds.scaleKey(time=time, iub=False, ts=1, fs=1, vs=-1, vp=0, animation="keys") + else: + maya.cmds.scaleKey(iub=False, ts=1, fs=1, vs=-1, vp=0, animation="keys") + @staticmethod + def formatValue(attr, value, mirrorAxis): + """ + :type attr: str + :type value: float + :type mirrorAxis: list[int] + :rtype: float + """ + if MirrorTable.isAttrMirrored(attr, mirrorAxis): + return value * -1 + return value + + @staticmethod + def maxIndex(numbers): + """ + Finds the largest number in a list + :type numbers: list[float] or list[str] + :rtype: int + """ + m = 0 + result = 0 + for i in numbers: + v = abs(float(i)) + if v > m: + m = v + result = numbers.index(i) + return result + + @staticmethod + def axisWorldPosition(obj, axis): + """ + :type obj: str + :type axis: list[int] + :rtype: list[float] + """ + transform1 = maya.cmds.createNode("transform", name="transform1") + try: + transform1, = maya.cmds.parent(transform1, obj, r=True) + maya.cmds.setAttr(transform1 + ".t", *axis) + maya.cmds.setAttr(transform1 + ".r", 0, 0, 0) + maya.cmds.setAttr(transform1 + ".s", 1, 1, 1) + return maya.cmds.xform(transform1, q=True, ws=True, piv=True) + finally: + maya.cmds.delete(transform1) + + @staticmethod + def isAttrMirrored(attr, mirrorAxis): + """ + :type attr: str + :type mirrorAxis: list[int] + :rtype: float + """ + if mirrorAxis == [-1, 1, 1]: + if attr == "translateX" or attr == "rotateY" or attr == "rotateZ": + return True + + elif mirrorAxis == [1, -1, 1]: + if attr == "translateY" or attr == "rotateX" or attr == "rotateZ": + return True + + elif mirrorAxis == [1, 1, -1]: + if attr == "translateZ" or attr == "rotateX" or attr == "rotateY": + return True + + elif mirrorAxis == [-1, -1, -1]: + if attr == "translateX" or attr == "translateY" or attr == "translateZ": + return True + return False + + @staticmethod + def isAxisMirrored(srcObj, dstObj, axis, mirrorPlane): + """ + :type srcObj: str + :type dstObj: str + :type axis: list[int] + :type mirrorPlane: list[int] + :rtype: int + """ + old1 = maya.cmds.xform(srcObj, q=True, ws=True, piv=True) + old2 = maya.cmds.xform(dstObj, q=True, ws=True, piv=True) + + new1 = MirrorTable.axisWorldPosition(srcObj, axis) + new2 = MirrorTable.axisWorldPosition(dstObj, axis) + + mp = mirrorPlane + v1 = mp[0]*(new1[0]-old1[0]), mp[1]*(new1[1]-old1[1]), mp[2]*(new1[2]-old1[2]) + v2 = new2[0]-old2[0], new2[1]-old2[1], new2[2]-old2[2] + + d = sum(p*q for p, q in zip(v1, v2)) + + if d >= 0.0: + return False + return True + + @staticmethod + def _calculateMirrorAxis(obj, mirrorPlane): + """ + :type obj: str + :rtype: list[int] + """ + result = [1, 1, 1] + transform0 = maya.cmds.createNode("transform", name="transform0") + + try: + transform0, = maya.cmds.parent(transform0, obj, r=True) + transform0, = maya.cmds.parent(transform0, w=True) + maya.cmds.setAttr(transform0 + ".t", 0, 0, 0) + + t1 = MirrorTable.axisWorldPosition(transform0, [1, 0, 0]) + t2 = MirrorTable.axisWorldPosition(transform0, [0, 1, 0]) + t3 = MirrorTable.axisWorldPosition(transform0, [0, 0, 1]) + + t1 = "%.3f" % t1[0], "%.3f" % t1[1], "%.3f" % t1[2] + t2 = "%.3f" % t2[0], "%.3f" % t2[1], "%.3f" % t2[2] + t3 = "%.3f" % t3[0], "%.3f" % t3[1], "%.3f" % t3[2] + + if mirrorPlane == MirrorPlane.YZ: # [-1, 1, 1]: + x = [t1[0], t2[0], t3[0]] + i = MirrorTable.maxIndex(x) + result[i] = -1 + + if mirrorPlane == MirrorPlane.XZ: # [1, -1, 1]: + y = [t1[1], t2[1], t3[1]] + i = MirrorTable.maxIndex(y) + result[i] = -1 + + if mirrorPlane == MirrorPlane.XY: # [1, 1, -1]: + z = [t1[2], t2[2], t3[2]] + i = MirrorTable.maxIndex(z) + result[i] = -1 + + finally: + maya.cmds.delete(transform0) + + return result + + def select(self, objects=None, namespaces=None, **kwargs): + """ + Select the objects contained in file. + + :type objects: list[str] or None + :type namespaces: list[str] or None + :rtype: None + """ + selectionSet = mutils.SelectionSet.fromPath(self.path()) + selectionSet.load(objects=objects, namespaces=namespaces, **kwargs) + + def leftSide(self): + """ + :rtype: str | None + """ + return self.metadata().get("left") + + def rightSide(self): + """ + :rtype: str | None + """ + return self.metadata().get("right") + + def mirrorPlane(self): + """ + :rtype: lsit[int] | None + """ + return self.metadata().get("mirrorPlane") + + def mirrorAxis(self, name): + """ + :rtype: list[int] + """ + return self.objects()[name]["mirrorAxis"] + + def leftCount(self, objects=None): + """ + :type objects: list[str] + :rtype: int + """ + if objects is None: + objects = self.objects() + return len([obj for obj in objects if self.isLeftSide(obj)]) + + def rightCount(self, objects=None): + """ + :type objects: list[str] + :rtype: int + """ + if objects is None: + objects = self.objects() + return len([obj for obj in objects if self.isRightSide(obj)]) + + def createObjectData(self, name): + """ + :type name: + :rtype: + """ + result = {"mirrorAxis": self.calculateMirrorAxis(name)} + return result + + def matchObjects( + self, + objects=None, + namespaces=None, + ): + """ + :type objects: list[str] + :type namespaces: list[str] + :rtype: list[str] + """ + srcObjects = self.objects().keys() + + matches = mutils.matchNames( + srcObjects=srcObjects, + dstObjects=objects, + dstNamespaces=namespaces, + ) + + for srcNode, dstNode in matches: + dstName = dstNode.name() + mirrorAxis = self.mirrorAxis(srcNode.name()) + yield srcNode.name(), dstName, mirrorAxis + + def rightToLeft(self): + """""" + self.load(option=MirrorOption.RightToLeft) + + def leftToRight(self): + """""" + self.load(option=MirrorOption.LeftToRight) + + @mutils.timing + @mutils.unifyUndo + @mutils.showWaitCursor + @mutils.restoreSelection + def load( + self, + objects=None, + namespaces=None, + option=None, + keysOption=None, + time=None, + ): + """ + Load the mirror table for the given objects. + + :type objects: list[str] + :type namespaces: list[str] + :type option: mirrorOptions + :type keysOption: None or KeysOption.SelectedRange + :type time: None or list[int] + """ + if option and not isinstance(option, int): + if option.lower() == "swap": + option = 0 + elif option.lower() == "left to right": + option = 1 + elif option.lower() == "right to left": + option = 2 + else: + raise ValueError('Invalid load option=' + str(option)) + + self.validate(namespaces=namespaces) + + results = {} + animation = True + foundObject = False + srcObjects = self.objects().keys() + + if option is None: + option = MirrorOption.Swap + + if keysOption == KeysOption.All: + time = None + elif keysOption == KeysOption.SelectedRange: + time = mutils.selectedFrameRange() + + # Check to make sure that the given time is not a single frame + if time and time[0] == time[1]: + time = None + animation = False + + matches = mutils.matchNames( + srcObjects=srcObjects, + dstObjects=objects, + dstNamespaces=namespaces, + ) + + for srcNode, dstNode in matches: + dstObj = dstNode.name() + dstObj2 = self.mirrorObject(dstObj) or dstObj + + if dstObj2 not in results: + results[dstObj] = dstObj2 + + mirrorAxis = self.mirrorAxis(srcNode.name()) + dstObjExists = maya.cmds.objExists(dstObj) + dstObj2Exists = maya.cmds.objExists(dstObj2) + + if dstObjExists and dstObj2Exists: + foundObject = True + if animation: + self.transferAnimation(dstObj, dstObj2, mirrorAxis=mirrorAxis, option=option, time=time) + else: + self.transferStatic(dstObj, dstObj2, mirrorAxis=mirrorAxis, option=option) + else: + if not dstObjExists: + msg = "Cannot find destination object {0}" + msg = msg.format(dstObj) + logger.debug(msg) + + if not dstObj2Exists: + msg = "Cannot find mirrored destination object {0}" + msg = msg.format(dstObj2) + logger.debug(msg) + + # Return the focus to the Maya window + maya.cmds.setFocus("MayaWindow") + + if not foundObject: + + text = "No objects match when loading data. " \ + "Turn on debug mode to see more details." + + raise mutils.NoMatchFoundError(text) + + def transferStatic(self, srcObj, dstObj, mirrorAxis=None, attrs=None, option=MirrorOption.Swap): + """ + :type srcObj: str + :type dstObj: str + :type mirrorAxis: list[int] + :type attrs: None | list[str] + :type option: MirrorOption + """ + srcValue = None + dstValue = None + srcValid = self.isValidMirror(srcObj, option) + dstValid = self.isValidMirror(dstObj, option) + + if attrs is None: + attrs = maya.cmds.listAttr(srcObj, keyable=True) or [] + + for attr in attrs: + dstAttr = dstObj + "." + attr + srcAttr = srcObj + "." + attr + if maya.cmds.objExists(dstAttr): + if dstValid: + srcValue = maya.cmds.getAttr(srcAttr) + + if srcValid: + dstValue = maya.cmds.getAttr(dstAttr) + + if dstValid: + self.setAttr(dstObj, attr, srcValue, mirrorAxis=mirrorAxis) + + if srcValid: + self.setAttr(srcObj, attr, dstValue, mirrorAxis=mirrorAxis) + else: + logger.debug("Cannot find destination attribute %s" % dstAttr) + + def setAttr(self, name, attr, value, mirrorAxis=None): + """ + :type name: str + :type: attr: str + :type: value: int | float + :type mirrorAxis: Axis or None + """ + if mirrorAxis is not None: + value = self.formatValue(attr, value, mirrorAxis) + try: + maya.cmds.setAttr(name + "." + attr, value) + except RuntimeError: + msg = "Cannot mirror static attribute {name}.{attr}" + msg = msg.format(name=name, attr=attr) + logger.debug(msg) + + def transferAnimation(self, srcObj, dstObj, mirrorAxis=None, option=MirrorOption.Swap, time=None): + """ + :type srcObj: str + :type dstObj: str + :type mirrorAxis: Axis or None + """ + srcValid = self.isValidMirror(srcObj, option) + dstValid = self.isValidMirror(dstObj, option) + + tmpObj, = maya.cmds.duplicate(srcObj, name='DELETE_ME', parentOnly=True) + try: + if dstValid: + self._transferAnimation(srcObj, tmpObj, time=time) + if srcValid: + self._transferAnimation(dstObj, srcObj, mirrorAxis=mirrorAxis, time=time) + if dstValid: + self._transferAnimation(tmpObj, dstObj, mirrorAxis=mirrorAxis, time=time) + finally: + maya.cmds.delete(tmpObj) + + def _transferAnimation(self, srcObj, dstObj, attrs=None, mirrorAxis=None, time=None): + """ + :type srcObj: str + :type dstObj: str + :type attrs: list[str] + :type time: list[int] + :type mirrorAxis: list[int] + """ + maya.cmds.cutKey(dstObj, time=time or ()) # remove keys + if maya.cmds.copyKey(srcObj, time=time or ()): + if not time: + maya.cmds.pasteKey(dstObj, option="replaceCompletely") + else: + maya.cmds.pasteKey(dstObj, time=time, option="replace") + + if attrs is None: + attrs = maya.cmds.listAttr(srcObj, keyable=True) or [] + + for attr in attrs: + srcAttribute = mutils.Attribute(srcObj, attr) + dstAttribute = mutils.Attribute(dstObj, attr) + + if dstAttribute.exists(): + if dstAttribute.isConnected(): + if self.isAttrMirrored(attr, mirrorAxis): + maya.cmds.scaleKey(dstAttribute.name(), valueScale=-1, attribute=attr) + else: + value = srcAttribute.value() + self.setAttr(dstObj, attr, value, mirrorAxis) + + def isValidMirror(self, obj, option): + """ + :type obj: str + :type option: MirrorOption + :rtype: bool + """ + if option == MirrorOption.Swap: + return True + + elif option == MirrorOption.LeftToRight and self.isLeftSide(obj): + return False + + elif option == MirrorOption.RightToLeft and self.isRightSide(obj): + return False + + else: + return True + + def isLeftSide(self, name): + """ + Return True if the object contains the left side string. + + # Group|Character1:footRollExtra_L|Character1:footRoll_L + # Group|footRollExtra_L|footRoll_LShape + # footRoll_L + # footRoll_LShape + + :type name: str + :rtype: bool + """ + side = self.leftSide() + return self.matchSide(name, side) + + def isRightSide(self, name): + """ + Return True if the object contains the right side string. + + # Group|Character1:footRollExtra_R|Character1:footRoll_R + # Group|footRollExtra_R|footRoll_RShape + # footRoll_R + # footRoll_RShape + + :type name: str + :rtype: bool + """ + side = self.rightSide() + return self.matchSide(name, side) + + def calculateMirrorAxis(self, srcObj): + """ + :type srcObj: str + :rtype: list[int] + """ + result = [1, 1, 1] + dstObj = self.mirrorObject(srcObj) or srcObj + mirrorPlane = self.mirrorPlane() + + if dstObj == srcObj or not maya.cmds.objExists(dstObj): + # The source object does not have an opposite side + result = MirrorTable._calculateMirrorAxis(srcObj, mirrorPlane) + else: + # The source object does have an opposite side + if MirrorTable.isAxisMirrored(srcObj, dstObj, [1, 0, 0], mirrorPlane): + result[0] = -1 + + if MirrorTable.isAxisMirrored(srcObj, dstObj, [0, 1, 0], mirrorPlane): + result[1] = -1 + + if MirrorTable.isAxisMirrored(srcObj, dstObj, [0, 0, 1], mirrorPlane): + result[2] = -1 + + return result diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/namespace.py b/2023/scripts/animation_tools/studiolibrary/mutils/namespace.py new file mode 100644 index 0000000..1311a7e --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/mutils/namespace.py @@ -0,0 +1,88 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . +import logging +import traceback +from collections import OrderedDict + +try: + import maya.cmds +except ImportError: + traceback.print_exc() + + +logger = logging.getLogger(__name__) + + +__all__ = [ + "getAll", + "getFromDagPath", + "getFromDagPaths", + "getFromSelection", +] + + +def getFromDagPaths(dagPaths): + """ + :type dagPaths: list[str] + :rtype: list[str] + """ + namespaces = [] + + for dagPath in dagPaths: + namespace = getFromDagPath(dagPath) + namespaces.append(namespace) + + # Remove any duplicates while retaining the order + return list(OrderedDict.fromkeys(namespaces)) + + +def getFromDagPath(dagPath): + """ + :type dagPath: str + :rtype: str + """ + shortName = dagPath.split("|")[-1] + namespace = ":".join(shortName.split(":")[:-1]) + return namespace + + +def getFromSelection(): + """ + Get the current namespaces from the selected objects in Maya. + + :rtype: list[str] + """ + namespaces = [""] + + try: + names = maya.cmds.ls(selection=True) + namespaces = getFromDagPaths(names) or namespaces + except NameError as error: + # Catch any errors when running this command outside of Maya + logger.exception(error) + + return namespaces + + +def getAll(): + """ + Get all the available namespaces in the scene + + :rtype: list[str] + """ + IGNORE_NAMESPACES = ['UI', 'shared'] + + namespaces = maya.cmds.namespaceInfo(listOnlyNamespaces=True, recurse=True) + namespaces = list(set(namespaces) - set(IGNORE_NAMESPACES)) + namespaces = sorted(namespaces) + + return namespaces diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/node.py b/2023/scripts/animation_tools/studiolibrary/mutils/node.py new file mode 100644 index 0000000..00854c6 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/mutils/node.py @@ -0,0 +1,178 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +import mutils + +from studiovendor import six + +try: + import maya.cmds +except Exception: + import traceback + traceback.print_exc() + + +class Node(object): + + @classmethod + def ls(cls, objects=None, selection=False): + """ + nodes = Node.ls(selection=True) + :rtype: list[Node] + """ + + if objects is None and not selection: + objects = maya.cmds.ls() + else: + objects = objects or [] + if selection: + objects.extend(maya.cmds.ls(selection=True) or []) + + return [cls(name) for name in objects] + + def __init__(self, name, attributes=None): + """ + :type attributes: [Attribute] + :type name: str + """ + try: + self._name = six.text_type(name) # .encode('ascii') + except UnicodeEncodeError: + raise UnicodeEncodeError('Not a valid ascii name "%s".' % name) + + # Cached properties + self._shortname = None + self._namespace = None + self._mirrorAxis = None + self._attributes = attributes + + def __str__(self): + return self.name() + + def name(self): + """ + :rtype: str + """ + return self._name + + def attributes(self): + """ + :rtype: str + """ + return self._attributes + + def shortname(self): + """ + :rtype: str + """ + if self._shortname is None: + self._shortname = self.name().split("|")[-1] + return self._shortname + + def toShortName(self): + """ + :rtype: None or str + """ + # Try to reduce any long names to short names when using namespaces + names = maya.cmds.ls(self.shortname()) + if len(names) == 1: + return Node(names[0]) + elif len(names) > 1: + # Return the original name if the short name is not unique + return Node(self.name()) + else: + raise mutils.NoObjectFoundError("No object found %s" % str(self.shortname())) + + def namespace(self): + """ + :rtype: str + """ + if self._namespace is None: + self._namespace = ":".join(self.shortname().split(":")[:-1]) + return self._namespace + + def stripFirstPipe(self): + """ + n = Node("|pSphere") + n.stripFirstPipe() + print(n.name()) + # Result: pSphere + """ + if self.name().startswith("|"): + self._name = self.name()[1:] + + def exists(self): + """ + :rtype: bool + """ + return maya.cmds.objExists(self.name()) + + def isLong(self): + """ + :rtype: bool + """ + return "|" in self.name() + + def isReferenced(self): + """ + :rtype: bool + """ + return maya.cmds.referenceQuery(self.name(), isNodeReferenced=True) + + def setMirrorAxis(self, mirrorAxis): + """ + :type mirrorAxis: list[int] + """ + self._mirrorAxis = mirrorAxis + + def setNamespace(self, namespace): + """ + Sets the namespace for a current node in Maya. + + node.setNamespace("character", "|group|control") + result: |character:group|character:control + + setNamespace("", "|character:group|character:control") + result: |group|control + + :type namespace: str + """ + newName = self.name() + oldName = self.name() + + newNamespace = namespace + oldNamespace = self.namespace() + + # Ignore any further processing if the namespace is the same. + if newNamespace == oldNamespace: + return self.name() + + # Replace the current namespace with the specified one + if oldNamespace and newNamespace: + newName = oldName.replace(oldNamespace + ":", newNamespace + ":") + + # Remove existing namespace + elif oldNamespace and not newNamespace: + newName = oldName.replace(oldNamespace + ":", "") + + # Set namespace if the current namespace doesn't exists + elif not oldNamespace and newNamespace: + newName = oldName.replace("|", "|" + newNamespace + ":") + if newNamespace and not newName.startswith("|"): + newName = newNamespace + ":" + newName + + self._name = newName + + self._shortname = None + self._namespace = None + + return self.name() diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/playblast.py b/2023/scripts/animation_tools/studiolibrary/mutils/playblast.py new file mode 100644 index 0000000..bd6065d --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/mutils/playblast.py @@ -0,0 +1,107 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +import os +import logging + +import mutils + +try: + import maya.cmds +except Exception: + import traceback + traceback.print_exc() + + +__all__ = [ + "playblast", +] + +logger = logging.getLogger(__name__) + + +# Valid Renderers: +# [u'vp2Renderer', u'base_OpenGL_Renderer', +# u'hwRender_OpenGL_Renderer', u'stub_Renderer'] +DEFAULT_PLAYBLAST_RENDERER = None + + +class PlayblastError(Exception): + """Base class for exceptions in this module.""" + pass + + +def playblast(filename, modelPanel, startFrame, endFrame, width, height, step=1): + """ + Wrapper for Maya's Playblast command. + + :type filename: str + :type modelPanel: str + :type startFrame: int + :type endFrame: int + :type width: int + :type height: int + :type step: list[int] + :rtype: str + """ + logger.info(u"Playblasting '{filename}'".format(filename=filename)) + + if startFrame == endFrame and os.path.exists(filename): + os.remove(filename) + + frame = [i for i in range(startFrame, endFrame + 1, step)] + + modelPanel = modelPanel or mutils.currentModelPanel() + if maya.cmds.modelPanel(modelPanel, query=True, exists=True): + maya.cmds.setFocus(modelPanel) + if DEFAULT_PLAYBLAST_RENDERER: + maya.cmds.modelEditor( + modelPanel, + edit=True, + rendererName=DEFAULT_PLAYBLAST_RENDERER + ) + + name, compression = os.path.splitext(filename) + filename = filename.replace(compression, "") + compression = compression.replace(".", "") + offScreen = mutils.isLinux() + + path = maya.cmds.playblast( + format="image", + viewer=False, + percent=100, + quality=100, + frame=frame, + width=width, + height=height, + filename=filename, + endTime=endFrame, + startTime=startFrame, + offScreen=offScreen, + forceOverwrite=True, + showOrnaments=False, + compression=compression, + ) + + if not path: + raise PlayblastError("Playblast was canceled") + + src = path.replace("####", str(int(0)).rjust(4, "0")) + + if startFrame == endFrame: + dst = src.replace(".0000.", ".") + logger.info("Renaming '%s' => '%s" % (src, dst)) + os.rename(src, dst) + src = dst + + logger.info(u"Playblasted '%s'" % src) + return src diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/pose.py b/2023/scripts/animation_tools/studiolibrary/mutils/pose.py new file mode 100644 index 0000000..aea6601 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/mutils/pose.py @@ -0,0 +1,591 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . +""" +# +# pose.py +import mutils + +# Example 1: +# Save and load a pose from the selected objects +objects = maya.cmds.ls(selection=True) +mutils.savePose("/tmp/pose.json", objects) + +mutils.loadPose("/tmp/pose.json") + +# Example 2: +# Create a pose object from a list of object names +pose = mutils.Pose.fromObjects(objects) + +# Example 3: +# Create a pose object from the selected objects +objects = maya.cmds.ls(selection=True) +pose = mutils.Pose.fromObjects(objects) + +# Example 4: +# Save the pose object to disc +path = "/tmp/pose.json" +pose.save(path) + +# Example 5: +# Create a pose object from disc +path = "/tmp/pose.json" +pose = mutils.Pose.fromPath(path) + +# Load the pose on to the objects from file +pose.load() + +# Load the pose to the selected objects +objects = maya.cmds.ls(selection=True) +pose.load(objects=objects) + +# Load the pose to the specified namespaces +pose.load(namespaces=["character1", "character2"]) + +# Load the pose to the specified objects +pose.load(objects=["Character1:Hand_L", "Character1:Finger_L"]) + +""" +import logging + +import mutils + +try: + import maya.cmds +except ImportError: + import traceback + traceback.print_exc() + + +__all__ = ["Pose", "savePose", "loadPose"] + +logger = logging.getLogger(__name__) + +_pose_ = None + + +def savePose(path, objects, metadata=None): + """ + Convenience function for saving a pose to disc for the given objects. + + Example: + path = "C:/example.pose" + pose = savePose(path, metadata={'description': 'Example pose'}) + print(pose.metadata()) + # { + 'user': 'Hovel', + 'mayaVersion': '2016', + 'description': 'Example pose' + } + + :type path: str + :type objects: list[str] + :type metadata: dict or None + :rtype: Pose + """ + pose = mutils.Pose.fromObjects(objects) + + if metadata: + pose.updateMetadata(metadata) + + pose.save(path) + + return pose + + +def loadPose(path, *args, **kwargs): + """ + Convenience function for loading the given pose path. + + :type path: str + :type args: list + :type kwargs: dict + :rtype: Pose + """ + global _pose_ + + clearCache = kwargs.get("clearCache") + + if not _pose_ or _pose_.path() != path or clearCache: + _pose_ = Pose.fromPath(path) + + _pose_.load(*args, **kwargs) + + return _pose_ + + +class Pose(mutils.TransferObject): + + def __init__(self): + mutils.TransferObject.__init__(self) + + self._cache = None + self._mtime = None + self._cacheKey = None + self._isLoading = False + self._selection = None + self._mirrorTable = None + self._autoKeyFrame = None + + def createObjectData(self, name): + """ + Create the object data for the given object name. + + :type name: str + :rtype: dict + """ + attrs = maya.cmds.listAttr(name, unlocked=True, keyable=True) or [] + attrs = list(set(attrs)) + attrs = [mutils.Attribute(name, attr) for attr in attrs] + + data = {"attrs": self.attrs(name)} + + for attr in attrs: + if attr.isValid(): + if attr.value() is None: + msg = "Cannot save the attribute %s with value None." + logger.warning(msg, attr.fullname()) + else: + data["attrs"][attr.attr()] = { + "type": attr.type(), + "value": attr.value() + } + + return data + + def select(self, objects=None, namespaces=None, **kwargs): + """ + Select the objects contained in the pose file. + + :type objects: list[str] or None + :type namespaces: list[str] or None + :rtype: None + """ + selectionSet = mutils.SelectionSet.fromPath(self.path()) + selectionSet.load(objects=objects, namespaces=namespaces, **kwargs) + + def cache(self): + """ + Return the current cached attributes for the pose. + + :rtype: list[(Attribute, Attribute)] + """ + return self._cache + + def attrs(self, name): + """ + Return the attribute for the given name. + + :type name: str + :rtype: dict + """ + return self.object(name).get("attrs", {}) + + def attr(self, name, attr): + """ + Return the attribute data for the given name and attribute. + + :type name: str + :type attr: str + :rtype: dict + """ + return self.attrs(name).get(attr, {}) + + def attrType(self, name, attr): + """ + Return the attribute type for the given name and attribute. + + :type name: str + :type attr: str + :rtype: str + """ + return self.attr(name, attr).get("type", None) + + def attrValue(self, name, attr): + """ + Return the attribute value for the given name and attribute. + + :type name: str + :type attr: str + :rtype: str | int | float + """ + return self.attr(name, attr).get("value", None) + + def setMirrorAxis(self, name, mirrorAxis): + """ + Set the mirror axis for the given name. + + :type name: str + :type mirrorAxis: list[int] + """ + if name in self.objects(): + self.object(name).setdefault("mirrorAxis", mirrorAxis) + else: + msg = "Object does not exist in pose. " \ + "Cannot set mirror axis for %s" + + logger.debug(msg, name) + + def mirrorAxis(self, name): + """ + Return the mirror axis for the given name. + + :rtype: list[int] | None + """ + result = None + if name in self.objects(): + result = self.object(name).get("mirrorAxis", None) + + if result is None: + logger.debug("Cannot find mirror axis in pose for %s", name) + + return result + + def updateMirrorAxis(self, name, mirrorAxis): + """ + Update the mirror axis for the given object name. + + :type name: str + :type mirrorAxis: list[int] + """ + self.setMirrorAxis(name, mirrorAxis) + + def mirrorTable(self): + """ + Return the Mirror Table for the pose. + + :rtype: mutils.MirrorTable + """ + return self._mirrorTable + + def setMirrorTable(self, mirrorTable): + """ + Set the Mirror Table for the pose. + + :type mirrorTable: mutils.MirrorTable + """ + objects = self.objects().keys() + self._mirrorTable = mirrorTable + + for srcName, dstName, mirrorAxis in mirrorTable.matchObjects(objects): + self.updateMirrorAxis(dstName, mirrorAxis) + + def mirrorValue(self, name, attr, mirrorAxis): + """ + Return the mirror value for the given name, attribute and mirror axis. + + :type name: str + :type attr: str + :type mirrorAxis: list[] + :rtype: None | int | float + """ + value = None + + if self.mirrorTable() and name: + + value = self.attrValue(name, attr) + + if value is not None: + value = self.mirrorTable().formatValue(attr, value, mirrorAxis) + else: + logger.debug("Cannot find mirror value for %s.%s", name, attr) + + return value + + def beforeLoad(self, clearSelection=True): + """ + Called before loading the pose. + + :type clearSelection: bool + """ + logger.debug('Before Load "%s"', self.path()) + + if not self._isLoading: + + maya.cmds.refresh(cv=True) + + self._isLoading = True + maya.cmds.undoInfo(openChunk=True) + + self._selection = maya.cmds.ls(selection=True) or [] + self._autoKeyFrame = maya.cmds.autoKeyframe(query=True, state=True) + + maya.cmds.autoKeyframe(edit=True, state=False) + maya.cmds.select(clear=clearSelection) + + def afterLoad(self): + """Called after loading the pose.""" + if not self._isLoading: + return + + logger.debug("After Load '%s'", self.path()) + + self._isLoading = False + if self._selection: + maya.cmds.select(self._selection) + self._selection = None + + maya.cmds.autoKeyframe(edit=True, state=self._autoKeyFrame) + maya.cmds.undoInfo(closeChunk=True) + + logger.debug('Loaded "%s"', self.path()) + + @mutils.timing + def load( + self, + objects=None, + namespaces=None, + attrs=None, + blend=100, + key=False, + mirror=False, + additive=False, + refresh=False, + batchMode=False, + clearCache=False, + mirrorTable=None, + onlyConnected=False, + clearSelection=False, + ignoreConnected=False, + searchAndReplace=None, + ): + """ + Load the pose to the given objects or namespaces. + + :type objects: list[str] + :type namespaces: list[str] + :type attrs: list[str] + :type blend: float + :type key: bool + :type refresh: bool + :type mirror: bool + :type additive: bool + :type mirrorTable: mutils.MirrorTable + :type batchMode: bool + :type clearCache: bool + :type ignoreConnected: bool + :type onlyConnected: bool + :type clearSelection: bool + :type searchAndReplace: (str, str) or None + """ + if mirror and not mirrorTable: + logger.warning("Cannot mirror pose without a mirror table!") + mirror = False + + if batchMode: + key = False + + self.updateCache( + objects=objects, + namespaces=namespaces, + attrs=attrs, + batchMode=batchMode, + clearCache=clearCache, + mirrorTable=mirrorTable, + onlyConnected=onlyConnected, + ignoreConnected=ignoreConnected, + searchAndReplace=searchAndReplace, + ) + + self.beforeLoad(clearSelection=clearSelection) + + try: + self.loadCache(blend=blend, key=key, mirror=mirror, + additive=additive) + finally: + if not batchMode: + self.afterLoad() + + # Return the focus to the Maya window + maya.cmds.setFocus("MayaWindow") + maya.cmds.refresh(cv=True) + + def updateCache( + self, + objects=None, + namespaces=None, + attrs=None, + ignoreConnected=False, + onlyConnected=False, + mirrorTable=None, + batchMode=False, + clearCache=True, + searchAndReplace=None, + ): + """ + Update the pose cache. + + :type objects: list[str] or None + :type namespaces: list[str] or None + :type attrs: list[str] or None + :type ignoreConnected: bool + :type onlyConnected: bool + :type clearCache: bool + :type batchMode: bool + :type mirrorTable: mutils.MirrorTable + :type searchAndReplace: (str, str) or None + """ + if clearCache or not batchMode or not self._mtime: + self._mtime = self.mtime() + + mtime = self._mtime + + cacheKey = \ + str(mtime) + \ + str(objects) + \ + str(attrs) + \ + str(namespaces) + \ + str(ignoreConnected) + \ + str(searchAndReplace) + \ + str(maya.cmds.currentTime(query=True)) + + if self._cacheKey != cacheKey or clearCache: + + self.validate(namespaces=namespaces) + + self._cache = [] + self._cacheKey = cacheKey + + dstObjects = objects + srcObjects = self.objects() + usingNamespaces = not objects and namespaces + + if mirrorTable: + self.setMirrorTable(mirrorTable) + + search = None + replace = None + if searchAndReplace: + search = searchAndReplace[0] + replace = searchAndReplace[1] + + matches = mutils.matchNames( + srcObjects, + dstObjects=dstObjects, + dstNamespaces=namespaces, + search=search, + replace=replace, + ) + + for srcNode, dstNode in matches: + self.cacheNode( + srcNode, + dstNode, + attrs=attrs, + onlyConnected=onlyConnected, + ignoreConnected=ignoreConnected, + usingNamespaces=usingNamespaces, + ) + + if not self.cache(): + text = "No objects match when loading data. " \ + "Turn on debug mode to see more details." + + raise mutils.NoMatchFoundError(text) + + def cacheNode( + self, + srcNode, + dstNode, + attrs=None, + ignoreConnected=None, + onlyConnected=None, + usingNamespaces=None + ): + """ + Cache the given pair of nodes. + + :type srcNode: mutils.Node + :type dstNode: mutils.Node + :type attrs: list[str] or None + :type ignoreConnected: bool or None + :type onlyConnected: bool or None + :type usingNamespaces: none or list[str] + """ + mirrorAxis = None + mirrorObject = None + + # Remove the first pipe in-case the object has a parent + dstNode.stripFirstPipe() + + srcName = srcNode.name() + + if self.mirrorTable(): + mirrorObject = self.mirrorTable().mirrorObject(srcName) + + if not mirrorObject: + mirrorObject = srcName + msg = "Cannot find mirror object in pose for %s" + logger.debug(msg, srcName) + + # Check if a mirror axis exists for the mirrorObject otherwise + # check the srcNode + mirrorAxis = self.mirrorAxis(mirrorObject) or self.mirrorAxis(srcName) + + if mirrorObject and not maya.cmds.objExists(mirrorObject): + msg = "Mirror object does not exist in the scene %s" + logger.debug(msg, mirrorObject) + + if usingNamespaces: + # Try and use the short name. + # Much faster than the long name when setting attributes. + try: + dstNode = dstNode.toShortName() + except mutils.NoObjectFoundError as msg: + logger.debug(msg) + return + except mutils.MoreThanOneObjectFoundError as msg: + logger.debug(msg) + + for attr in self.attrs(srcName): + + if attrs and attr not in attrs: + continue + + dstAttribute = mutils.Attribute(dstNode.name(), attr) + isConnected = dstAttribute.isConnected() + + if (ignoreConnected and isConnected) or (onlyConnected and not isConnected): + continue + + type_ = self.attrType(srcName, attr) + value = self.attrValue(srcName, attr) + srcMirrorValue = self.mirrorValue(mirrorObject, attr, mirrorAxis=mirrorAxis) + + srcAttribute = mutils.Attribute(dstNode.name(), attr, value=value, type=type_) + dstAttribute.update() + + self._cache.append((srcAttribute, dstAttribute, srcMirrorValue)) + + def loadCache(self, blend=100, key=False, mirror=False, additive=False): + """ + Load the pose from the current cache. + + :type blend: float + :type key: bool + :type mirror: bool + :rtype: None + """ + cache = self.cache() + + for i in range(0, len(cache)): + srcAttribute, dstAttribute, srcMirrorValue = cache[i] + if srcAttribute and dstAttribute: + if mirror and srcMirrorValue is not None: + value = srcMirrorValue + else: + value = srcAttribute.value() + try: + dstAttribute.set(value, blend=blend, key=key, + additive=additive) + except (ValueError, RuntimeError): + cache[i] = (None, None) + logger.debug('Ignoring %s', dstAttribute.fullname()) diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/scriptjob.py b/2023/scripts/animation_tools/studiolibrary/mutils/scriptjob.py new file mode 100644 index 0000000..c0b7e11 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/mutils/scriptjob.py @@ -0,0 +1,38 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +import traceback + +try: + import maya.cmds +except ImportError: + traceback.print_exc() + + +class ScriptJob(object): + """ + self._scriptJob = mutils.ScriptJob(e=['SelectionChanged', self.selectionChanged]) + """ + def __init__(self, *args, **kwargs): + self.id = maya.cmds.scriptJob(*args, **kwargs) + + def kill(self): + if self.id: + maya.cmds.scriptJob(kill=self.id, force=True) + self.id = None + + def __enter__(self): + return self + + def __exit__(self, t, v, tb): + if t is not None: + self.kill() diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/selectionset.py b/2023/scripts/animation_tools/studiolibrary/mutils/selectionset.py new file mode 100644 index 0000000..f9cea0d --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/mutils/selectionset.py @@ -0,0 +1,111 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +import logging + +import mutils + +try: + import maya.cmds +except Exception: + import traceback + traceback.print_exc() + + +logger = logging.getLogger(__name__) + + +def saveSelectionSet(path, objects, metadata=None): + """ + Convenience function for saving a selection set to the given disc location. + + :type path: str + :type objects: list[str] + :type metadata: dict or None + :type args: list + :type kwargs: dict + :rtype: SelectionSet + """ + selectionSet = SelectionSet.fromObjects(objects) + + if metadata: + selectionSet.updateMetadata(metadata) + + selectionSet.save(path) + + return selectionSet + + +class SelectionSet(mutils.TransferObject): + + def load(self, objects=None, namespaces=None, **kwargs): + """ + Load/Select the transfer objects to the given objects or namespaces. + + :type objects: list[str] or None + :type namespaces: list[str] or None + :type kwargs: + """ + validNodes = [] + dstObjects = objects + srcObjects = self.objects() + + self.validate(namespaces=namespaces) + + matches = mutils.matchNames( + srcObjects, + dstObjects=dstObjects, + dstNamespaces=namespaces + ) + + for srcNode, dstNode in matches: + # Support for wild cards eg: ['*_control']. + if "*" in dstNode.name(): + validNodes.append(dstNode.name()) + else: + # Remove the first pipe in-case the object has a parent. + dstNode.stripFirstPipe() + + # Try to get the short name. Much faster than the long + # name when selecting objects. + try: + dstNode = dstNode.toShortName() + + except mutils.NoObjectFoundError as error: + logger.debug(error) + continue + + except mutils.MoreThanOneObjectFoundError as error: + logger.debug(error) + + validNodes.append(dstNode.name()) + + if validNodes: + maya.cmds.select(validNodes, **kwargs) + + # Return the focus to the Maya window + maya.cmds.setFocus("MayaWindow") + else: + text = "No objects match when loading data. " \ + "Turn on debug mode to see more details." + + raise mutils.NoMatchFoundError(text) + + def select(self, objects=None, namespaces=None, **kwargs): + """ + Convenience method for any classes inheriting SelectionSet. + + :type objects: str + :type namespaces: list[str] + :rtype: None + """ + SelectionSet.load(self, objects=objects, namespaces=namespaces, **kwargs) diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/__init__.py b/2023/scripts/animation_tools/studiolibrary/mutils/tests/__init__.py new file mode 100644 index 0000000..ef3f5f7 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/__init__.py @@ -0,0 +1,40 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +from mutils.tests.run import run + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/anim.ma b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/anim.ma new file mode 100644 index 0000000..75740bf --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/anim.ma @@ -0,0 +1,84 @@ +//Maya ASCII 2013 scene +//Name: anim.ma +//Last modified: Wed, Aug 20, 2014 07:33:27 PM +//Codeset: UTF-8 +requires maya "2013"; +requires "stereoCamera" "10.0"; +currentUnit -l centimeter -a degree -t film; +fileInfo "application" "maya"; +fileInfo "product" "Maya batch mode"; +fileInfo "version" "2013 Service Pack 2P12 x64"; +fileInfo "cutIdentifier" "201304120319-868747"; +fileInfo "osv" "Linux 3.5.4-2.10-desktop #1 SMP PREEMPT Fri Oct 5 14:56:49 CEST 2012 x86_64"; +createNode animCurveTA -n "CURVE1"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 45 10 30.81018202226841; +createNode animCurveTU -n "CURVE2"; + setAttr ".tan" 9; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 10 1; + setAttr -s 2 ".kot[0:1]" 5 5; +createNode animCurveTL -n "CURVE3"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0 10 0; +createNode animCurveTL -n "CURVE4"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 8 10 8; +createNode animCurveTL -n "CURVE5"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 -12 10 11.214436147065292; +createNode animCurveTU -n "CURVE6"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0.666 10 0.666; +createNode animCurveTU -n "CURVE7"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0 10 10; +createNode animCurveTU -n "CURVE8"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0.25 10 0.42958527814637792; +createNode animCurveTU -n "CURVE9"; + setAttr ".tan" 9; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 10 1; + setAttr -s 2 ".kot[0:1]" 5 5; +createNode animCurveTU -n "CURVE10"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0.2 10 0.2; +createNode animCurveTU -n "CURVE11"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1.4 10 1.4; +createNode animCurveTA -n "CURVE12"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 90 10 149.70880463068096; +createNode animCurveTU -n "CURVE13"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 2.6 10 2.6; +createNode animCurveTU -n "CURVE14"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0.5 10 0.85917055629275585; +createNode animCurveTU -n "CURVE15"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 5 10 5; +createNode animCurveTU -n "CURVE16"; + setAttr ".tan" 9; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 10 1; + setAttr -s 2 ".kot[0:1]" 5 5; +createNode animCurveTL -n "CURVE18"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0 10 15; +// End \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/animation.anim b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/animation.anim new file mode 100644 index 0000000..b084484 Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/animation.anim differ diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/pose.json b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/pose.json new file mode 100644 index 0000000..81dad16 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/pose.json @@ -0,0 +1,166 @@ +{ + "metadata": { + "angularUnit": "deg", + "description": "test shot", + "user": "testuser", + "startTime": 1, + "mayaSceneFile": "/norman/work/krathjen/git/sandbox/site-packages/mutils/tests/data/test_anim.ma", + "timeUnit": "film", + "cTime": 646464451, + "mayaVersion": "2013 Service Pack 2P12 x64", + "linearUnit": "cm", + "version": "1.0.0", + "endTime": 48 + } +, + "objects": { + "srcSphere:offset": { + "attrs": {} + }, + "srcSphere:sphere": { + "attrs": { + "rotateX": { + "curve": "CURVE1", + "type": "doubleAngle", + "value": 45.0 + }, + "testEnum": { + "curve": "CURVE2", + "type": "enum", + "value": 1 + }, + "translateX": { + "curve": "CURVE3", + "type": "doubleLinear", + "value": 0.0 + }, + "translateY": { + "curve": "CURVE4", + "type": "doubleLinear", + "value": 8.0 + }, + "translateZ": { + "curve": "CURVE5", + "type": "doubleLinear", + "value": -12.0 + }, + "rotateY": { + "type": "doubleAngle", + "value": 50.0 + }, + "testFloat": { + "curve": "CURVE6", + "type": "double", + "value": 0.66600000000000004 + }, + "testAnimated": { + "curve": "CURVE7", + "type": "double", + "value": 0.0 + }, + "scaleX": { + "curve": "CURVE8", + "type": "double", + "value": 0.25 + }, + "scaleY": { + "type": "double", + "value": 4.6600000000000001 + }, + "visibility": { + "curve": "CURVE9", + "type": "bool", + "value": true + }, + "testString": { + "type": "string", + "value": "Hello world" + }, + "testVectorX": { + "curve": "CURVE10", + "type": "double", + "value": 0.20000000000000001 + }, + "testVectorY": { + "curve": "CURVE11", + "type": "double", + "value": 1.3999999999999999 + }, + "rotateZ": { + "curve": "CURVE12", + "type": "doubleAngle", + "value": 90.0 + }, + "testVectorZ": { + "curve": "CURVE13", + "type": "double", + "value": 2.6000000000000001 + }, + "scaleZ": { + "curve": "CURVE14", + "type": "double", + "value": 0.5 + }, + "testInteger": { + "curve": "CURVE15", + "type": "long", + "value": 5 + }, + "testBoolean": { + "curve": "CURVE16", + "type": "bool", + "value": true + }, + "testConnect": { + "type": "double", + "value": 8.0 + } + } + }, + "srcSphere:lockedNode": { + "attrs": { + "translateX": { + "type": "doubleLinear", + "value": 0.0 + }, + "translateY": { + "type": "doubleLinear", + "value": 5.0 + }, + "translateZ": { + "curve": "CURVE18", + "type": "doubleLinear", + "value": 0.0 + }, + "scaleX": { + "type": "double", + "value": 1.0 + }, + "scaleY": { + "type": "double", + "value": 1.0 + }, + "visibility": { + "type": "bool", + "value": true + }, + "rotateX": { + "type": "doubleAngle", + "value": 0.0 + }, + "rotateY": { + "type": "doubleAngle", + "value": 0.0 + }, + "rotateZ": { + "type": "doubleAngle", + "value": 0.0 + }, + "scaleZ": { + "type": "double", + "value": 1.0 + } + } + } + } +} \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/sphere.ma b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/sphere.ma new file mode 100644 index 0000000..8c89abc --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/sphere.ma @@ -0,0 +1,354 @@ +//Maya ASCII 2017 scene +//Name: sphere.ma +//Last modified: Sun, Feb 11, 2018 03:47:35 AM +//Codeset: 1252 +requires maya "2017"; +requires "stereoCamera" "10.0"; +currentUnit -l centimeter -a degree -t film; +fileInfo "application" "maya"; +fileInfo "product" "Maya 2017"; +fileInfo "version" "2017"; +fileInfo "cutIdentifier" "201606150345-997974"; +fileInfo "osv" "Microsoft Windows 8 Business Edition, 64-bit (Build 9200)\n"; +createNode transform -s -n "persp"; + rename -uid "E076660C-4F85-B186-64D1-46849E688491"; + setAttr ".v" no; + setAttr ".t" -type "double3" 133.3110926639115 16.134754006216241 19.317795622267052 ; + setAttr ".r" -type "double3" -8.7383527296081347 79.400000000001739 0 ; +createNode camera -s -n "perspShape" -p "persp"; + rename -uid "00E21AC0-4731-C2C0-2E71-409F5D47F930"; + setAttr -k off ".v" no; + setAttr ".fl" 34.999999999999993; + setAttr ".coi" 114.68216434604706; + setAttr ".imn" -type "string" "persp"; + setAttr ".den" -type "string" "persp_depth"; + setAttr ".man" -type "string" "persp_mask"; + setAttr ".hc" -type "string" "viewSet -p %camera"; +createNode transform -s -n "top"; + rename -uid "882E7E2C-450F-3325-2BB3-E09C8E2DEA5D"; + setAttr ".v" no; + setAttr ".t" -type "double3" 0 100.1 0 ; + setAttr ".r" -type "double3" -89.999999999999986 0 0 ; +createNode camera -s -n "topShape" -p "top"; + rename -uid "12B4F816-4EEE-299F-7183-A58F890C1FD5"; + setAttr -k off ".v" no; + setAttr ".rnd" no; + setAttr ".coi" 100.1; + setAttr ".ow" 30; + setAttr ".imn" -type "string" "top"; + setAttr ".den" -type "string" "top_depth"; + setAttr ".man" -type "string" "top_mask"; + setAttr ".hc" -type "string" "viewSet -t %camera"; + setAttr ".o" yes; +createNode transform -s -n "front"; + rename -uid "FD0E4029-44A6-7FDE-9CFF-FDBF36FCE708"; + setAttr ".v" no; + setAttr ".t" -type "double3" 2.0350096678112575 0.39361762628711539 100.1 ; +createNode camera -s -n "frontShape" -p "front"; + rename -uid "8997F15C-4C97-598E-A50F-DA88CA1063E6"; + setAttr -k off ".v" no; + setAttr ".rnd" no; + setAttr ".coi" 100.1; + setAttr ".ow" 61.766282942468983; + setAttr ".imn" -type "string" "front"; + setAttr ".den" -type "string" "front_depth"; + setAttr ".man" -type "string" "front_mask"; + setAttr ".hc" -type "string" "viewSet -f %camera"; + setAttr ".o" yes; +createNode transform -s -n "side"; + rename -uid "CC57D42B-44BD-C01F-AB99-E6B928031F2B"; + setAttr ".v" no; + setAttr ".t" -type "double3" 100.1 0 0 ; + setAttr ".r" -type "double3" 0 89.999999999999986 0 ; +createNode camera -s -n "sideShape" -p "side"; + rename -uid "B98CA35F-4DFD-36DE-7461-189C98891637"; + setAttr -k off ".v" no; + setAttr ".rnd" no; + setAttr ".coi" 100.1; + setAttr ".ow" 30; + setAttr ".imn" -type "string" "side"; + setAttr ".den" -type "string" "side_depth"; + setAttr ".man" -type "string" "side_mask"; + setAttr ".hc" -type "string" "viewSet -s %camera"; + setAttr ".o" yes; +createNode transform -n "group"; + rename -uid "BECCB461-41D0-BD8A-CC79-3591B57B0D18"; + addAttr -s false -ci true -sn "testMessage" -ln "testMessage" -at "message"; +createNode transform -n "offset" -p "group"; + rename -uid "16BDF72C-4277-8CD9-B837-22ACC6FF5F01"; + setAttr -l on ".v"; + setAttr -l on ".tx"; + setAttr -l on ".ty"; + setAttr -l on ".tz"; + setAttr -l on ".rx"; + setAttr -l on ".ry"; + setAttr -l on ".rz"; + setAttr -l on ".sx"; + setAttr -l on ".sy"; + setAttr -l on ".sz"; +createNode transform -n "lockedNode" -p "offset"; + rename -uid "C7E5AB1E-4BA2-E4D0-551E-FCA465DB50D6"; +lockNode -l 1 ; +createNode transform -n "sphere" -p "lockedNode"; + rename -uid "6D95DBB5-4D74-05BF-A95F-59887E9E743D"; + addAttr -ci true -sn "testVector" -ln "testVector" -at "double3" -nc 3; + addAttr -ci true -sn "testVectorX" -ln "testVectorX" -at "double" -p "testVector"; + addAttr -ci true -sn "testVectorY" -ln "testVectorY" -at "double" -p "testVector"; + addAttr -ci true -sn "testVectorZ" -ln "testVectorZ" -at "double" -p "testVector"; + addAttr -ci true -uac -sn "testColor" -ln "testColor" -at "float3" -nc 3; + addAttr -ci true -sn "testRed" -ln "testRed" -at "float" -p "testColor"; + addAttr -ci true -sn "testGreen" -ln "testGreen" -at "float" -p "testColor"; + addAttr -ci true -sn "testRed" -ln "testRed" -at "float" -p "testColor"; + addAttr -ci true -sn "testString" -ln "testString" -dt "string"; + addAttr -ci true -sn "testEnum" -ln "testEnum" -min 0 -max 2 -en "Apple:Lemon:Banana" + -at "enum"; + addAttr -ci true -sn "testFloat" -ln "testFloat" -min 0 -max 10 -at "double"; + addAttr -ci true -sn "testBoolean" -ln "testBoolean" -min 0 -max 1 -at "bool"; + addAttr -ci true -sn "testInteger" -ln "testInteger" -min 0 -max 10 -at "long"; + addAttr -ci true -sn "testLocked" -ln "testLocked" -min 0 -max 10 -at "double"; + addAttr -ci true -sn "testHidden" -ln "testHidden" -min 0 -max 10 -at "double"; + addAttr -ci true -sn "testConnect" -ln "testConnect" -at "double"; + addAttr -ci true -sn "testAnimated" -ln "testAnimated" -at "double"; + addAttr -s false -ci true -sn "testMessage" -ln "testMessage" -at "message"; + addAttr -ci true -sn "testLimit" -ln "testLimit" -dv 5 -min -10 -max 10 -at "double"; + addAttr -ci true -sn "testNonKeyable" -ln "testNonKeyable" -at "double"; + addAttr -uap -ci true -k true -sn "testProxy" -ln "testProxy" -dv 1 -at "double"; + setAttr -k on ".testVector"; + setAttr -k on ".testVectorX"; + setAttr -k on ".testVectorY"; + setAttr -k on ".testVectorZ"; + setAttr -k on ".testString"; + setAttr -k on ".testEnum" 2; + setAttr -k on ".testFloat"; + setAttr -k on ".testBoolean"; + setAttr -k on ".testInteger"; + setAttr -l on -k on ".testLocked"; + setAttr -k on ".testConnect"; + setAttr -k on ".testAnimated"; + setAttr -k on ".testLimit" 10; + setAttr -cb on ".testNonKeyable"; +createNode mesh -n "sphereShape" -p "sphere"; + rename -uid "A54E9E87-47A6-32A9-85C4-AFBAA8C21840"; + setAttr -k off ".v"; + setAttr ".vir" yes; + setAttr ".vif" yes; + setAttr ".uvst[0].uvsn" -type "string" "map1"; + setAttr ".cuvs" -type "string" "map1"; + setAttr ".dcc" -type "string" "Ambient+Diffuse"; + setAttr ".covm[0]" 0 1 1; + setAttr ".cdvm[0]" 0 1 1; + setAttr ".ugsdt" no; + setAttr ".vnm" 0; +createNode transform -n "pCube1"; + rename -uid "EB3530D0-4207-A5AE-6925-9D94CBDDD1F9"; + setAttr ".t" -type "double3" 0 0 -29.719509228177799 ; +createNode mesh -n "pCubeShape1" -p "pCube1"; + rename -uid "7E4B2133-4E80-F102-7998-A9B732FEACD1"; + setAttr -k off ".v"; + setAttr ".vir" yes; + setAttr ".vif" yes; + setAttr ".uvst[0].uvsn" -type "string" "map1"; + setAttr ".cuvs" -type "string" "map1"; + setAttr ".dcc" -type "string" "Ambient+Diffuse"; + setAttr ".covm[0]" 0 1 1; + setAttr ".cdvm[0]" 0 1 1; +createNode lightLinker -s -n "lightLinker1"; + rename -uid "BB27B0F0-4683-C766-9E0B-D2AFAEB1AFF6"; + setAttr -s 2 ".lnk"; + setAttr -s 2 ".slnk"; +createNode displayLayerManager -n "layerManager"; + rename -uid "1270B817-40F6-0E8E-D20B-FD9B9195A9EE"; +createNode displayLayer -n "defaultLayer"; + rename -uid "23B6DA10-4D2D-10C6-9FAF-749F161B9716"; +createNode renderLayerManager -n "renderLayerManager"; + rename -uid "1308789F-439F-925D-3094-0B8AA9FBE17D"; +createNode renderLayer -n "defaultRenderLayer"; + rename -uid "7827EACA-45F4-FC44-3C4C-368439DEC2B0"; + setAttr ".g" yes; +createNode polySphere -n "srcPolySphere"; + rename -uid "1B369F70-4317-2F4F-4C28-E18C566DC198"; + setAttr ".r" 4.1417806816985845; +createNode script -n "sceneConfigurationScriptNode"; + rename -uid "B0BF38E3-48B8-4929-20D7-45BD7DF0B488"; + setAttr ".b" -type "string" "playbackOptions -min 1 -max 24 -ast 1 -aet 48 "; + setAttr ".st" 6; +createNode animCurveTU -n "sphere_testAnimated"; + rename -uid "3A08FC92-43C1-C2D8-F4D3-98813CAFADB9"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0 10 10; +createNode shapeEditorManager -n "shapeEditorManager"; + rename -uid "76FE07E3-4101-0D2E-BA83-308EDB6BAFB5"; +createNode poseInterpolatorManager -n "poseInterpolatorManager"; + rename -uid "E4F59164-433D-3B5A-9EB0-858BC8193BA6"; +createNode polyCube -n "polyCube1"; + rename -uid "440FB0CB-44F5-D535-6B4E-6088139890E3"; + setAttr ".cuv" 4; +createNode objectSet -n "lockedSet"; + rename -uid "452516C3-40E5-8508-BCB2-8A8F6B2C0F4C"; + setAttr ".ihi" 0; + setAttr -l on ".dsm"; +createNode script -n "uiConfigurationScriptNode"; + rename -uid "5F07C60B-437F-3FFF-82B2-9ABBA913F194"; + setAttr ".b" -type "string" ( + "// Maya Mel UI Configuration File.\n//\n// This script is machine generated. Edit at your own risk.\n//\n//\n\nglobal string $gMainPane;\nif (`paneLayout -exists $gMainPane`) {\n\n\tglobal int $gUseScenePanelConfig;\n\tint $useSceneConfig = $gUseScenePanelConfig;\n\tint $menusOkayInPanels = `optionVar -q allowMenusInPanels`;\tint $nVisPanes = `paneLayout -q -nvp $gMainPane`;\n\tint $nPanes = 0;\n\tstring $editorName;\n\tstring $panelName;\n\tstring $itemFilterName;\n\tstring $panelConfig;\n\n\t//\n\t// get current state of the UI\n\t//\n\tsceneUIReplacement -update $gMainPane;\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"outlinerPanel\" (localizedPanelLabel(\"Outliner\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `outlinerPanel -unParent -l (localizedPanelLabel(\"Outliner\")) -mbv $menusOkayInPanels `;\n\t\t\t$editorName = $panelName;\n outlinerEditor -e \n -showShapes 0\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 0\n" + + " -showReferenceMembers 0\n -showAttributes 0\n -showConnected 0\n -showAnimCurvesOnly 0\n -showMuteInfo 0\n -organizeByLayer 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 0\n -showDagOnly 1\n -showAssets 1\n -showContainedOnly 1\n -showPublishedAsConnected 0\n -showContainerContents 1\n -ignoreDagHierarchy 0\n -expandConnections 0\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 1\n -showLeafs 1\n -showNumericAttrsOnly 0\n -highlightActive 1\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"defaultSetFilter\" \n -showSetMembers 1\n -allowMultiSelection 1\n" + + " -alwaysToggleSelect 0\n -directSelect 0\n -isSet 0\n -isSetMember 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 0\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n -renderFilterIndex 0\n -selectionOrder \"chronological\" \n -expandAttribute 0\n $editorName;\n\t\t}\n\t} else {\n" + + "\t\t$label = `panel -q -label $panelName`;\n\t\toutlinerPanel -edit -l (localizedPanelLabel(\"Outliner\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n outlinerEditor -e \n -showShapes 0\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 0\n -showConnected 0\n -showAnimCurvesOnly 0\n -showMuteInfo 0\n -organizeByLayer 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 0\n -showDagOnly 1\n -showAssets 1\n -showContainedOnly 1\n -showPublishedAsConnected 0\n -showContainerContents 1\n -ignoreDagHierarchy 0\n -expandConnections 0\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 1\n -showLeafs 1\n -showNumericAttrsOnly 0\n -highlightActive 1\n -autoSelectNewObjects 0\n" + + " -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"defaultSetFilter\" \n -showSetMembers 1\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -isSet 0\n -isSetMember 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 0\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n -renderFilterIndex 0\n -selectionOrder \"chronological\" \n" + + " -expandAttribute 0\n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"modelPanel\" (localizedPanelLabel(\"Top View\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `modelPanel -unParent -l (localizedPanelLabel(\"Top View\")) -mbv $menusOkayInPanels `;\n\t\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"top\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"smoothShaded\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 0\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n" + + " -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 16384\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n -maxConstantTransparency 1\n -rendererName \"vp2Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n" + + " -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n" + + " -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n -captureSequenceNumber -1\n -width 1\n -height 1\n -sceneRenderFilter 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tmodelPanel -edit -l (localizedPanelLabel(\"Top View\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"top\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"smoothShaded\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n" + + " -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 0\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 16384\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n -maxConstantTransparency 1\n -rendererName \"vp2Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n" + + " -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n" + + " -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n -captureSequenceNumber -1\n -width 1\n -height 1\n -sceneRenderFilter 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"modelPanel\" (localizedPanelLabel(\"Side View\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `modelPanel -unParent -l (localizedPanelLabel(\"Side View\")) -mbv $menusOkayInPanels `;\n\t\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"side\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"smoothShaded\" \n" + + " -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 0\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 16384\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n -maxConstantTransparency 1\n" + + " -rendererName \"vp2Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n" + + " -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n -captureSequenceNumber -1\n -width 1\n -height 1\n -sceneRenderFilter 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n" + + "\t\tmodelPanel -edit -l (localizedPanelLabel(\"Side View\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"side\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"smoothShaded\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 0\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 16384\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n" + + " -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n -maxConstantTransparency 1\n -rendererName \"vp2Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n" + + " -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n -captureSequenceNumber -1\n -width 1\n -height 1\n -sceneRenderFilter 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"modelPanel\" (localizedPanelLabel(\"Front View\")) `;\n" + + "\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `modelPanel -unParent -l (localizedPanelLabel(\"Front View\")) -mbv $menusOkayInPanels `;\n\t\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"front\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"smoothShaded\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 0\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n" + + " -textureDisplay \"modulate\" \n -textureMaxSize 16384\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n -maxConstantTransparency 1\n -rendererName \"vp2Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n" + + " -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n" + + " -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n -captureSequenceNumber -1\n -width 1\n -height 1\n -sceneRenderFilter 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tmodelPanel -edit -l (localizedPanelLabel(\"Front View\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"front\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"smoothShaded\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 0\n -backfaceCulling 0\n" + + " -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 16384\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n -maxConstantTransparency 1\n -rendererName \"vp2Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n" + + " -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n" + + " -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n -captureSequenceNumber -1\n -width 1\n -height 1\n -sceneRenderFilter 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"modelPanel\" (localizedPanelLabel(\"Persp View\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `modelPanel -unParent -l (localizedPanelLabel(\"Persp View\")) -mbv $menusOkayInPanels `;\n\t\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"persp\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"smoothShaded\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n" + + " -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 0\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 16384\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n -maxConstantTransparency 1\n -rendererName \"vp2Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n" + + " -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n" + + " -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n -captureSequenceNumber -1\n -width 1531\n -height 1022\n -sceneRenderFilter 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tmodelPanel -edit -l (localizedPanelLabel(\"Persp View\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n" + + " modelEditor -e \n -camera \"persp\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"smoothShaded\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 0\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 16384\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n" + + " -maxConstantTransparency 1\n -rendererName \"vp2Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n" + + " -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n -captureSequenceNumber -1\n -width 1531\n -height 1022\n -sceneRenderFilter 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"outlinerPanel\" (localizedPanelLabel(\"Outliner\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n" + + "\t\t\t$panelName = `outlinerPanel -unParent -l (localizedPanelLabel(\"Outliner\")) -mbv $menusOkayInPanels `;\n\t\t\t$editorName = $panelName;\n outlinerEditor -e \n -docTag \"isolOutln_fromSeln\" \n -showShapes 0\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 0\n -showConnected 0\n -showAnimCurvesOnly 0\n -showMuteInfo 0\n -organizeByLayer 0\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 0\n -showDagOnly 1\n -showAssets 1\n -showContainedOnly 1\n -showPublishedAsConnected 0\n -showContainerContents 1\n -ignoreDagHierarchy 0\n -expandConnections 0\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 1\n" + + " -showLeafs 1\n -showNumericAttrsOnly 0\n -highlightActive 1\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"defaultSetFilter\" \n -showSetMembers 1\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n" + + " -mapMotionTrails 0\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\toutlinerPanel -edit -l (localizedPanelLabel(\"Outliner\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n outlinerEditor -e \n -docTag \"isolOutln_fromSeln\" \n -showShapes 0\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 0\n -showConnected 0\n -showAnimCurvesOnly 0\n -showMuteInfo 0\n -organizeByLayer 0\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 0\n -showDagOnly 1\n -showAssets 1\n -showContainedOnly 1\n -showPublishedAsConnected 0\n -showContainerContents 1\n -ignoreDagHierarchy 0\n" + + " -expandConnections 0\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 1\n -showLeafs 1\n -showNumericAttrsOnly 0\n -highlightActive 1\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"defaultSetFilter\" \n -showSetMembers 1\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n" + + " -mapMotionTrails 0\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"graphEditor\" (localizedPanelLabel(\"Graph Editor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"graphEditor\" -l (localizedPanelLabel(\"Graph Editor\")) -mbv $menusOkayInPanels `;\n\n\t\t\t$editorName = ($panelName+\"OutlineEd\");\n outlinerEditor -e \n -showShapes 1\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 1\n -showConnected 1\n -showAnimCurvesOnly 1\n -showMuteInfo 0\n -organizeByLayer 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n" + + " -autoExpand 1\n -showDagOnly 0\n -showAssets 1\n -showContainedOnly 0\n -showPublishedAsConnected 0\n -showContainerContents 0\n -ignoreDagHierarchy 0\n -expandConnections 1\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 0\n -showLeafs 1\n -showNumericAttrsOnly 1\n -highlightActive 0\n -autoSelectNewObjects 1\n -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 1\n -setFilter \"0\" \n -showSetMembers 0\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n" + + " -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 1\n -mapMotionTrails 1\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n $editorName;\n\n\t\t\t$editorName = ($panelName+\"GraphEd\");\n animCurveEditor -e \n -displayKeys 1\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 1\n -displayInfinities 0\n -displayValues 0\n -autoFit 1\n -snapTime \"integer\" \n -snapValue \"none\" \n -showResults \"off\" \n -showBufferCurves \"off\" \n -smoothness \"fine\" \n" + + " -resultSamples 0.96\n -resultScreenSamples 0\n -resultUpdate \"delayed\" \n -showUpstreamCurves 1\n -showCurveNames 0\n -showActiveCurveNames 0\n -stackedCurves 0\n -stackedCurvesMin -1\n -stackedCurvesMax 1\n -stackedCurvesSpace 0.2\n -displayNormalized 0\n -preSelectionHighlight 0\n -constrainDrag 0\n -classicMode 1\n -valueLinesToggle 1\n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Graph Editor\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = ($panelName+\"OutlineEd\");\n outlinerEditor -e \n -showShapes 1\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 1\n" + + " -showConnected 1\n -showAnimCurvesOnly 1\n -showMuteInfo 0\n -organizeByLayer 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 1\n -showDagOnly 0\n -showAssets 1\n -showContainedOnly 0\n -showPublishedAsConnected 0\n -showContainerContents 0\n -ignoreDagHierarchy 0\n -expandConnections 1\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 0\n -showLeafs 1\n -showNumericAttrsOnly 1\n -highlightActive 0\n -autoSelectNewObjects 1\n -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 1\n -setFilter \"0\" \n -showSetMembers 0\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n" + + " -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 1\n -mapMotionTrails 1\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n $editorName;\n\n\t\t\t$editorName = ($panelName+\"GraphEd\");\n animCurveEditor -e \n -displayKeys 1\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 1\n -displayInfinities 0\n" + + " -displayValues 0\n -autoFit 1\n -snapTime \"integer\" \n -snapValue \"none\" \n -showResults \"off\" \n -showBufferCurves \"off\" \n -smoothness \"fine\" \n -resultSamples 0.96\n -resultScreenSamples 0\n -resultUpdate \"delayed\" \n -showUpstreamCurves 1\n -showCurveNames 0\n -showActiveCurveNames 0\n -stackedCurves 0\n -stackedCurvesMin -1\n -stackedCurvesMax 1\n -stackedCurvesSpace 0.2\n -displayNormalized 0\n -preSelectionHighlight 0\n -constrainDrag 0\n -classicMode 1\n -valueLinesToggle 1\n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"dopeSheetPanel\" (localizedPanelLabel(\"Dope Sheet\")) `;\n\tif (\"\" == $panelName) {\n" + + "\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"dopeSheetPanel\" -l (localizedPanelLabel(\"Dope Sheet\")) -mbv $menusOkayInPanels `;\n\n\t\t\t$editorName = ($panelName+\"OutlineEd\");\n outlinerEditor -e \n -showShapes 1\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 1\n -showConnected 1\n -showAnimCurvesOnly 1\n -showMuteInfo 0\n -organizeByLayer 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 0\n -showDagOnly 0\n -showAssets 1\n -showContainedOnly 0\n -showPublishedAsConnected 0\n -showContainerContents 0\n -ignoreDagHierarchy 0\n -expandConnections 1\n -showUpstreamCurves 1\n -showUnitlessCurves 0\n" + + " -showCompounds 1\n -showLeafs 1\n -showNumericAttrsOnly 1\n -highlightActive 0\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 1\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"0\" \n -showSetMembers 0\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n" + + " -mapMotionTrails 1\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n $editorName;\n\n\t\t\t$editorName = ($panelName+\"DopeSheetEd\");\n dopeSheetEditor -e \n -displayKeys 1\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 0\n -displayInfinities 0\n -displayValues 0\n -autoFit 0\n -snapTime \"integer\" \n -snapValue \"none\" \n -outliner \"dopeSheetPanel1OutlineEd\" \n -showSummary 1\n -showScene 0\n -hierarchyBelow 0\n -showTicks 1\n -selectionWindow 0 0 0 0 \n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Dope Sheet\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = ($panelName+\"OutlineEd\");\n outlinerEditor -e \n" + + " -showShapes 1\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 1\n -showConnected 1\n -showAnimCurvesOnly 1\n -showMuteInfo 0\n -organizeByLayer 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 0\n -showDagOnly 0\n -showAssets 1\n -showContainedOnly 0\n -showPublishedAsConnected 0\n -showContainerContents 0\n -ignoreDagHierarchy 0\n -expandConnections 1\n -showUpstreamCurves 1\n -showUnitlessCurves 0\n -showCompounds 1\n -showLeafs 1\n -showNumericAttrsOnly 1\n -highlightActive 0\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 1\n -dropIsParent 1\n" + + " -transmitFilters 0\n -setFilter \"0\" \n -showSetMembers 0\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 1\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n $editorName;\n\n\t\t\t$editorName = ($panelName+\"DopeSheetEd\");\n dopeSheetEditor -e \n" + + " -displayKeys 1\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 0\n -displayInfinities 0\n -displayValues 0\n -autoFit 0\n -snapTime \"integer\" \n -snapValue \"none\" \n -outliner \"dopeSheetPanel1OutlineEd\" \n -showSummary 1\n -showScene 0\n -hierarchyBelow 0\n -showTicks 1\n -selectionWindow 0 0 0 0 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"timeEditorPanel\" (localizedPanelLabel(\"Time Editor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"timeEditorPanel\" -l (localizedPanelLabel(\"Time Editor\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Time Editor\")) -mbv $menusOkayInPanels $panelName;\n" + + "\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"clipEditorPanel\" (localizedPanelLabel(\"Trax Editor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"clipEditorPanel\" -l (localizedPanelLabel(\"Trax Editor\")) -mbv $menusOkayInPanels `;\n\n\t\t\t$editorName = clipEditorNameFromPanel($panelName);\n clipEditor -e \n -displayKeys 0\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 0\n -displayInfinities 0\n -displayValues 0\n -autoFit 0\n -snapTime \"none\" \n -snapValue \"none\" \n -initialized 0\n -manageSequencer 0 \n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Trax Editor\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = clipEditorNameFromPanel($panelName);\n" + + " clipEditor -e \n -displayKeys 0\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 0\n -displayInfinities 0\n -displayValues 0\n -autoFit 0\n -snapTime \"none\" \n -snapValue \"none\" \n -initialized 0\n -manageSequencer 0 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"sequenceEditorPanel\" (localizedPanelLabel(\"Camera Sequencer\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"sequenceEditorPanel\" -l (localizedPanelLabel(\"Camera Sequencer\")) -mbv $menusOkayInPanels `;\n\n\t\t\t$editorName = sequenceEditorNameFromPanel($panelName);\n clipEditor -e \n -displayKeys 0\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 0\n" + + " -displayInfinities 0\n -displayValues 0\n -autoFit 0\n -snapTime \"none\" \n -snapValue \"none\" \n -initialized 0\n -manageSequencer 1 \n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Camera Sequencer\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = sequenceEditorNameFromPanel($panelName);\n clipEditor -e \n -displayKeys 0\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 0\n -displayInfinities 0\n -displayValues 0\n -autoFit 0\n -snapTime \"none\" \n -snapValue \"none\" \n -initialized 0\n -manageSequencer 1 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"hyperGraphPanel\" (localizedPanelLabel(\"Hypergraph Hierarchy\")) `;\n" + + "\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"hyperGraphPanel\" -l (localizedPanelLabel(\"Hypergraph Hierarchy\")) -mbv $menusOkayInPanels `;\n\n\t\t\t$editorName = ($panelName+\"HyperGraphEd\");\n hyperGraph -e \n -graphLayoutStyle \"hierarchicalLayout\" \n -orientation \"horiz\" \n -mergeConnections 0\n -zoom 1\n -animateTransition 0\n -showRelationships 1\n -showShapes 0\n -showDeformers 0\n -showExpressions 0\n -showConstraints 0\n -showConnectionFromSelected 0\n -showConnectionToSelected 0\n -showConstraintLabels 0\n -showUnderworld 0\n -showInvisible 0\n -transitionFrames 1\n -opaqueContainers 0\n -freeform 0\n -imagePosition 0 0 \n -imageScale 1\n -imageEnabled 0\n -graphType \"DAG\" \n" + + " -heatMapDisplay 0\n -updateSelection 1\n -updateNodeAdded 1\n -useDrawOverrideColor 0\n -limitGraphTraversal -1\n -range 0 0 \n -iconSize \"smallIcons\" \n -showCachedConnections 0\n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Hypergraph Hierarchy\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = ($panelName+\"HyperGraphEd\");\n hyperGraph -e \n -graphLayoutStyle \"hierarchicalLayout\" \n -orientation \"horiz\" \n -mergeConnections 0\n -zoom 1\n -animateTransition 0\n -showRelationships 1\n -showShapes 0\n -showDeformers 0\n -showExpressions 0\n -showConstraints 0\n -showConnectionFromSelected 0\n -showConnectionToSelected 0\n -showConstraintLabels 0\n" + + " -showUnderworld 0\n -showInvisible 0\n -transitionFrames 1\n -opaqueContainers 0\n -freeform 0\n -imagePosition 0 0 \n -imageScale 1\n -imageEnabled 0\n -graphType \"DAG\" \n -heatMapDisplay 0\n -updateSelection 1\n -updateNodeAdded 1\n -useDrawOverrideColor 0\n -limitGraphTraversal -1\n -range 0 0 \n -iconSize \"smallIcons\" \n -showCachedConnections 0\n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"visorPanel\" (localizedPanelLabel(\"Visor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"visorPanel\" -l (localizedPanelLabel(\"Visor\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Visor\")) -mbv $menusOkayInPanels $panelName;\n" + + "\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"createNodePanel\" (localizedPanelLabel(\"Create Node\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"createNodePanel\" -l (localizedPanelLabel(\"Create Node\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Create Node\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"polyTexturePlacementPanel\" (localizedPanelLabel(\"UV Editor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"polyTexturePlacementPanel\" -l (localizedPanelLabel(\"UV Editor\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"UV Editor\")) -mbv $menusOkayInPanels $panelName;\n" + + "\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"renderWindowPanel\" (localizedPanelLabel(\"Render View\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"renderWindowPanel\" -l (localizedPanelLabel(\"Render View\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Render View\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"shapePanel\" (localizedPanelLabel(\"Shape Editor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\tshapePanel -unParent -l (localizedPanelLabel(\"Shape Editor\")) -mbv $menusOkayInPanels ;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tshapePanel -edit -l (localizedPanelLabel(\"Shape Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n" + + "\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"posePanel\" (localizedPanelLabel(\"Pose Editor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\tposePanel -unParent -l (localizedPanelLabel(\"Pose Editor\")) -mbv $menusOkayInPanels ;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tposePanel -edit -l (localizedPanelLabel(\"Pose Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"dynRelEdPanel\" (localizedPanelLabel(\"Dynamic Relationships\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"dynRelEdPanel\" -l (localizedPanelLabel(\"Dynamic Relationships\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Dynamic Relationships\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"relationshipPanel\" (localizedPanelLabel(\"Relationship Editor\")) `;\n" + + "\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"relationshipPanel\" -l (localizedPanelLabel(\"Relationship Editor\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Relationship Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"referenceEditorPanel\" (localizedPanelLabel(\"Reference Editor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"referenceEditorPanel\" -l (localizedPanelLabel(\"Reference Editor\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Reference Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"componentEditorPanel\" (localizedPanelLabel(\"Component Editor\")) `;\n" + + "\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"componentEditorPanel\" -l (localizedPanelLabel(\"Component Editor\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Component Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"dynPaintScriptedPanelType\" (localizedPanelLabel(\"Paint Effects\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"dynPaintScriptedPanelType\" -l (localizedPanelLabel(\"Paint Effects\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Paint Effects\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"scriptEditorPanel\" (localizedPanelLabel(\"Script Editor\")) `;\n" + + "\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"scriptEditorPanel\" -l (localizedPanelLabel(\"Script Editor\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Script Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\tif ($useSceneConfig) {\n\t\tscriptedPanel -e -to $panelName;\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"profilerPanel\" (localizedPanelLabel(\"Profiler Tool\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"profilerPanel\" -l (localizedPanelLabel(\"Profiler Tool\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Profiler Tool\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"contentBrowserPanel\" (localizedPanelLabel(\"Content Browser\")) `;\n" + + "\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"contentBrowserPanel\" -l (localizedPanelLabel(\"Content Browser\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Content Browser\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"outlinerPanel\" (localizedPanelLabel(\"ToggledOutliner\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `outlinerPanel -unParent -l (localizedPanelLabel(\"ToggledOutliner\")) -mbv $menusOkayInPanels `;\n\t\t\t$editorName = $panelName;\n outlinerEditor -e \n -showShapes 0\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 0\n -showConnected 0\n -showAnimCurvesOnly 0\n" + + " -showMuteInfo 0\n -organizeByLayer 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 0\n -showDagOnly 1\n -showAssets 1\n -showContainedOnly 1\n -showPublishedAsConnected 0\n -showContainerContents 1\n -ignoreDagHierarchy 0\n -expandConnections 0\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 1\n -showLeafs 1\n -showNumericAttrsOnly 0\n -highlightActive 1\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"defaultSetFilter\" \n -showSetMembers 1\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -isSet 0\n -isSetMember 0\n" + + " -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 0\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n -renderFilterIndex 0\n -selectionOrder \"chronological\" \n -expandAttribute 0\n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\toutlinerPanel -edit -l (localizedPanelLabel(\"ToggledOutliner\")) -mbv $menusOkayInPanels $panelName;\n" + + "\t\t$editorName = $panelName;\n outlinerEditor -e \n -showShapes 0\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 0\n -showConnected 0\n -showAnimCurvesOnly 0\n -showMuteInfo 0\n -organizeByLayer 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 0\n -showDagOnly 1\n -showAssets 1\n -showContainedOnly 1\n -showPublishedAsConnected 0\n -showContainerContents 1\n -ignoreDagHierarchy 0\n -expandConnections 0\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 1\n -showLeafs 1\n -showNumericAttrsOnly 0\n -highlightActive 1\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"defaultSetFilter\" \n" + + " -showSetMembers 1\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -isSet 0\n -isSetMember 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 0\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n -renderFilterIndex 0\n -selectionOrder \"chronological\" \n -expandAttribute 0\n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n" + + "\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"Stereo\" (localizedPanelLabel(\"Stereo\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"Stereo\" -l (localizedPanelLabel(\"Stereo\")) -mbv $menusOkayInPanels `;\nstring $editorName = ($panelName+\"Editor\");\n stereoCameraView -e \n -camera \"persp\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"wireframe\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 1\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n" + + " -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 16384\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n -maxConstantTransparency 1\n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 4 4 \n -bumpResolution 4 4 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 0\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n" + + " -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n" + + " -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n -captureSequenceNumber -1\n -width 0\n -height 0\n -sceneRenderFilter 0\n -displayMode \"centerEye\" \n -viewColor 0 0 0 1 \n -useCustomBackground 1\n $editorName;\n stereoCameraView -e -viewSelected 0 $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Stereo\")) -mbv $menusOkayInPanels $panelName;\nstring $editorName = ($panelName+\"Editor\");\n stereoCameraView -e \n -camera \"persp\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"wireframe\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n" + + " -headsUpDisplay 1\n -holdOuts 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 1\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 16384\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n -maxConstantTransparency 1\n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 4 4 \n" + + " -bumpResolution 4 4 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 0\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n" + + " -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n -captureSequenceNumber -1\n -width 0\n -height 0\n -sceneRenderFilter 0\n -displayMode \"centerEye\" \n -viewColor 0 0 0 1 \n -useCustomBackground 1\n $editorName;\n stereoCameraView -e -viewSelected 0 $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n" + + "\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"hyperShadePanel\" (localizedPanelLabel(\"Hypershade\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"hyperShadePanel\" -l (localizedPanelLabel(\"Hypershade\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Hypershade\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"nodeEditorPanel\" (localizedPanelLabel(\"Node Editor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"nodeEditorPanel\" -l (localizedPanelLabel(\"Node Editor\")) -mbv $menusOkayInPanels `;\n\n\t\t\t$editorName = ($panelName+\"NodeEditorEd\");\n nodeEditor -e \n -allAttributes 0\n -allNodes 0\n -autoSizeNodes 1\n -consistentNameSize 1\n" + + " -createNodeCommand \"nodeEdCreateNodeCommand\" \n -defaultPinnedState 0\n -additiveGraphingMode 0\n -settingsChangedCallback \"nodeEdSyncControls\" \n -traversalDepthLimit -1\n -keyPressCommand \"nodeEdKeyPressCommand\" \n -nodeTitleMode \"name\" \n -gridSnap 0\n -gridVisibility 1\n -popupMenuScript \"nodeEdBuildPanelMenus\" \n -showNamespace 1\n -showShapes 1\n -showSGShapes 0\n -showTransforms 1\n -useAssets 1\n -syncedSelection 1\n -extendToShapes 1\n -activeTab -1\n -editorMode \"default\" \n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Node Editor\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = ($panelName+\"NodeEditorEd\");\n nodeEditor -e \n -allAttributes 0\n" + + " -allNodes 0\n -autoSizeNodes 1\n -consistentNameSize 1\n -createNodeCommand \"nodeEdCreateNodeCommand\" \n -defaultPinnedState 0\n -additiveGraphingMode 0\n -settingsChangedCallback \"nodeEdSyncControls\" \n -traversalDepthLimit -1\n -keyPressCommand \"nodeEdKeyPressCommand\" \n -nodeTitleMode \"name\" \n -gridSnap 0\n -gridVisibility 1\n -popupMenuScript \"nodeEdBuildPanelMenus\" \n -showNamespace 1\n -showShapes 1\n -showSGShapes 0\n -showTransforms 1\n -useAssets 1\n -syncedSelection 1\n -extendToShapes 1\n -activeTab -1\n -editorMode \"default\" \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\tif ($useSceneConfig) {\n string $configName = `getPanel -cwl (localizedPanelLabel(\"Current Layout\"))`;\n" + + " if (\"\" != $configName) {\n\t\t\tpanelConfiguration -edit -label (localizedPanelLabel(\"Current Layout\")) \n\t\t\t\t-userCreated false\n\t\t\t\t-defaultImage \"vacantCell.xP:/\"\n\t\t\t\t-image \"\"\n\t\t\t\t-sc false\n\t\t\t\t-configString \"global string $gMainPane; paneLayout -e -cn \\\"single\\\" -ps 1 100 100 $gMainPane;\"\n\t\t\t\t-removeAllPanels\n\t\t\t\t-ap false\n\t\t\t\t\t(localizedPanelLabel(\"Persp View\")) \n\t\t\t\t\t\"modelPanel\"\n" + + "\t\t\t\t\t\"$panelName = `modelPanel -unParent -l (localizedPanelLabel(\\\"Persp View\\\")) -mbv $menusOkayInPanels `;\\n$editorName = $panelName;\\nmodelEditor -e \\n -cam `findStartUpCamera persp` \\n -useInteractiveMode 0\\n -displayLights \\\"default\\\" \\n -displayAppearance \\\"smoothShaded\\\" \\n -activeOnly 0\\n -ignorePanZoom 0\\n -wireframeOnShaded 0\\n -headsUpDisplay 1\\n -holdOuts 1\\n -selectionHiliteDisplay 1\\n -useDefaultMaterial 0\\n -bufferMode \\\"double\\\" \\n -twoSidedLighting 0\\n -backfaceCulling 0\\n -xray 0\\n -jointXray 0\\n -activeComponentsXray 0\\n -displayTextures 0\\n -smoothWireframe 0\\n -lineWidth 1\\n -textureAnisotropic 0\\n -textureHilight 1\\n -textureSampling 2\\n -textureDisplay \\\"modulate\\\" \\n -textureMaxSize 16384\\n -fogging 0\\n -fogSource \\\"fragment\\\" \\n -fogMode \\\"linear\\\" \\n -fogStart 0\\n -fogEnd 100\\n -fogDensity 0.1\\n -fogColor 0.5 0.5 0.5 1 \\n -depthOfFieldPreview 1\\n -maxConstantTransparency 1\\n -rendererName \\\"vp2Renderer\\\" \\n -objectFilterShowInHUD 1\\n -isFiltered 0\\n -colorResolution 256 256 \\n -bumpResolution 512 512 \\n -textureCompression 0\\n -transparencyAlgorithm \\\"frontAndBackCull\\\" \\n -transpInShadows 0\\n -cullingOverride \\\"none\\\" \\n -lowQualityLighting 0\\n -maximumNumHardwareLights 1\\n -occlusionCulling 0\\n -shadingModel 0\\n -useBaseRenderer 0\\n -useReducedRenderer 0\\n -smallObjectCulling 0\\n -smallObjectThreshold -1 \\n -interactiveDisableShadows 0\\n -interactiveBackFaceCull 0\\n -sortTransparent 1\\n -nurbsCurves 1\\n -nurbsSurfaces 1\\n -polymeshes 1\\n -subdivSurfaces 1\\n -planes 1\\n -lights 1\\n -cameras 1\\n -controlVertices 1\\n -hulls 1\\n -grid 1\\n -imagePlane 1\\n -joints 1\\n -ikHandles 1\\n -deformers 1\\n -dynamics 1\\n -particleInstancers 1\\n -fluids 1\\n -hairSystems 1\\n -follicles 1\\n -nCloths 1\\n -nParticles 1\\n -nRigids 1\\n -dynamicConstraints 1\\n -locators 1\\n -manipulators 1\\n -pluginShapes 1\\n -dimensions 1\\n -handles 1\\n -pivots 1\\n -textures 1\\n -strokes 1\\n -motionTrails 1\\n -clipGhosts 1\\n -greasePencils 1\\n -shadows 0\\n -captureSequenceNumber -1\\n -width 1531\\n -height 1022\\n -sceneRenderFilter 0\\n $editorName;\\nmodelEditor -e -viewSelected 0 $editorName\"\n" + + "\t\t\t\t\t\"modelPanel -edit -l (localizedPanelLabel(\\\"Persp View\\\")) -mbv $menusOkayInPanels $panelName;\\n$editorName = $panelName;\\nmodelEditor -e \\n -cam `findStartUpCamera persp` \\n -useInteractiveMode 0\\n -displayLights \\\"default\\\" \\n -displayAppearance \\\"smoothShaded\\\" \\n -activeOnly 0\\n -ignorePanZoom 0\\n -wireframeOnShaded 0\\n -headsUpDisplay 1\\n -holdOuts 1\\n -selectionHiliteDisplay 1\\n -useDefaultMaterial 0\\n -bufferMode \\\"double\\\" \\n -twoSidedLighting 0\\n -backfaceCulling 0\\n -xray 0\\n -jointXray 0\\n -activeComponentsXray 0\\n -displayTextures 0\\n -smoothWireframe 0\\n -lineWidth 1\\n -textureAnisotropic 0\\n -textureHilight 1\\n -textureSampling 2\\n -textureDisplay \\\"modulate\\\" \\n -textureMaxSize 16384\\n -fogging 0\\n -fogSource \\\"fragment\\\" \\n -fogMode \\\"linear\\\" \\n -fogStart 0\\n -fogEnd 100\\n -fogDensity 0.1\\n -fogColor 0.5 0.5 0.5 1 \\n -depthOfFieldPreview 1\\n -maxConstantTransparency 1\\n -rendererName \\\"vp2Renderer\\\" \\n -objectFilterShowInHUD 1\\n -isFiltered 0\\n -colorResolution 256 256 \\n -bumpResolution 512 512 \\n -textureCompression 0\\n -transparencyAlgorithm \\\"frontAndBackCull\\\" \\n -transpInShadows 0\\n -cullingOverride \\\"none\\\" \\n -lowQualityLighting 0\\n -maximumNumHardwareLights 1\\n -occlusionCulling 0\\n -shadingModel 0\\n -useBaseRenderer 0\\n -useReducedRenderer 0\\n -smallObjectCulling 0\\n -smallObjectThreshold -1 \\n -interactiveDisableShadows 0\\n -interactiveBackFaceCull 0\\n -sortTransparent 1\\n -nurbsCurves 1\\n -nurbsSurfaces 1\\n -polymeshes 1\\n -subdivSurfaces 1\\n -planes 1\\n -lights 1\\n -cameras 1\\n -controlVertices 1\\n -hulls 1\\n -grid 1\\n -imagePlane 1\\n -joints 1\\n -ikHandles 1\\n -deformers 1\\n -dynamics 1\\n -particleInstancers 1\\n -fluids 1\\n -hairSystems 1\\n -follicles 1\\n -nCloths 1\\n -nParticles 1\\n -nRigids 1\\n -dynamicConstraints 1\\n -locators 1\\n -manipulators 1\\n -pluginShapes 1\\n -dimensions 1\\n -handles 1\\n -pivots 1\\n -textures 1\\n -strokes 1\\n -motionTrails 1\\n -clipGhosts 1\\n -greasePencils 1\\n -shadows 0\\n -captureSequenceNumber -1\\n -width 1531\\n -height 1022\\n -sceneRenderFilter 0\\n $editorName;\\nmodelEditor -e -viewSelected 0 $editorName\"\n" + + "\t\t\t\t$configName;\n\n setNamedPanelLayout (localizedPanelLabel(\"Current Layout\"));\n }\n\n panelHistory -e -clear mainPanelHistory;\n setFocus `paneLayout -q -p1 $gMainPane`;\n sceneUIReplacement -deleteRemaining;\n sceneUIReplacement -clear;\n\t}\n\n\ngrid -spacing 5 -size 12 -divisions 5 -displayAxes yes -displayGridLines yes -displayDivisionLines yes -displayPerspectiveLabels no -displayOrthographicLabels no -displayAxesBold yes -perspectiveLabelPosition axis -orthographicLabelPosition edge;\nviewManip -drawCompass 0 -compassAngle 0 -frontParameters \"\" -homeParameters \"\" -selectionLockParameters \"\";\n}\n"); + setAttr ".st" 3; +select -ne :time1; + setAttr -k on ".cch"; + setAttr -k on ".nds"; + setAttr ".o" 1; + setAttr ".unw" 1; +select -ne :hardwareRenderingGlobals; + setAttr ".otfna" -type "stringArray" 18 "NURBS Curves" "NURBS Surfaces" "Polygons" "Subdiv Surfaces" "Particles" "Fluids" "Image Planes" "UI:" "Lights" "Cameras" "Locators" "Joints" "IK Handles" "Deformers" "Motion Trails" "Components" "Misc. UI" "Ornaments" ; + setAttr ".otfva" -type "Int32Array" 18 0 1 1 1 1 1 + 1 0 0 0 0 0 0 0 0 0 0 0 ; + setAttr ".vac" 2; +select -ne :renderPartition; + setAttr -k on ".cch"; + setAttr -k on ".nds"; + setAttr -s 2 ".st"; +select -ne :renderGlobalsList1; + setAttr -k on ".cch"; + setAttr -k on ".nds"; +select -ne :defaultShaderList1; + setAttr -k on ".cch"; + setAttr -k on ".nds"; + setAttr -s 4 ".s"; +select -ne :postProcessList1; + setAttr -k on ".cch"; + setAttr -k on ".nds"; + setAttr -s 2 ".p"; +select -ne :defaultRenderingList1; +select -ne :initialShadingGroup; + setAttr -k on ".cch"; + setAttr -k on ".nds"; + setAttr -s 2 ".dsm"; + setAttr -k on ".mwc"; + setAttr ".ro" yes; +select -ne :initialParticleSE; + setAttr -k on ".cch"; + setAttr -k on ".nds"; + setAttr -k on ".mwc"; + setAttr ".ro" yes; +select -ne :defaultRenderGlobals; + setAttr ".ep" 1; +select -ne :defaultResolution; + setAttr -k on ".cch"; + setAttr -k on ".nds"; + setAttr -av ".w" 640; + setAttr -av ".h" 480; + setAttr -k on ".pa" 1; + setAttr -k on ".al"; + setAttr -av ".dar" 1.3333332538604736; + setAttr -k on ".ldar"; + setAttr -k on ".off"; + setAttr -k on ".fld"; + setAttr -k on ".zsl"; +select -ne :defaultLightSet; + setAttr -k on ".cch"; + setAttr -k on ".nds"; + setAttr -k on ".mwc"; + setAttr ".ro" yes; +select -ne :defaultColorMgtGlobals; + setAttr ".cme" no; +select -ne :hardwareRenderGlobals; + setAttr -k on ".cch"; + setAttr -k on ".nds"; + setAttr ".ctrs" 256; + setAttr ".btrs" 512; +connectAttr "sphere.msg" "group.testMessage" -l on; +connectAttr "sphere.ty" "sphere.testConnect"; +connectAttr "sphere_testAnimated.o" "sphere.testAnimated"; +connectAttr "group.msg" "sphere.testMessage" -l on; +connectAttr "pCube1.sz" "sphere.testProxy"; +connectAttr "srcPolySphere.out" "sphereShape.i"; +connectAttr "polyCube1.out" "pCubeShape1.i"; +relationship "link" ":lightLinker1" ":initialShadingGroup.message" ":defaultLightSet.message"; +relationship "link" ":lightLinker1" ":initialParticleSE.message" ":defaultLightSet.message"; +relationship "shadowLink" ":lightLinker1" ":initialShadingGroup.message" ":defaultLightSet.message"; +relationship "shadowLink" ":lightLinker1" ":initialParticleSE.message" ":defaultLightSet.message"; +connectAttr "layerManager.dli[0]" "defaultLayer.id"; +connectAttr "renderLayerManager.rlmi[0]" "defaultRenderLayer.rlid"; +connectAttr "sphere.iog" "lockedSet.dsm" -l on -na; +connectAttr "defaultRenderLayer.msg" ":defaultRenderingList1.r" -na; +connectAttr "sphereShape.iog" ":initialShadingGroup.dsm" -na; +connectAttr "pCubeShape1.iog" ":initialShadingGroup.dsm" -na; +// End of sphere.ma diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test.ma b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test.ma new file mode 100644 index 0000000..d89fb42 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test.ma @@ -0,0 +1,187 @@ +//Maya ASCII 2013 scene +//Name: test.ma +//Last modified: Thu, Jun 26, 2014 01:46:47 PM +//Codeset: UTF-8 +requires maya "2013"; +currentUnit -l centimeter -a degree -t film; +fileInfo "application" "maya"; +fileInfo "product" "Maya 2013"; +fileInfo "version" "2013 Service Pack 2P12 x64"; +fileInfo "cutIdentifier" "201304120319-868747"; +fileInfo "osv" "Linux 3.5.4-2.10-desktop #1 SMP PREEMPT Fri Oct 5 14:56:49 CEST 2012 x86_64"; +createNode animCurveTA -n "DELETE_NODE_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 45 10 30.81018202226841; + setAttr -k on ".fullname" -type "string" "srcSphere:sphere.rotateX"; +createNode animCurveTU -n "DELETE_NODE_testEnum"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 9; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 10 1; + setAttr -s 2 ".kot[0:1]" 5 5; + setAttr -k on ".fullname" -type "string" "srcSphere:sphere.testEnum"; +createNode animCurveTL -n "DELETE_NODE_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0 10 0; + setAttr -k on ".fullname" -type "string" "srcSphere:sphere.translateX"; +createNode animCurveTL -n "DELETE_NODE_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 8 10 8; + setAttr -k on ".fullname" -type "string" "srcSphere:sphere.translateY"; +createNode animCurveTL -n "DELETE_NODE_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 -12 10 11.214436147065292; + setAttr -k on ".fullname" -type "string" "srcSphere:sphere.translateZ"; +createNode animCurveTA -n "DELETE_NODE_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 25 10 -82.269409864294204; + setAttr -k on ".fullname" -type "string" "srcSphere:sphere.rotateY"; +createNode animCurveTU -n "DELETE_NODE_testFloat"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0.666 10 0.666; + setAttr -k on ".fullname" -type "string" "srcSphere:sphere.testFloat"; +createNode animCurveTU -n "DELETE_NODE_testAnimated"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0 10 10; + setAttr -k on ".fullname" -type "string" "srcSphere:sphere.testAnimated"; +createNode animCurveTU -n "DELETE_NODE_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0.25 10 0.42958527814637792; + setAttr -k on ".fullname" -type "string" "srcSphere:sphere.scaleX"; +createNode animCurveTU -n "DELETE_NODE_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1.5 10 2.5775116688782669; + setAttr -k on ".fullname" -type "string" "srcSphere:sphere.scaleY"; +createNode animCurveTU -n "DELETE_NODE_visibility"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 9; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 10 1; + setAttr -s 2 ".kot[0:1]" 5 5; + setAttr -k on ".fullname" -type "string" "srcSphere:sphere.visibility"; +createNode animCurveTU -n "DELETE_NODE_testVectorX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0.2 10 0.2; + setAttr -k on ".fullname" -type "string" "srcSphere:sphere.testVectorX"; +createNode animCurveTU -n "DELETE_NODE_testVectorY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1.4 10 1.4; + setAttr -k on ".fullname" -type "string" "srcSphere:sphere.testVectorY"; +createNode animCurveTA -n "DELETE_NODE_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 90 10 149.70880463068096; + setAttr -k on ".fullname" -type "string" "srcSphere:sphere.rotateZ"; +createNode animCurveTU -n "DELETE_NODE_testVectorZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 2.6 10 2.6; + setAttr -k on ".fullname" -type "string" "srcSphere:sphere.testVectorZ"; +createNode animCurveTU -n "DELETE_NODE_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0.5 10 0.85917055629275585; + setAttr -k on ".fullname" -type "string" "srcSphere:sphere.scaleZ"; +createNode animCurveTU -n "DELETE_NODE_testInteger"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 5 10 5; + setAttr -k on ".fullname" -type "string" "srcSphere:sphere.testInteger"; +createNode animCurveTU -n "DELETE_NODE_testBoolean"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 9; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 10 1; + setAttr -s 2 ".kot[0:1]" 5 5; + setAttr -k on ".fullname" -type "string" "srcSphere:sphere.testBoolean"; +select -ne :time1; + setAttr -k on ".cch"; + setAttr -k on ".nds"; + setAttr ".o" 10; + setAttr ".unw" 10; +select -ne :renderPartition; + setAttr -k on ".cch"; + setAttr -k on ".nds"; + setAttr -s 2 ".st"; +select -ne :initialShadingGroup; + setAttr -k on ".cch"; + setAttr -k on ".nds"; + setAttr -s 2 ".dsm"; + setAttr -k on ".mwc"; + setAttr ".ro" yes; +select -ne :initialParticleSE; + setAttr -k on ".cch"; + setAttr -k on ".nds"; + setAttr -k on ".mwc"; + setAttr ".ro" yes; +select -ne :defaultShaderList1; + setAttr -k on ".cch"; + setAttr -k on ".nds"; + setAttr -s 2 ".s"; +select -ne :postProcessList1; + setAttr -k on ".cch"; + setAttr -k on ".nds"; + setAttr -s 2 ".p"; +select -ne :defaultRenderingList1; + setAttr -s 3 ".r"; +select -ne :renderGlobalsList1; + setAttr -k on ".cch"; + setAttr -k on ".nds"; +select -ne :defaultResolution; + setAttr -k on ".cch"; + setAttr -k on ".nds"; + setAttr -av ".w"; + setAttr -av ".h"; + setAttr -k on ".pa" 1; + setAttr -k on ".al"; + setAttr -av ".dar"; + setAttr -k on ".ldar"; + setAttr -k on ".off"; + setAttr -k on ".fld"; + setAttr -k on ".zsl"; +select -ne :defaultLightSet; + setAttr -k on ".cch"; + setAttr -k on ".nds"; + setAttr -k on ".mwc"; + setAttr ".ro" yes; +select -ne :hardwareRenderGlobals; + setAttr -k on ".cch"; + setAttr -k on ".nds"; + setAttr ".ctrs" 256; + setAttr ".btrs" 512; +select -ne :hardwareRenderingGlobals; + setAttr ".otfna" -type "stringArray" 18 "NURBS Curves" "NURBS Surfaces" "Polygons" "Subdiv Surfaces" "Particles" "Fluids" "Image Planes" "UI:" "Lights" "Cameras" "Locators" "Joints" "IK Handles" "Deformers" "Motion Trails" "Components" "Misc. UI" "Ornaments" ; + setAttr ".otfva" -type "Int32Array" 18 0 1 1 1 1 1 + 1 0 0 0 0 0 0 0 0 0 0 0 ; +select -ne :defaultHardwareRenderGlobals; + setAttr -k on ".cch"; + setAttr -k on ".nds"; + setAttr ".fn" -type "string" "im"; + setAttr ".res" -type "string" "ntsc_4d 646 485 1.333"; +// End of test.ma diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_anim.ma b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_anim.ma new file mode 100644 index 0000000..036f61e --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_anim.ma @@ -0,0 +1,429 @@ +//Maya ASCII 2014 scene +//Name: test_anim.ma +//Last modified: Sat, Mar 14, 2015 04:31:24 AM +//Codeset: 1252 +file -rdi 1 -ns "srcSphere" -rfn "srcSphereRN" "C:/Users/hovel/Dropbox/packages/python/Lib/site-packages/studioLibrary/site-packages/mutils/tests/data/sphere.ma"; +file -rdi 1 -ns "dstSphere" -rfn "dstSphereRN" "C:/Users/hovel/Dropbox/packages/python/Lib/site-packages/studioLibrary/site-packages/mutils/tests/data/sphere.ma"; +file -r -ns "srcSphere" -dr 1 -rfn "srcSphereRN" "C:/Users/hovel/Dropbox/packages/python/Lib/site-packages/studioLibrary/site-packages/mutils/tests/data/sphere.ma"; +file -r -ns "dstSphere" -dr 1 -rfn "dstSphereRN" "C:/Users/hovel/Dropbox/packages/python/Lib/site-packages/studioLibrary/site-packages/mutils/tests/data/sphere.ma"; +requires maya "2014"; +currentUnit -l centimeter -a degree -t film; +fileInfo "application" "maya"; +fileInfo "product" "Maya 2014"; +fileInfo "version" "2014 x64"; +fileInfo "cutIdentifier" "201303010241-864206"; +fileInfo "osv" "Microsoft Windows 7 Ultimate Edition, 64-bit Windows 7 Service Pack 1 (Build 7601)\n"; +createNode transform -s -n "persp"; + setAttr ".v" no; + setAttr ".t" -type "double3" -123.17900131274617 74.628663135067598 32.661032572240735 ; + setAttr ".r" -type "double3" -30.338352727390017 -72.599999999996271 0 ; +createNode camera -s -n "perspShape" -p "persp"; + setAttr -k off ".v" no; + setAttr ".fl" 34.999999999999993; + setAttr ".coi" 150.42418693917088; + setAttr ".imn" -type "string" "persp"; + setAttr ".den" -type "string" "persp_depth"; + setAttr ".man" -type "string" "persp_mask"; + setAttr ".hc" -type "string" "viewSet -p %camera"; +createNode transform -s -n "top"; + setAttr ".v" no; + setAttr ".t" -type "double3" 0 100.1 0 ; + setAttr ".r" -type "double3" -89.999999999999986 0 0 ; +createNode camera -s -n "topShape" -p "top"; + setAttr -k off ".v" no; + setAttr ".rnd" no; + setAttr ".coi" 100.1; + setAttr ".ow" 30; + setAttr ".imn" -type "string" "top"; + setAttr ".den" -type "string" "top_depth"; + setAttr ".man" -type "string" "top_mask"; + setAttr ".hc" -type "string" "viewSet -t %camera"; + setAttr ".o" yes; +createNode transform -s -n "front"; + setAttr ".v" no; + setAttr ".t" -type "double3" 2.0350096678112575 0.39361762628711539 100.1 ; +createNode camera -s -n "frontShape" -p "front"; + setAttr -k off ".v" no; + setAttr ".rnd" no; + setAttr ".coi" 100.1; + setAttr ".ow" 61.766282942468983; + setAttr ".imn" -type "string" "front"; + setAttr ".den" -type "string" "front_depth"; + setAttr ".man" -type "string" "front_mask"; + setAttr ".hc" -type "string" "viewSet -f %camera"; + setAttr ".o" yes; +createNode transform -s -n "side"; + setAttr ".v" no; + setAttr ".t" -type "double3" 100.1 0 0 ; + setAttr ".r" -type "double3" 0 89.999999999999986 0 ; +createNode camera -s -n "sideShape" -p "side"; + setAttr -k off ".v" no; + setAttr ".rnd" no; + setAttr ".coi" 100.1; + setAttr ".ow" 30; + setAttr ".imn" -type "string" "side"; + setAttr ".den" -type "string" "side_depth"; + setAttr ".man" -type "string" "side_mask"; + setAttr ".hc" -type "string" "viewSet -s %camera"; + setAttr ".o" yes; +createNode lightLinker -s -n "lightLinker1"; + setAttr -s 2 ".lnk"; + setAttr -s 2 ".slnk"; +createNode displayLayerManager -n "layerManager"; +createNode displayLayer -n "defaultLayer"; +createNode renderLayerManager -n "renderLayerManager"; +createNode renderLayer -n "defaultRenderLayer"; + setAttr ".g" yes; +createNode script -n "sceneConfigurationScriptNode"; + setAttr ".b" -type "string" "playbackOptions -min 1 -max 24 -ast 1 -aet 48 "; + setAttr ".st" 6; +createNode reference -n "srcSphereRN"; + setAttr -s 16 ".phl"; + setAttr ".phl[1]" 0; + setAttr ".phl[2]" 0; + setAttr ".phl[3]" 0; + setAttr ".phl[4]" 0; + setAttr ".phl[5]" 0; + setAttr ".phl[6]" 0; + setAttr ".phl[7]" 0; + setAttr ".phl[8]" 0; + setAttr ".phl[9]" 0; + setAttr ".phl[10]" 0; + setAttr ".phl[11]" 0; + setAttr ".phl[12]" 0; + setAttr ".phl[13]" 0; + setAttr ".phl[14]" 0; + setAttr ".phl[15]" 0; + setAttr ".phl[16]" 0; + setAttr ".ed" -type "dataReferenceEdits" + "srcSphereRN" + "srcSphereRN" 0 + "srcSphereRN" 45 + 1 |srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere + "testStatic" "testStatic" " -ci 1 -at \"double\"" + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode" "visibility" " 1" + + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode" "translate" " -type \"double3\" 0 5 0" + + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode" "translateX" " -av" + + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode" "translateY" " -av" + + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode" "translateZ" " -av" + + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode" "rotate" " -type \"double3\" 0 0 0" + + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode" "rotateX" " -av" + + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode" "rotateY" " -av" + + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode" "rotateZ" " -av" + + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode" "scale" " -type \"double3\" 1 1 1" + + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere" + "translate" " -type \"double3\" 0 8 -12" + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere" + "translateZ" " -av" + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere" + "rotate" " -type \"double3\" 45 50 90" + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere" + "rotateX" " -av" + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere" + "rotateY" " -av" + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere" + "rotateZ" " -av" + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere" + "scale" " -type \"double3\" 0.25 4.66 0.5" + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere" + "scaleX" " -av" + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere" + "scaleY" " -av" + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere" + "scaleZ" " -av" + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere" + "testVector" " -k 1 -type \"double3\" 0.2 1.4 2.6" + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere" + "testVector" " -k 1" + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere" + "testVectorX" " -k 1" + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere" + "testVectorY" " -av -k 1" + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere" + "testVectorZ" " -k 1" + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere" + "testColor" " -type \"float3\" 0.18 0.6 0.18" + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere" + "testString" " -k 1 -type \"string\" \"Hello world\"" + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere" + "testStatic" " -k 1 0" + 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode.translateZ" + "srcSphereRN.placeHolderList[1]" "" + 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.testVectorX" + "srcSphereRN.placeHolderList[2]" "" + 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.testVectorY" + "srcSphereRN.placeHolderList[3]" "" + 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.testVectorZ" + "srcSphereRN.placeHolderList[4]" "" + 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.testEnum" + "srcSphereRN.placeHolderList[5]" "" + 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.testFloat" + "srcSphereRN.placeHolderList[6]" "" + 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.testBoolean" + "srcSphereRN.placeHolderList[7]" "" + 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.testInteger" + "srcSphereRN.placeHolderList[8]" "" + 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.translateY" + "srcSphereRN.placeHolderList[9]" "" + 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.translateX" + "srcSphereRN.placeHolderList[10]" "" + 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.translateZ" + "srcSphereRN.placeHolderList[11]" "" + 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.rotateX" + "srcSphereRN.placeHolderList[12]" "" + 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.rotateZ" + "srcSphereRN.placeHolderList[13]" "" + 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.scaleX" + "srcSphereRN.placeHolderList[14]" "" + 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.scaleZ" + "srcSphereRN.placeHolderList[15]" "" + 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.visibility" + "srcSphereRN.placeHolderList[16]" ""; + setAttr ".ptag" -type "string" ""; +lockNode -l 1 ; +createNode reference -n "dstSphereRN"; + setAttr ".ed" -type "dataReferenceEdits" + "dstSphereRN" + "dstSphereRN" 0; + setAttr ".ptag" -type "string" ""; +lockNode -l 1 ; +createNode animCurveTU -n "srcSphere:sphere_visibility"; + setAttr ".tan" 9; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 10 1; + setAttr -s 2 ".kot[0:1]" 5 5; +createNode animCurveTL -n "srcSphere:sphere_translateX"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0 10 0; +createNode animCurveTL -n "srcSphere:sphere_translateY"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 8 10 8; +createNode animCurveTL -n "srcSphere:sphere_translateZ"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 -12 10 11.214436147065292; +createNode animCurveTA -n "srcSphere:sphere_rotateX"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 45 10 30.81018202226841; +createNode animCurveTA -n "srcSphere:sphere_rotateZ"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 90 10 149.70880463068096; +createNode animCurveTU -n "srcSphere:sphere_scaleX"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0.25 10 0.42958527814637792; +createNode animCurveTU -n "srcSphere:sphere_scaleZ"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0.5 10 0.85917055629275585; +createNode animCurveTU -n "srcSphere:sphere_testVectorX"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0.2 10 0.2; +createNode animCurveTU -n "srcSphere:sphere_testVectorY"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1.4 10 1.4; +createNode animCurveTU -n "srcSphere:sphere_testVectorZ"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 2.6 10 2.6; +createNode animCurveTU -n "srcSphere:sphere_testEnum"; + setAttr ".tan" 9; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 10 1; + setAttr -s 2 ".kot[0:1]" 5 5; +createNode animCurveTU -n "srcSphere:sphere_testFloat"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0.666 10 0.666; +createNode animCurveTU -n "srcSphere:sphere_testBoolean"; + setAttr ".tan" 9; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 10 1; + setAttr -s 2 ".kot[0:1]" 5 5; +createNode animCurveTU -n "srcSphere:sphere_testInteger"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 5 10 5; +createNode animCurveTL -n "dstSphere:sphere_translateY"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 8 10 8; +createNode animCurveTL -n "lockedNode_translateZ"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0 10 15; +createNode animCurveTU -n "sphere_testInteger"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 5 10 5; +createNode animCurveTU -n "sphere_testEnum"; + setAttr ".tan" 9; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 10 1; + setAttr -s 2 ".kot[0:1]" 5 5; +createNode animCurveTL -n "sphere_translateX"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0 10 0; +createNode animCurveTL -n "sphere_translateZ"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 -12 10 11.214436147065292; +createNode animCurveTU -n "sphere_testFloat"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0.666 10 0.666; +createNode animCurveTU -n "sphere_scaleX"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0.25 10 0.42958527814637792; +createNode animCurveTU -n "sphere_testVectorZ"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 2.6 10 2.6; +createNode animCurveTU -n "sphere_scaleZ"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0.5 10 0.85917055629275585; +createNode animCurveTA -n "sphere_rotateX"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 45 10 30.81018202226841; +createNode animCurveTU -n "sphere_testVectorY"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1.4 10 1.4; +createNode animCurveTA -n "sphere_rotateZ"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 90 10 149.70880463068096; +createNode animCurveTU -n "sphere_visibility"; + setAttr ".tan" 9; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 10 1; + setAttr -s 2 ".kot[0:1]" 5 5; +createNode animCurveTU -n "sphere_testVectorX"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0.2 10 0.2; +createNode animCurveTU -n "sphere_testBoolean"; + setAttr ".tan" 9; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 10 1; + setAttr -s 2 ".kot[0:1]" 5 5; +createNode animCurveTL -n "lockedNode_translateZ1"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0 10 15; +createNode reference -n "sharedReferenceNode"; + setAttr ".ed" -type "dataReferenceEdits" + "sharedReferenceNode"; +select -ne :time1; + setAttr -k on ".cch"; + setAttr -k on ".nds"; + setAttr ".o" 1; + setAttr ".unw" 1; +select -ne :renderPartition; + setAttr -k on ".cch"; + setAttr -k on ".nds"; + setAttr -s 2 ".st"; +select -ne :initialShadingGroup; + setAttr -k on ".cch"; + setAttr -k on ".nds"; + setAttr -s 2 ".dsm"; + setAttr -k on ".mwc"; + setAttr ".ro" yes; +select -ne :initialParticleSE; + setAttr -k on ".cch"; + setAttr -k on ".nds"; + setAttr -k on ".mwc"; + setAttr ".ro" yes; +select -ne :defaultShaderList1; + setAttr -k on ".cch"; + setAttr -k on ".nds"; + setAttr -s 2 ".s"; +select -ne :postProcessList1; + setAttr -k on ".cch"; + setAttr -k on ".nds"; + setAttr -s 2 ".p"; +select -ne :defaultRenderingList1; + setAttr -s 6 ".r"; +select -ne :renderGlobalsList1; + setAttr -k on ".cch"; + setAttr -k on ".nds"; +select -ne :defaultRenderGlobals; + setAttr ".ep" 1; +select -ne :defaultResolution; + setAttr -k on ".cch"; + setAttr -k on ".nds"; + setAttr -av ".w" 640; + setAttr -av ".h" 480; + setAttr -k on ".pa" 1; + setAttr -k on ".al"; + setAttr -av ".dar" 1.3333332538604736; + setAttr -k on ".ldar"; + setAttr -k on ".off"; + setAttr -k on ".fld"; + setAttr -k on ".zsl"; +select -ne :defaultLightSet; + setAttr -k on ".cch"; + setAttr -k on ".nds"; + setAttr -k on ".mwc"; + setAttr ".ro" yes; +select -ne :hardwareRenderGlobals; + setAttr -k on ".cch"; + setAttr -k on ".nds"; + setAttr ".ctrs" 256; + setAttr ".btrs" 512; +select -ne :hardwareRenderingGlobals; + setAttr ".otfna" -type "stringArray" 18 "NURBS Curves" "NURBS Surfaces" "Polygons" "Subdiv Surfaces" "Particles" "Fluids" "Image Planes" "UI:" "Lights" "Cameras" "Locators" "Joints" "IK Handles" "Deformers" "Motion Trails" "Components" "Misc. UI" "Ornaments" ; + setAttr ".otfva" -type "Int32Array" 18 0 1 1 1 1 1 + 1 0 0 0 0 0 0 0 0 0 0 0 ; +select -ne :defaultHardwareRenderGlobals; + setAttr -k on ".cch"; + setAttr -k on ".nds"; + setAttr ".fn" -type "string" "im"; + setAttr ".res" -type "string" "ntsc_4d 646 485 1.333"; +select -ne :ikSystem; + setAttr -s 4 ".sol"; +connectAttr "lockedNode_translateZ.o" "srcSphereRN.phl[1]"; +connectAttr "srcSphere:sphere_testVectorX.o" "srcSphereRN.phl[2]"; +connectAttr "srcSphere:sphere_testVectorY.o" "srcSphereRN.phl[3]"; +connectAttr "srcSphere:sphere_testVectorZ.o" "srcSphereRN.phl[4]"; +connectAttr "srcSphere:sphere_testEnum.o" "srcSphereRN.phl[5]"; +connectAttr "srcSphere:sphere_testFloat.o" "srcSphereRN.phl[6]"; +connectAttr "srcSphere:sphere_testBoolean.o" "srcSphereRN.phl[7]"; +connectAttr "srcSphere:sphere_testInteger.o" "srcSphereRN.phl[8]"; +connectAttr "srcSphere:sphere_translateY.o" "srcSphereRN.phl[9]"; +connectAttr "srcSphere:sphere_translateX.o" "srcSphereRN.phl[10]"; +connectAttr "srcSphere:sphere_translateZ.o" "srcSphereRN.phl[11]"; +connectAttr "srcSphere:sphere_rotateX.o" "srcSphereRN.phl[12]"; +connectAttr "srcSphere:sphere_rotateZ.o" "srcSphereRN.phl[13]"; +connectAttr "srcSphere:sphere_scaleX.o" "srcSphereRN.phl[14]"; +connectAttr "srcSphere:sphere_scaleZ.o" "srcSphereRN.phl[15]"; +connectAttr "srcSphere:sphere_visibility.o" "srcSphereRN.phl[16]"; +relationship "link" ":lightLinker1" ":initialShadingGroup.message" ":defaultLightSet.message"; +relationship "link" ":lightLinker1" ":initialParticleSE.message" ":defaultLightSet.message"; +relationship "shadowLink" ":lightLinker1" ":initialShadingGroup.message" ":defaultLightSet.message"; +relationship "shadowLink" ":lightLinker1" ":initialParticleSE.message" ":defaultLightSet.message"; +connectAttr "layerManager.dli[0]" "defaultLayer.id"; +connectAttr "renderLayerManager.rlmi[0]" "defaultRenderLayer.rlid"; +connectAttr "sharedReferenceNode.sr" "dstSphereRN.sr"; +connectAttr "defaultRenderLayer.msg" ":defaultRenderingList1.r" -na; +// End of test_anim.ma diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_bake_connected.anim/animation.ma b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_bake_connected.anim/animation.ma new file mode 100644 index 0000000..8f9113a --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_bake_connected.anim/animation.ma @@ -0,0 +1,29 @@ +//Maya ASCII 2016 scene +//Name: animation.ma +//Last modified: Tue, Aug 09, 2016 08:47:07 AM +//Codeset: 1252 +requires maya "2016"; +currentUnit -l centimeter -a degree -t film; +fileInfo "application" "maya"; +fileInfo "product" "Maya 2016"; +fileInfo "version" "2016"; +fileInfo "cutIdentifier" "201502261600-953408"; +fileInfo "osv" "Microsoft Windows 8 Business Edition, 64-bit (Build 9200)\n"; +createNode animCurveTU -n "CURVE1"; + rename -uid "B3A2D98C-465C-F630-EA7F-7A960B6B0B4D"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0 10 10; +createNode animCurveTU -n "CURVE2"; + rename -uid "3A3C753F-43CD-18A5-3E19-E9B3F445D832"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 10 ".ktv[0:9]" 1 8 2 8 3 8 4 8 5 8 6 8 7 8 8 8 9 8 10 8; + setAttr -s 10 ".kit[9]" 1; + setAttr -s 10 ".kot[0:9]" 1 18 18 18 18 18 18 18 + 18 18; + setAttr -s 10 ".kix[9]" 1; + setAttr -s 10 ".kiy[9]" 0; + setAttr -s 10 ".kox[0:9]" 1 1 1 1 1 1 1 1 1 1; + setAttr -s 10 ".koy[0:9]" 0 0 0 0 0 0 0 0 0 0; +// End \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_bake_connected.anim/animation.mb b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_bake_connected.anim/animation.mb new file mode 100644 index 0000000..a5aefe6 Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_bake_connected.anim/animation.mb differ diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_bake_connected.anim/pose.json b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_bake_connected.anim/pose.json new file mode 100644 index 0000000..f747de5 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_bake_connected.anim/pose.json @@ -0,0 +1,224 @@ +{ + "metadata": { + "mayaSceneFile": "C:/Users/hovel/Dropbox/git/site-packages/studiolibrary/packages/mutils/tests/data/test_bake_connected.ma", + "angularUnit": "deg", + "ctime": "1518341545", + "endFrame": 10, + "linearUnit": "cm", + "version": "1.0.0", + "user": "Hovel", + "startFrame": 1, + "timeUnit": "film", + "mayaVersion": "2017" + } +, + "objects": { + "srcSphere:offset": { + "attrs": {} + }, + "srcSphere:group": { + "attrs": { + "translateX": { + "curve": "CURVE1", + "type": "doubleLinear", + "value": 0.0 + }, + "translateY": { + "curve": "CURVE2", + "type": "doubleLinear", + "value": 0.0 + }, + "translateZ": { + "curve": "CURVE3", + "type": "doubleLinear", + "value": 18.1320010846965 + }, + "scaleX": { + "type": "double", + "value": 1.0 + }, + "scaleY": { + "type": "double", + "value": 1.0 + }, + "visibility": { + "type": "bool", + "value": true + }, + "rotateX": { + "type": "doubleAngle", + "value": 0.0 + }, + "rotateY": { + "type": "doubleAngle", + "value": 0.0 + }, + "rotateZ": { + "type": "doubleAngle", + "value": 0.0 + }, + "scaleZ": { + "type": "double", + "value": 1.0 + } + } + }, + "srcSphere:sphere": { + "attrs": { + "testInteger": { + "curve": "CURVE5", + "type": "long", + "value": 5 + }, + "testProxy": { + "type": "double", + "value": 1.0 + }, + "scaleY": { + "type": "double", + "value": 4.66 + }, + "testLimit": { + "type": "double", + "value": 10.0 + }, + "testConnect": { + "curve": "CURVE6", + "type": "double", + "value": 8.0 + }, + "testEnum": { + "curve": "CURVE7", + "type": "enum", + "value": 1 + }, + "scaleX": { + "curve": "CURVE8", + "type": "double", + "value": 0.4295852781463779 + }, + "testString": { + "type": "string", + "value": "Hello world" + }, + "scaleZ": { + "curve": "CURVE9", + "type": "double", + "value": 0.8591705562927558 + }, + "rotateX": { + "curve": "CURVE10", + "type": "doubleAngle", + "value": 30.81018202226841 + }, + "rotateY": { + "type": "doubleAngle", + "value": 50.0 + }, + "rotateZ": { + "curve": "CURVE11", + "type": "doubleAngle", + "value": 149.70880463068096 + }, + "translateX": { + "curve": "CURVE12", + "type": "doubleLinear", + "value": 0.0 + }, + "translateY": { + "curve": "CURVE13", + "type": "doubleLinear", + "value": 8.0 + }, + "translateZ": { + "curve": "CURVE14", + "type": "doubleLinear", + "value": 11.214436147065292 + }, + "visibility": { + "curve": "CURVE15", + "type": "bool", + "value": true + }, + "testFloat": { + "curve": "CURVE16", + "type": "double", + "value": 0.666 + }, + "testAnimated": { + "curve": "CURVE17", + "type": "double", + "value": 10.0 + }, + "testVectorX": { + "curve": "CURVE18", + "type": "double", + "value": 0.2 + }, + "testVectorY": { + "curve": "CURVE19", + "type": "double", + "value": 1.4 + }, + "testVectorZ": { + "curve": "CURVE20", + "type": "double", + "value": 2.6 + }, + "testBoolean": { + "curve": "CURVE21", + "type": "bool", + "value": true + } + } + }, + "srcSphere:lockedNode": { + "attrs": { + "translateX": { + "type": "doubleLinear", + "value": 0.0 + }, + "translateY": { + "type": "doubleLinear", + "value": 5.0 + }, + "translateZ": { + "curve": "CURVE23", + "type": "doubleLinear", + "value": 15.0 + }, + "scaleX": { + "type": "double", + "value": 1.0 + }, + "scaleY": { + "type": "double", + "value": 1.0 + }, + "visibility": { + "type": "bool", + "value": true + }, + "rotateX": { + "curve": "CURVE24", + "type": "doubleAngle", + "value": 0.0 + }, + "rotateY": { + "curve": "CURVE25", + "type": "doubleAngle", + "value": -69.84190849889626 + }, + "rotateZ": { + "curve": "CURVE26", + "type": "doubleAngle", + "value": 0.0 + }, + "scaleZ": { + "type": "double", + "value": 1.0 + } + } + } + } +} \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_bake_connected.ma b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_bake_connected.ma new file mode 100644 index 0000000..4a8ff16 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_bake_connected.ma @@ -0,0 +1,636 @@ +//Maya ASCII 2013 scene +//Name: test_bake_connections.ma +//Last modified: Wed, Aug 20, 2014 02:40:58 PM +//Codeset: UTF-8 +file -rdi 1 -ns "srcSphere" -rfn "srcSphereRN" "C:/Users/hovel/Dropbox/packages/python/Lib/site-packages/studioLibrary/site-packages/mutils/tests/data/sphere.ma"; +file -rdi 1 -ns "dstSphere" -rfn "dstSphereRN" "C:/Users/hovel/Dropbox/packages/python/Lib/site-packages/studioLibrary/site-packages/mutils/tests/data/sphere.ma"; +file -r -ns "srcSphere" -dr 1 -rfn "srcSphereRN" "C:/Users/hovel/Dropbox/packages/python/Lib/site-packages/studioLibrary/site-packages/mutils/tests/data/sphere.ma"; +file -r -ns "dstSphere" -dr 1 -rfn "dstSphereRN" "C:/Users/hovel/Dropbox/packages/python/Lib/site-packages/studioLibrary/site-packages/mutils/tests/data/sphere.ma"; +requires maya "2013"; +requires "stereoCamera" "10.0"; +currentUnit -l centimeter -a degree -t film; +fileInfo "application" "maya"; +fileInfo "product" "Maya 2013"; +fileInfo "version" "2013 Service Pack 2P12 x64"; +fileInfo "cutIdentifier" "201304120319-868747"; +fileInfo "osv" "Linux 3.5.4-2.10-desktop #1 SMP PREEMPT Fri Oct 5 14:56:49 CEST 2012 x86_64"; +createNode transform -s -n "persp"; + setAttr ".v" no; + setAttr ".t" -type "double3" 7.1985912106548611 102.16300347609724 -144.90732864886502 ; + setAttr ".r" -type "double3" -30.938352727397543 -178.19999999999578 0 ; +createNode camera -s -n "perspShape" -p "persp"; + setAttr -k off ".v" no; + setAttr ".fl" 34.999999999999993; + setAttr ".coi" 163.53638497594133; + setAttr ".imn" -type "string" "persp"; + setAttr ".den" -type "string" "persp_depth"; + setAttr ".man" -type "string" "persp_mask"; + setAttr ".hc" -type "string" "viewSet -p %camera"; +createNode transform -s -n "top"; + setAttr ".v" no; + setAttr ".t" -type "double3" 0 100.1 0 ; + setAttr ".r" -type "double3" -89.999999999999986 0 0 ; +createNode camera -s -n "topShape" -p "top"; + setAttr -k off ".v" no; + setAttr ".rnd" no; + setAttr ".coi" 100.1; + setAttr ".ow" 30; + setAttr ".imn" -type "string" "top"; + setAttr ".den" -type "string" "top_depth"; + setAttr ".man" -type "string" "top_mask"; + setAttr ".hc" -type "string" "viewSet -t %camera"; + setAttr ".o" yes; +createNode transform -s -n "front"; + setAttr ".v" no; + setAttr ".t" -type "double3" 2.0350096678112575 0.39361762628711539 100.1 ; +createNode camera -s -n "frontShape" -p "front"; + setAttr -k off ".v" no; + setAttr ".rnd" no; + setAttr ".coi" 100.1; + setAttr ".ow" 61.766282942468983; + setAttr ".imn" -type "string" "front"; + setAttr ".den" -type "string" "front_depth"; + setAttr ".man" -type "string" "front_mask"; + setAttr ".hc" -type "string" "viewSet -f %camera"; + setAttr ".o" yes; +createNode transform -s -n "side"; + setAttr ".v" no; + setAttr ".t" -type "double3" 100.1 0 0 ; + setAttr ".r" -type "double3" 0 89.999999999999986 0 ; +createNode camera -s -n "sideShape" -p "side"; + setAttr -k off ".v" no; + setAttr ".rnd" no; + setAttr ".coi" 100.1; + setAttr ".ow" 30; + setAttr ".imn" -type "string" "side"; + setAttr ".den" -type "string" "side_depth"; + setAttr ".man" -type "string" "side_mask"; + setAttr ".hc" -type "string" "viewSet -s %camera"; + setAttr ".o" yes; +createNode transform -n "locator1"; +createNode locator -n "locatorShape1" -p "locator1"; + setAttr -k off ".v"; +createNode transform -n "locator2"; + setAttr ".t" -type "double3" 0 0 18.132001084696501 ; + setAttr ".s" -type "double3" 4.1257198596207596 4.1257198596207596 4.1257198596207596 ; +createNode locator -n "locatorShape2" -p "locator2"; + setAttr -k off ".v"; +createNode transform -n "srcSphereRNfosterParent1"; +createNode orientConstraint -n "lockedNode_orientConstraint1" -p "srcSphereRNfosterParent1"; + addAttr -ci true -k true -sn "w0" -ln "locator1W0" -dv 1 -min 0 -at "double"; + setAttr -k on ".nds"; + setAttr -k off ".v"; + setAttr -k off ".tx"; + setAttr -k off ".ty"; + setAttr -k off ".tz"; + setAttr -k off ".rx"; + setAttr -k off ".ry"; + setAttr -k off ".rz"; + setAttr -k off ".sx"; + setAttr -k off ".sy"; + setAttr -k off ".sz"; + setAttr ".erp" yes; + setAttr ".lr" -type "double3" 0 -69.84190849889626 0 ; + setAttr -k on ".w0"; +createNode lightLinker -s -n "lightLinker1"; + setAttr -s 2 ".lnk"; + setAttr -s 2 ".slnk"; +createNode displayLayerManager -n "layerManager"; +createNode displayLayer -n "defaultLayer"; +createNode renderLayerManager -n "renderLayerManager"; +createNode renderLayer -n "defaultRenderLayer"; + setAttr ".g" yes; +createNode script -n "sceneConfigurationScriptNode"; + setAttr ".b" -type "string" "playbackOptions -min 1 -max 24 -ast 1 -aet 48 "; + setAttr ".st" 6; +createNode reference -n "srcSphereRN"; + setAttr -s 22 ".phl"; + setAttr ".phl[1]" 0; + setAttr ".phl[2]" 0; + setAttr ".phl[3]" 0; + setAttr ".phl[4]" 0; + setAttr ".phl[5]" 0; + setAttr ".phl[6]" 0; + setAttr ".phl[7]" 0; + setAttr ".phl[8]" 0; + setAttr ".phl[9]" 0; + setAttr ".phl[10]" 0; + setAttr ".phl[11]" 0; + setAttr ".phl[12]" 0; + setAttr ".phl[13]" 0; + setAttr ".phl[14]" 0; + setAttr ".phl[15]" 0; + setAttr ".phl[16]" 0; + setAttr ".phl[17]" 0; + setAttr ".phl[18]" 0; + setAttr ".phl[19]" 0; + setAttr ".phl[20]" 0; + setAttr ".phl[21]" 0; + setAttr ".phl[22]" 0; + setAttr ".ed" -type "dataReferenceEdits" + "srcSphereRN" + "srcSphereRN" 0 + "srcSphereRN" 50 + 0 "|srcSphereRNfosterParent1|lockedNode_orientConstraint1" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode" + "-s -r " + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode" "visibility" " 1" + + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode" "translate" " -type \"double3\" 0 5 15" + + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode" "translateX" " -av" + + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode" "translateY" " -av" + + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode" "translateZ" " -av" + + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode" "rotate" " -type \"double3\" 0 -69.841908 0" + + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode" "rotateX" " -av" + + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode" "rotateY" " -av" + + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode" "rotateZ" " -av" + + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode" "scale" " -type \"double3\" 1 1 1" + + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere" + "translate" " -type \"double3\" 0 8 11.214436" + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere" + "translateZ" " -av" + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere" + "rotate" " -type \"double3\" 30.810182 50 149.708805" + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere" + "rotateX" " -av" + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere" + "rotateY" " -av" + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere" + "rotateZ" " -av" + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere" + "scale" " -type \"double3\" 0.429585 4.66 0.859171" + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere" + "scaleX" " -av" + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere" + "scaleY" " -av" + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere" + "scaleZ" " -av" + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere" + "testVector" " -k 1 -type \"double3\" 0.2 1.4 2.6" + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere" + "testVector" " -k 1" + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere" + "testVectorX" " -k 1" + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere" + "testVectorY" " -av -k 1" + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere" + "testVectorZ" " -k 1" + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere" + "testColor" " -type \"float3\" 0.18 0.6 0.18" + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere" + "testString" " -k 1 -type \"string\" \"Hello world\"" + 5 4 "srcSphereRN" "|srcSphere:group.translate" "srcSphereRN.placeHolderList[1]" + "" + 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode.translateZ" + "srcSphereRN.placeHolderList[2]" "" + 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode.rotateX" + "srcSphereRN.placeHolderList[3]" "" + 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode.rotateY" + "srcSphereRN.placeHolderList[4]" "" + 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode.rotateZ" + "srcSphereRN.placeHolderList[5]" "" + 5 3 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode.rotateOrder" + "srcSphereRN.placeHolderList[6]" "" + 5 3 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode.parentInverseMatrix" + "srcSphereRN.placeHolderList[7]" "" + 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.testVectorX" + "srcSphereRN.placeHolderList[8]" "" + 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.testVectorY" + "srcSphereRN.placeHolderList[9]" "" + 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.testVectorZ" + "srcSphereRN.placeHolderList[10]" "" + 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.testEnum" + "srcSphereRN.placeHolderList[11]" "" + 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.testFloat" + "srcSphereRN.placeHolderList[12]" "" + 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.testBoolean" + "srcSphereRN.placeHolderList[13]" "" + 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.testInteger" + "srcSphereRN.placeHolderList[14]" "" + 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.translateY" + "srcSphereRN.placeHolderList[15]" "" + 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.translateX" + "srcSphereRN.placeHolderList[16]" "" + 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.translateZ" + "srcSphereRN.placeHolderList[17]" "" + 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.rotateX" + "srcSphereRN.placeHolderList[18]" "" + 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.rotateZ" + "srcSphereRN.placeHolderList[19]" "" + 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.scaleX" + "srcSphereRN.placeHolderList[20]" "" + 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.scaleZ" + "srcSphereRN.placeHolderList[21]" "" + 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.visibility" + "srcSphereRN.placeHolderList[22]" ""; + setAttr ".ptag" -type "string" ""; +lockNode -l 1 ; +createNode reference -n "dstSphereRN"; + setAttr ".ed" -type "dataReferenceEdits" + "dstSphereRN" + "dstSphereRN" 0; + setAttr ".ptag" -type "string" ""; +lockNode -l 1 ; +createNode animCurveTU -n "srcSphere:sphere_visibility"; + setAttr ".tan" 9; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 10 1; + setAttr -s 2 ".kot[0:1]" 5 5; +createNode animCurveTL -n "srcSphere:sphere_translateX"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0 10 0; +createNode animCurveTL -n "srcSphere:sphere_translateY"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 8 10 8; +createNode animCurveTL -n "srcSphere:sphere_translateZ"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 -12 10 11.214436147065292; +createNode animCurveTA -n "srcSphere:sphere_rotateX"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 45 10 30.81018202226841; +createNode animCurveTA -n "srcSphere:sphere_rotateZ"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 90 10 149.70880463068096; +createNode animCurveTU -n "srcSphere:sphere_scaleX"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0.25 10 0.42958527814637792; +createNode animCurveTU -n "srcSphere:sphere_scaleZ"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0.5 10 0.85917055629275585; +createNode animCurveTU -n "srcSphere:sphere_testVectorX"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0.2 10 0.2; +createNode animCurveTU -n "srcSphere:sphere_testVectorY"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1.4 10 1.4; +createNode animCurveTU -n "srcSphere:sphere_testVectorZ"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 2.6 10 2.6; +createNode animCurveTU -n "srcSphere:sphere_testEnum"; + setAttr ".tan" 9; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 10 1; + setAttr -s 2 ".kot[0:1]" 5 5; +createNode animCurveTU -n "srcSphere:sphere_testFloat"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0.666 10 0.666; +createNode animCurveTU -n "srcSphere:sphere_testBoolean"; + setAttr ".tan" 9; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 10 1; + setAttr -s 2 ".kot[0:1]" 5 5; +createNode animCurveTU -n "srcSphere:sphere_testInteger"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 5 10 5; +createNode animCurveTL -n "dstSphere:sphere_translateY"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 8 10 8; +createNode animCurveTL -n "lockedNode_translateZ"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0 10 15; +createNode animCurveTU -n "sphere_testInteger"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 5 10 5; +createNode animCurveTU -n "sphere_testEnum"; + setAttr ".tan" 9; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 10 1; + setAttr -s 2 ".kot[0:1]" 5 5; +createNode animCurveTL -n "sphere_translateX"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0 10 0; +createNode animCurveTL -n "sphere_translateZ"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 -12 10 11.214436147065292; +createNode animCurveTU -n "sphere_testFloat"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0.666 10 0.666; +createNode animCurveTU -n "sphere_scaleX"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0.25 10 0.42958527814637792; +createNode animCurveTU -n "sphere_testVectorZ"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 2.6 10 2.6; +createNode animCurveTU -n "sphere_scaleZ"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0.5 10 0.85917055629275585; +createNode animCurveTA -n "sphere_rotateX"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 45 10 30.81018202226841; +createNode animCurveTU -n "sphere_testVectorY"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1.4 10 1.4; +createNode animCurveTA -n "sphere_rotateZ"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 90 10 149.70880463068096; +createNode animCurveTU -n "sphere_visibility"; + setAttr ".tan" 9; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 10 1; + setAttr -s 2 ".kot[0:1]" 5 5; +createNode animCurveTU -n "sphere_testVectorX"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0.2 10 0.2; +createNode animCurveTU -n "sphere_testBoolean"; + setAttr ".tan" 9; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 10 1; + setAttr -s 2 ".kot[0:1]" 5 5; +createNode animCurveTL -n "lockedNode_translateZ1"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0 10 15; +createNode reference -n "sharedReferenceNode"; + setAttr ".ed" -type "dataReferenceEdits" + "sharedReferenceNode"; +createNode animCurveTU -n "locator1_visibility"; + setAttr ".tan" 9; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 5 1 10 1; + setAttr -s 2 ".kot[0:1]" 5 5; +createNode animCurveTL -n "locator1_translateX"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 5 11.661339872825151 10 11.661339872825151; +createNode animCurveTL -n "locator1_translateY"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 5 13.237957579056641 10 13.237957579056641; +createNode animCurveTL -n "locator1_translateZ"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 5 11.944644232286457 10 11.944644232286457; +createNode animCurveTA -n "locator1_rotateX"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 5 0 10 0; +createNode animCurveTA -n "locator1_rotateY"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 5 0 10 -69.84190849889626; +createNode animCurveTA -n "locator1_rotateZ"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 5 0 10 0; +createNode animCurveTU -n "locator1_scaleX"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 5 4.0680107858594825 10 4.0680107858594825; +createNode animCurveTU -n "locator1_scaleY"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 5 4.0680107858594825 10 4.0680107858594825; +createNode animCurveTU -n "locator1_scaleZ"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 5 4.0680107858594825 10 4.0680107858594825; +select -ne :time1; + setAttr -av -k on ".cch"; + setAttr -cb on ".ihi"; + setAttr -k on ".nds"; + setAttr -cb on ".bnm"; + setAttr -k on ".o" 13; + setAttr -k on ".unw" 13; + setAttr -k on ".etw"; + setAttr -k on ".tps"; + setAttr -k on ".tms"; +lockNode -l 1 ; +select -ne :renderPartition; + setAttr -k on ".cch"; + setAttr -cb on ".ihi"; + setAttr -k on ".nds"; + setAttr -cb on ".bnm"; + setAttr -s 2 ".st"; + setAttr -cb on ".an"; + setAttr -cb on ".pt"; +lockNode -l 1 ; +select -ne :initialShadingGroup; + setAttr -k on ".cch"; + setAttr -cb on ".ihi"; + setAttr -av -k on ".nds"; + setAttr -cb on ".bnm"; + setAttr -s 2 ".dsm"; + setAttr -k on ".mwc"; + setAttr -cb on ".an"; + setAttr -cb on ".il"; + setAttr -cb on ".vo"; + setAttr -cb on ".eo"; + setAttr -cb on ".fo"; + setAttr -cb on ".epo"; + setAttr -k on ".ro" yes; +lockNode -l 1 ; +select -ne :initialParticleSE; + setAttr -av -k on ".cch"; + setAttr -cb on ".ihi"; + setAttr -av -k on ".nds"; + setAttr -cb on ".bnm"; + setAttr -k on ".mwc"; + setAttr -cb on ".an"; + setAttr -cb on ".il"; + setAttr -cb on ".vo"; + setAttr -cb on ".eo"; + setAttr -cb on ".fo"; + setAttr -cb on ".epo"; + setAttr -k on ".ro" yes; +select -ne :defaultShaderList1; + setAttr -k on ".cch"; + setAttr -cb on ".ihi"; + setAttr -k on ".nds"; + setAttr -cb on ".bnm"; + setAttr -s 2 ".s"; +select -ne :postProcessList1; + setAttr -k on ".cch"; + setAttr -cb on ".ihi"; + setAttr -k on ".nds"; + setAttr -cb on ".bnm"; + setAttr -s 2 ".p"; +select -ne :defaultRenderingList1; + setAttr -s 6 ".r"; +select -ne :renderGlobalsList1; + setAttr -k on ".cch"; + setAttr -cb on ".ihi"; + setAttr -k on ".nds"; + setAttr -cb on ".bnm"; +select -ne :defaultResolution; + setAttr -k on ".cch"; + setAttr -k on ".nds"; + setAttr -av ".w"; + setAttr -av ".h"; + setAttr -k on ".pa" 1; + setAttr -k on ".al"; + setAttr -av ".dar"; + setAttr -k on ".ldar"; + setAttr -k on ".off"; + setAttr -k on ".fld"; + setAttr -k on ".zsl"; +select -ne :defaultLightSet; + setAttr -k on ".cch"; + setAttr -k on ".ihi"; + setAttr -av -k on ".nds"; + setAttr -k on ".bnm"; + setAttr -k on ".mwc"; + setAttr -k on ".an"; + setAttr -k on ".il"; + setAttr -k on ".vo"; + setAttr -k on ".eo"; + setAttr -k on ".fo"; + setAttr -k on ".epo"; + setAttr -k on ".ro" yes; +select -ne :defaultObjectSet; + setAttr ".ro" yes; +lockNode -l 1 ; +select -ne :hardwareRenderGlobals; + setAttr -k on ".cch"; + setAttr -cb on ".ihi"; + setAttr -k on ".nds"; + setAttr -cb on ".bnm"; + setAttr ".ctrs" 256; + setAttr ".btrs" 512; + setAttr -k off ".fbfm"; + setAttr -k off -cb on ".ehql"; + setAttr -k off -cb on ".eams"; + setAttr -k off -cb on ".eeaa"; + setAttr -k off -cb on ".engm"; + setAttr -k off -cb on ".mes"; + setAttr -k off -cb on ".emb"; + setAttr -av -k off -cb on ".mbbf"; + setAttr -k off -cb on ".mbs"; + setAttr -k off -cb on ".trm"; + setAttr -k off -cb on ".tshc"; + setAttr -k off ".enpt"; + setAttr -k off -cb on ".clmt"; + setAttr -k off -cb on ".tcov"; + setAttr -k off -cb on ".lith"; + setAttr -k off -cb on ".sobc"; + setAttr -k off -cb on ".cuth"; + setAttr -k off -cb on ".hgcd"; + setAttr -k off -cb on ".hgci"; + setAttr -k off -cb on ".mgcs"; + setAttr -k off -cb on ".twa"; + setAttr -k off -cb on ".twz"; + setAttr -k on ".hwcc"; + setAttr -k on ".hwdp"; + setAttr -k on ".hwql"; + setAttr -k on ".hwfr"; +select -ne :hardwareRenderingGlobals; + setAttr ".otfna" -type "stringArray" 18 "NURBS Curves" "NURBS Surfaces" "Polygons" "Subdiv Surfaces" "Particles" "Fluids" "Image Planes" "UI:" "Lights" "Cameras" "Locators" "Joints" "IK Handles" "Deformers" "Motion Trails" "Components" "Misc. UI" "Ornaments" ; + setAttr ".otfva" -type "Int32Array" 18 0 1 1 1 1 1 + 1 0 0 0 0 0 0 0 0 0 0 0 ; +select -ne :defaultHardwareRenderGlobals; + setAttr -k on ".cch"; + setAttr -cb on ".ihi"; + setAttr -k on ".nds"; + setAttr -cb on ".bnm"; + setAttr -av -k on ".rp"; + setAttr -k on ".cai"; + setAttr -k on ".coi"; + setAttr -cb on ".bc"; + setAttr -av -k on ".bcb"; + setAttr -av -k on ".bcg"; + setAttr -av -k on ".bcr"; + setAttr -k on ".ei"; + setAttr -k on ".ex"; + setAttr -av -k on ".es"; + setAttr -av -k on ".ef"; + setAttr -av -k on ".bf"; + setAttr -k on ".fii"; + setAttr -av -k on ".sf"; + setAttr -k on ".gr"; + setAttr -k on ".li"; + setAttr -k on ".ls"; + setAttr -k on ".mb"; + setAttr -k on ".ti"; + setAttr -k on ".txt"; + setAttr -k on ".mpr"; + setAttr -k on ".wzd"; + setAttr ".fn" -type "string" "im"; + setAttr -k on ".if"; + setAttr ".res" -type "string" "ntsc_4d 646 485 1.333"; + setAttr -k on ".as"; + setAttr -k on ".ds"; + setAttr -k on ".lm"; + setAttr -k on ".fir"; + setAttr -k on ".aap"; + setAttr -k on ".gh"; + setAttr -cb on ".sd"; +lockNode -l 1 ; +connectAttr "locator2.t" "srcSphereRN.phl[1]"; +connectAttr "lockedNode_translateZ.o" "srcSphereRN.phl[2]"; +connectAttr "lockedNode_orientConstraint1.crx" "srcSphereRN.phl[3]"; +connectAttr "lockedNode_orientConstraint1.cry" "srcSphereRN.phl[4]"; +connectAttr "lockedNode_orientConstraint1.crz" "srcSphereRN.phl[5]"; +connectAttr "srcSphereRN.phl[6]" "lockedNode_orientConstraint1.cro"; +connectAttr "srcSphereRN.phl[7]" "lockedNode_orientConstraint1.cpim"; +connectAttr "srcSphere:sphere_testVectorX.o" "srcSphereRN.phl[8]"; +connectAttr "srcSphere:sphere_testVectorY.o" "srcSphereRN.phl[9]"; +connectAttr "srcSphere:sphere_testVectorZ.o" "srcSphereRN.phl[10]"; +connectAttr "srcSphere:sphere_testEnum.o" "srcSphereRN.phl[11]"; +connectAttr "srcSphere:sphere_testFloat.o" "srcSphereRN.phl[12]"; +connectAttr "srcSphere:sphere_testBoolean.o" "srcSphereRN.phl[13]"; +connectAttr "srcSphere:sphere_testInteger.o" "srcSphereRN.phl[14]"; +connectAttr "srcSphere:sphere_translateY.o" "srcSphereRN.phl[15]"; +connectAttr "srcSphere:sphere_translateX.o" "srcSphereRN.phl[16]"; +connectAttr "srcSphere:sphere_translateZ.o" "srcSphereRN.phl[17]"; +connectAttr "srcSphere:sphere_rotateX.o" "srcSphereRN.phl[18]"; +connectAttr "srcSphere:sphere_rotateZ.o" "srcSphereRN.phl[19]"; +connectAttr "srcSphere:sphere_scaleX.o" "srcSphereRN.phl[20]"; +connectAttr "srcSphere:sphere_scaleZ.o" "srcSphereRN.phl[21]"; +connectAttr "srcSphere:sphere_visibility.o" "srcSphereRN.phl[22]"; +connectAttr "locator1_rotateX.o" "locator1.rx"; +connectAttr "locator1_rotateY.o" "locator1.ry"; +connectAttr "locator1_rotateZ.o" "locator1.rz"; +connectAttr "locator1_visibility.o" "locator1.v"; +connectAttr "locator1_translateX.o" "locator1.tx"; +connectAttr "locator1_translateY.o" "locator1.ty"; +connectAttr "locator1_translateZ.o" "locator1.tz"; +connectAttr "locator1_scaleX.o" "locator1.sx"; +connectAttr "locator1_scaleY.o" "locator1.sy"; +connectAttr "locator1_scaleZ.o" "locator1.sz"; +connectAttr "locator1.r" "lockedNode_orientConstraint1.tg[0].tr"; +connectAttr "locator1.ro" "lockedNode_orientConstraint1.tg[0].tro"; +connectAttr "locator1.pm" "lockedNode_orientConstraint1.tg[0].tpm"; +connectAttr "lockedNode_orientConstraint1.w0" "lockedNode_orientConstraint1.tg[0].tw" + ; +relationship "link" ":lightLinker1" ":initialShadingGroup.message" ":defaultLightSet.message"; +relationship "link" ":lightLinker1" ":initialParticleSE.message" ":defaultLightSet.message"; +relationship "shadowLink" ":lightLinker1" ":initialShadingGroup.message" ":defaultLightSet.message"; +relationship "shadowLink" ":lightLinker1" ":initialParticleSE.message" ":defaultLightSet.message"; +connectAttr "layerManager.dli[0]" "defaultLayer.id"; +connectAttr "renderLayerManager.rlmi[0]" "defaultRenderLayer.rlid"; +connectAttr "srcSphereRNfosterParent1.msg" "srcSphereRN.fp"; +connectAttr "sharedReferenceNode.sr" "dstSphereRN.sr"; +connectAttr "defaultRenderLayer.msg" ":defaultRenderingList1.r" -na; +// End of test_bake_connections.ma diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_load_insert.anim/animation.ma b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_load_insert.anim/animation.ma new file mode 100644 index 0000000..1ad6589 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_load_insert.anim/animation.ma @@ -0,0 +1,100 @@ +//Maya ASCII 2016 scene +//Name: animation.ma +//Last modified: Tue, Aug 09, 2016 08:47:07 AM +//Codeset: 1252 +requires maya "2016"; +currentUnit -l centimeter -a degree -t film; +fileInfo "application" "maya"; +fileInfo "product" "Maya 2016"; +fileInfo "version" "2016"; +fileInfo "cutIdentifier" "201502261600-953408"; +fileInfo "osv" "Microsoft Windows 8 Business Edition, 64-bit (Build 9200)\n"; +createNode animCurveTU -n "CURVE1"; + rename -uid "B4FA69EE-4158-445F-5AB5-769D92B60EE3"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 5 10 5; +createNode animCurveTU -n "CURVE2"; + rename -uid "CA0863B5-4680-36D0-E9A3-83A0A33EC51B"; + setAttr ".tan" 9; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 10 1; + setAttr -s 2 ".kot[0:1]" 5 5; +createNode animCurveTU -n "CURVE3"; + rename -uid "436929BD-4536-FD91-F836-FA9961D739F5"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0.25 10 0.42958527814637792; +createNode animCurveTU -n "CURVE4"; + rename -uid "9E217B7B-4585-8318-49F7-249A1ACBA95B"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0.5 10 0.85917055629275585; +createNode animCurveTA -n "CURVE5"; + rename -uid "5649AD20-440E-7866-8CAB-B08834F07905"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 45 10 30.81018202226841; +createNode animCurveTA -n "CURVE6"; + rename -uid "19E0B15E-449C-F085-5151-10BFD6772FE1"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 90 10 149.70880463068096; +createNode animCurveTL -n "CURVE7"; + rename -uid "1FE3DC07-4819-A244-0BC3-B8A3B3EF1275"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0 10 0; +createNode animCurveTL -n "CURVE8"; + rename -uid "00984994-4BA2-5907-9C38-D1BE8279B667"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 8 10 8; +createNode animCurveTL -n "CURVE9"; + rename -uid "40524ED9-44E0-043B-4F9E-00ABB81FF2FA"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 -12 10 11.214436147065292; +createNode animCurveTU -n "CURVE10"; + rename -uid "240A5025-4AA3-D27B-CBD9-3D98E97E7B2A"; + setAttr ".tan" 9; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 10 1; + setAttr -s 2 ".kot[0:1]" 5 5; +createNode animCurveTU -n "CURVE11"; + rename -uid "4541CB45-4FD7-656E-2626-0394702423B3"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0.666 10 0.666; +createNode animCurveTU -n "CURVE12"; + rename -uid "55FC02E9-4D2D-FF69-A838-978CC1CA83B4"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0 10 10; +createNode animCurveTU -n "CURVE13"; + rename -uid "CBF4DD9D-4839-361A-70F2-6990E98D9C30"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0.2 10 0.2; +createNode animCurveTU -n "CURVE14"; + rename -uid "1A7FD955-44FC-DA80-17C8-F8B2936C2A64"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1.4 10 1.4; +createNode animCurveTU -n "CURVE15"; + rename -uid "3F957170-4D7E-FD98-8F3E-6086609AB97F"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 2.6 10 2.6; +createNode animCurveTU -n "CURVE16"; + rename -uid "2EC19608-4057-B2F8-7796-27BB84CC1532"; + setAttr ".tan" 9; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 10 1; + setAttr -s 2 ".kot[0:1]" 5 5; +createNode animCurveTL -n "CURVE18"; + rename -uid "75AC48FC-4740-40A9-B0B6-AFB0FB0FAD85"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0 10 15; +// End \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_load_insert.anim/animation.mb b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_load_insert.anim/animation.mb new file mode 100644 index 0000000..0f9ee74 Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_load_insert.anim/animation.mb differ diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_load_insert.anim/pose.json b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_load_insert.anim/pose.json new file mode 100644 index 0000000..a87bacc --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_load_insert.anim/pose.json @@ -0,0 +1,177 @@ +{ + "metadata": { + "mayaSceneFile": "C:/Users/hovel/Dropbox/git/site-packages/studiolibrary/packages/mutils/tests/data/test_anim.ma", + "angularUnit": "deg", + "ctime": "1518341545", + "endFrame": 10, + "linearUnit": "cm", + "version": "1.0.0", + "user": "Hovel", + "startFrame": 1, + "timeUnit": "film", + "mayaVersion": "2017" + } +, + "objects": { + "srcSphere:offset": { + "attrs": {} + }, + "srcSphere:sphere": { + "attrs": { + "testInteger": { + "curve": "CURVE1", + "type": "long", + "value": 5 + }, + "testProxy": { + "type": "double", + "value": 1.0 + }, + "scaleY": { + "type": "double", + "value": 4.66 + }, + "testLimit": { + "type": "double", + "value": 10.0 + }, + "testConnect": { + "type": "double", + "value": 8.0 + }, + "testEnum": { + "curve": "CURVE2", + "type": "enum", + "value": 1 + }, + "scaleX": { + "curve": "CURVE3", + "type": "double", + "value": 0.25 + }, + "testString": { + "type": "string", + "value": "Hello world" + }, + "scaleZ": { + "curve": "CURVE4", + "type": "double", + "value": 0.5 + }, + "rotateX": { + "curve": "CURVE5", + "type": "doubleAngle", + "value": 45.0 + }, + "rotateY": { + "type": "doubleAngle", + "value": 50.0 + }, + "rotateZ": { + "curve": "CURVE6", + "type": "doubleAngle", + "value": 90.0 + }, + "testStatic": { + "type": "double", + "value": 0.0 + }, + "translateX": { + "curve": "CURVE7", + "type": "doubleLinear", + "value": 0.0 + }, + "translateY": { + "curve": "CURVE8", + "type": "doubleLinear", + "value": 8.0 + }, + "translateZ": { + "curve": "CURVE9", + "type": "doubleLinear", + "value": -12.0 + }, + "visibility": { + "curve": "CURVE10", + "type": "bool", + "value": true + }, + "testFloat": { + "curve": "CURVE11", + "type": "double", + "value": 0.666 + }, + "testAnimated": { + "curve": "CURVE12", + "type": "double", + "value": 0.0 + }, + "testVectorX": { + "curve": "CURVE13", + "type": "double", + "value": 0.2 + }, + "testVectorY": { + "curve": "CURVE14", + "type": "double", + "value": 1.4 + }, + "testVectorZ": { + "curve": "CURVE15", + "type": "double", + "value": 2.6 + }, + "testBoolean": { + "curve": "CURVE16", + "type": "bool", + "value": true + } + } + }, + "srcSphere:lockedNode": { + "attrs": { + "translateX": { + "type": "doubleLinear", + "value": 0.0 + }, + "translateY": { + "type": "doubleLinear", + "value": 5.0 + }, + "translateZ": { + "curve": "CURVE18", + "type": "doubleLinear", + "value": 0.0 + }, + "scaleX": { + "type": "double", + "value": 1.0 + }, + "scaleY": { + "type": "double", + "value": 1.0 + }, + "visibility": { + "type": "bool", + "value": true + }, + "rotateX": { + "type": "doubleAngle", + "value": 0.0 + }, + "rotateY": { + "type": "doubleAngle", + "value": 0.0 + }, + "rotateZ": { + "type": "doubleAngle", + "value": 0.0 + }, + "scaleZ": { + "type": "double", + "value": 1.0 + } + } + } + } +} \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_load_replace.anim/animation.ma b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_load_replace.anim/animation.ma new file mode 100644 index 0000000..e72ea48 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_load_replace.anim/animation.ma @@ -0,0 +1,100 @@ +//Maya ASCII 2016 scene +//Name: animation.ma +//Last modified: Tue, Aug 09, 2016 08:47:07 AM +//Codeset: 1252 +requires maya "2016"; +currentUnit -l centimeter -a degree -t film; +fileInfo "application" "maya"; +fileInfo "product" "Maya 2016"; +fileInfo "version" "2016"; +fileInfo "cutIdentifier" "201502261600-953408"; +fileInfo "osv" "Microsoft Windows 8 Business Edition, 64-bit (Build 9200)\n"; +createNode animCurveTU -n "CURVE1"; + rename -uid "44F21FB5-4121-8FAA-4E5A-2795D8DB1C98"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 5 10 5; +createNode animCurveTU -n "CURVE2"; + rename -uid "89D65122-4A81-C08C-8F60-A8A69D8BDDFF"; + setAttr ".tan" 9; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 10 1; + setAttr -s 2 ".kot[0:1]" 5 5; +createNode animCurveTU -n "CURVE3"; + rename -uid "394F9F8B-44A0-7AEE-3FF8-43BE62C0DDC8"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0.25 10 0.42958527814637792; +createNode animCurveTU -n "CURVE4"; + rename -uid "CF90746B-43BD-0210-E0FC-05A5368FC36F"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0.5 10 0.85917055629275585; +createNode animCurveTA -n "CURVE5"; + rename -uid "C88B0183-4A49-7472-1F9B-75861AB915A8"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 45 10 30.81018202226841; +createNode animCurveTA -n "CURVE6"; + rename -uid "70CBACAA-40C4-7C42-B9F5-0BB67E97595D"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 90 10 149.70880463068096; +createNode animCurveTL -n "CURVE7"; + rename -uid "9A9A4A91-42EF-2651-3696-91ACC6F098B6"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0 10 0; +createNode animCurveTL -n "CURVE8"; + rename -uid "CBDCAEFF-4D9E-5162-0CAC-7C8CE46E91F2"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 8 10 8; +createNode animCurveTL -n "CURVE9"; + rename -uid "B745DFCE-4739-96FC-C827-1494F35ED50D"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 -12 10 11.214436147065292; +createNode animCurveTU -n "CURVE10"; + rename -uid "0A53795D-45F0-B3C3-E5F2-AAB7665A9E8E"; + setAttr ".tan" 9; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 10 1; + setAttr -s 2 ".kot[0:1]" 5 5; +createNode animCurveTU -n "CURVE11"; + rename -uid "7DC24CA9-48A1-3B3A-8278-5A81D70CA4E9"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0.666 10 0.666; +createNode animCurveTU -n "CURVE12"; + rename -uid "400DED74-4D52-543D-91D4-0881D938C5C9"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0 10 10; +createNode animCurveTU -n "CURVE13"; + rename -uid "5527A666-49BE-9277-3936-12B07312A901"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0.2 10 0.2; +createNode animCurveTU -n "CURVE14"; + rename -uid "DF0B2F0E-49A4-61C0-521D-0A8497BF2753"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1.4 10 1.4; +createNode animCurveTU -n "CURVE15"; + rename -uid "20CAFE14-4EBD-6A5D-458C-5B82383EC0F2"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 2.6 10 2.6; +createNode animCurveTU -n "CURVE16"; + rename -uid "7996F54C-49E2-85E5-D444-CBB553D75344"; + setAttr ".tan" 9; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 10 1; + setAttr -s 2 ".kot[0:1]" 5 5; +createNode animCurveTL -n "CURVE18"; + rename -uid "C516D5DD-4FA0-4AEC-8E33-0ABF26EF9D60"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0 10 15; +// End \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_load_replace.anim/animation.mb b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_load_replace.anim/animation.mb new file mode 100644 index 0000000..8a44ea5 Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_load_replace.anim/animation.mb differ diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_load_replace.anim/pose.json b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_load_replace.anim/pose.json new file mode 100644 index 0000000..27d9c5a --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_load_replace.anim/pose.json @@ -0,0 +1,177 @@ +{ + "metadata": { + "mayaSceneFile": "C:/Users/hovel/Dropbox/git/site-packages/studiolibrary/packages/mutils/tests/data/test_anim.ma", + "angularUnit": "deg", + "ctime": "1518341546", + "endFrame": 10, + "linearUnit": "cm", + "version": "1.0.0", + "user": "Hovel", + "startFrame": 1, + "timeUnit": "film", + "mayaVersion": "2017" + } +, + "objects": { + "srcSphere:offset": { + "attrs": {} + }, + "srcSphere:sphere": { + "attrs": { + "testInteger": { + "curve": "CURVE1", + "type": "long", + "value": 5 + }, + "testProxy": { + "type": "double", + "value": 1.0 + }, + "scaleY": { + "type": "double", + "value": 4.66 + }, + "testLimit": { + "type": "double", + "value": 10.0 + }, + "testConnect": { + "type": "double", + "value": 8.0 + }, + "testEnum": { + "curve": "CURVE2", + "type": "enum", + "value": 1 + }, + "scaleX": { + "curve": "CURVE3", + "type": "double", + "value": 0.25 + }, + "testString": { + "type": "string", + "value": "Hello world" + }, + "scaleZ": { + "curve": "CURVE4", + "type": "double", + "value": 0.5 + }, + "rotateX": { + "curve": "CURVE5", + "type": "doubleAngle", + "value": 45.0 + }, + "rotateY": { + "type": "doubleAngle", + "value": 50.0 + }, + "rotateZ": { + "curve": "CURVE6", + "type": "doubleAngle", + "value": 90.0 + }, + "testStatic": { + "type": "double", + "value": 0.0 + }, + "translateX": { + "curve": "CURVE7", + "type": "doubleLinear", + "value": 0.0 + }, + "translateY": { + "curve": "CURVE8", + "type": "doubleLinear", + "value": 8.0 + }, + "translateZ": { + "curve": "CURVE9", + "type": "doubleLinear", + "value": -12.0 + }, + "visibility": { + "curve": "CURVE10", + "type": "bool", + "value": true + }, + "testFloat": { + "curve": "CURVE11", + "type": "double", + "value": 0.666 + }, + "testAnimated": { + "curve": "CURVE12", + "type": "double", + "value": 0.0 + }, + "testVectorX": { + "curve": "CURVE13", + "type": "double", + "value": 0.2 + }, + "testVectorY": { + "curve": "CURVE14", + "type": "double", + "value": 1.4 + }, + "testVectorZ": { + "curve": "CURVE15", + "type": "double", + "value": 2.6 + }, + "testBoolean": { + "curve": "CURVE16", + "type": "bool", + "value": true + } + } + }, + "srcSphere:lockedNode": { + "attrs": { + "translateX": { + "type": "doubleLinear", + "value": 0.0 + }, + "translateY": { + "type": "doubleLinear", + "value": 5.0 + }, + "translateZ": { + "curve": "CURVE18", + "type": "doubleLinear", + "value": 0.0 + }, + "scaleX": { + "type": "double", + "value": 1.0 + }, + "scaleY": { + "type": "double", + "value": 1.0 + }, + "visibility": { + "type": "bool", + "value": true + }, + "rotateX": { + "type": "doubleAngle", + "value": 0.0 + }, + "rotateY": { + "type": "doubleAngle", + "value": 0.0 + }, + "rotateZ": { + "type": "doubleAngle", + "value": 0.0 + }, + "scaleZ": { + "type": "double", + "value": 1.0 + } + } + } + } +} \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_load_replace_completely.anim/animation.ma b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_load_replace_completely.anim/animation.ma new file mode 100644 index 0000000..d6c6694 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_load_replace_completely.anim/animation.ma @@ -0,0 +1,100 @@ +//Maya ASCII 2016 scene +//Name: animation.ma +//Last modified: Tue, Aug 09, 2016 08:47:08 AM +//Codeset: 1252 +requires maya "2016"; +currentUnit -l centimeter -a degree -t film; +fileInfo "application" "maya"; +fileInfo "product" "Maya 2016"; +fileInfo "version" "2016"; +fileInfo "cutIdentifier" "201502261600-953408"; +fileInfo "osv" "Microsoft Windows 8 Business Edition, 64-bit (Build 9200)\n"; +createNode animCurveTU -n "CURVE1"; + rename -uid "07400D46-41EF-56B5-ABE2-FCB3FDC705F2"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 5 10 5; +createNode animCurveTU -n "CURVE2"; + rename -uid "E2B997BA-4A97-2EF7-C65E-E7BD483688D6"; + setAttr ".tan" 9; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 10 1; + setAttr -s 2 ".kot[0:1]" 5 5; +createNode animCurveTU -n "CURVE3"; + rename -uid "2AF61E8F-4817-A910-3417-6B9823CED36D"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0.25 10 0.42958527814637792; +createNode animCurveTU -n "CURVE4"; + rename -uid "61ED901E-4BFA-A417-6F1A-A89854BAE1F9"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0.5 10 0.85917055629275585; +createNode animCurveTA -n "CURVE5"; + rename -uid "25E543E0-4233-B654-6DC2-C980CC9ED600"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 45 10 30.81018202226841; +createNode animCurveTA -n "CURVE6"; + rename -uid "3921DD56-44E6-E6D7-DB1B-C28209F3157E"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 90 10 149.70880463068096; +createNode animCurveTL -n "CURVE7"; + rename -uid "5EE5D458-498D-AD10-196B-0F99DE4A9F97"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0 10 0; +createNode animCurveTL -n "CURVE8"; + rename -uid "81FBC4EF-479F-58C1-D24D-859C16E01BA1"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 8 10 8; +createNode animCurveTL -n "CURVE9"; + rename -uid "898B5C26-448D-366F-0E63-5082268110FB"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 -12 10 11.214436147065292; +createNode animCurveTU -n "CURVE10"; + rename -uid "139725A4-4C9A-C99F-2E9F-AF91BC3F67E9"; + setAttr ".tan" 9; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 10 1; + setAttr -s 2 ".kot[0:1]" 5 5; +createNode animCurveTU -n "CURVE11"; + rename -uid "1A5281F1-4252-087B-1631-9998C170D33B"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0.666 10 0.666; +createNode animCurveTU -n "CURVE12"; + rename -uid "3B543491-429F-763A-0075-4EB85B2E50AB"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0 10 10; +createNode animCurveTU -n "CURVE13"; + rename -uid "8532CE01-49F8-571C-2D65-A98F3427EBF0"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0.2 10 0.2; +createNode animCurveTU -n "CURVE14"; + rename -uid "D9767D2E-4DFC-F089-183D-789D8B697CF1"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1.4 10 1.4; +createNode animCurveTU -n "CURVE15"; + rename -uid "73706920-4309-DAEE-AE70-CAAF4C1D68FB"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 2.6 10 2.6; +createNode animCurveTU -n "CURVE16"; + rename -uid "70D851D4-43F8-72F5-0327-E28AEB0F174C"; + setAttr ".tan" 9; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 10 1; + setAttr -s 2 ".kot[0:1]" 5 5; +createNode animCurveTL -n "CURVE18"; + rename -uid "716232B6-4903-7906-472A-569BBA3146DA"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0 10 15; +// End \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_load_replace_completely.anim/animation.mb b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_load_replace_completely.anim/animation.mb new file mode 100644 index 0000000..41261dd Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_load_replace_completely.anim/animation.mb differ diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_load_replace_completely.anim/pose.json b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_load_replace_completely.anim/pose.json new file mode 100644 index 0000000..27d9c5a --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_load_replace_completely.anim/pose.json @@ -0,0 +1,177 @@ +{ + "metadata": { + "mayaSceneFile": "C:/Users/hovel/Dropbox/git/site-packages/studiolibrary/packages/mutils/tests/data/test_anim.ma", + "angularUnit": "deg", + "ctime": "1518341546", + "endFrame": 10, + "linearUnit": "cm", + "version": "1.0.0", + "user": "Hovel", + "startFrame": 1, + "timeUnit": "film", + "mayaVersion": "2017" + } +, + "objects": { + "srcSphere:offset": { + "attrs": {} + }, + "srcSphere:sphere": { + "attrs": { + "testInteger": { + "curve": "CURVE1", + "type": "long", + "value": 5 + }, + "testProxy": { + "type": "double", + "value": 1.0 + }, + "scaleY": { + "type": "double", + "value": 4.66 + }, + "testLimit": { + "type": "double", + "value": 10.0 + }, + "testConnect": { + "type": "double", + "value": 8.0 + }, + "testEnum": { + "curve": "CURVE2", + "type": "enum", + "value": 1 + }, + "scaleX": { + "curve": "CURVE3", + "type": "double", + "value": 0.25 + }, + "testString": { + "type": "string", + "value": "Hello world" + }, + "scaleZ": { + "curve": "CURVE4", + "type": "double", + "value": 0.5 + }, + "rotateX": { + "curve": "CURVE5", + "type": "doubleAngle", + "value": 45.0 + }, + "rotateY": { + "type": "doubleAngle", + "value": 50.0 + }, + "rotateZ": { + "curve": "CURVE6", + "type": "doubleAngle", + "value": 90.0 + }, + "testStatic": { + "type": "double", + "value": 0.0 + }, + "translateX": { + "curve": "CURVE7", + "type": "doubleLinear", + "value": 0.0 + }, + "translateY": { + "curve": "CURVE8", + "type": "doubleLinear", + "value": 8.0 + }, + "translateZ": { + "curve": "CURVE9", + "type": "doubleLinear", + "value": -12.0 + }, + "visibility": { + "curve": "CURVE10", + "type": "bool", + "value": true + }, + "testFloat": { + "curve": "CURVE11", + "type": "double", + "value": 0.666 + }, + "testAnimated": { + "curve": "CURVE12", + "type": "double", + "value": 0.0 + }, + "testVectorX": { + "curve": "CURVE13", + "type": "double", + "value": 0.2 + }, + "testVectorY": { + "curve": "CURVE14", + "type": "double", + "value": 1.4 + }, + "testVectorZ": { + "curve": "CURVE15", + "type": "double", + "value": 2.6 + }, + "testBoolean": { + "curve": "CURVE16", + "type": "bool", + "value": true + } + } + }, + "srcSphere:lockedNode": { + "attrs": { + "translateX": { + "type": "doubleLinear", + "value": 0.0 + }, + "translateY": { + "type": "doubleLinear", + "value": 5.0 + }, + "translateZ": { + "curve": "CURVE18", + "type": "doubleLinear", + "value": 0.0 + }, + "scaleX": { + "type": "double", + "value": 1.0 + }, + "scaleY": { + "type": "double", + "value": 1.0 + }, + "visibility": { + "type": "bool", + "value": true + }, + "rotateX": { + "type": "doubleAngle", + "value": 0.0 + }, + "rotateY": { + "type": "doubleAngle", + "value": 0.0 + }, + "rotateZ": { + "type": "doubleAngle", + "value": 0.0 + }, + "scaleZ": { + "type": "double", + "value": 1.0 + } + } + } + } +} \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_mirror_tables.ma b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_mirror_tables.ma new file mode 100644 index 0000000..1651558 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_mirror_tables.ma @@ -0,0 +1,748 @@ +//Maya ASCII 2014 scene +//Name: test_mirror_tables.ma +//Last modified: Thu, Sep 11, 2014 08:35:27 PM +//Codeset: 1252 +requires maya "2014"; +requires -nodeType "mentalrayFramebuffer" -nodeType "mentalrayOutputPass" -nodeType "mentalrayRenderPass" + -nodeType "mentalrayUserBuffer" -nodeType "mentalraySubdivApprox" -nodeType "mentalrayCurveApprox" + -nodeType "mentalraySurfaceApprox" -nodeType "mentalrayDisplaceApprox" -nodeType "mentalrayOptions" + -nodeType "mentalrayGlobals" -nodeType "mentalrayItemsList" -nodeType "mentalrayShader" + -nodeType "mentalrayUserData" -nodeType "mentalrayText" -nodeType "mentalrayTessellation" + -nodeType "mentalrayPhenomenon" -nodeType "mentalrayLightProfile" -nodeType "mentalrayVertexColors" + -nodeType "mentalrayIblShape" -nodeType "mapVizShape" -nodeType "mentalrayCCMeshProxy" + -nodeType "cylindricalLightLocator" -nodeType "discLightLocator" -nodeType "rectangularLightLocator" + -nodeType "sphericalLightLocator" -nodeType "abcimport" -nodeType "mia_physicalsun" + -nodeType "mia_physicalsky" -nodeType "mia_material" -nodeType "mia_material_x" -nodeType "mia_roundcorners" + -nodeType "mia_exposure_simple" -nodeType "mia_portal_light" -nodeType "mia_light_surface" + -nodeType "mia_exposure_photographic" -nodeType "mia_exposure_photographic_rev" -nodeType "mia_lens_bokeh" + -nodeType "mia_envblur" -nodeType "mia_ciesky" -nodeType "mia_photometric_light" + -nodeType "mib_texture_vector" -nodeType "mib_texture_remap" -nodeType "mib_texture_rotate" + -nodeType "mib_bump_basis" -nodeType "mib_bump_map" -nodeType "mib_passthrough_bump_map" + -nodeType "mib_bump_map2" -nodeType "mib_lookup_spherical" -nodeType "mib_lookup_cube1" + -nodeType "mib_lookup_cube6" -nodeType "mib_lookup_background" -nodeType "mib_lookup_cylindrical" + -nodeType "mib_texture_lookup" -nodeType "mib_texture_lookup2" -nodeType "mib_texture_filter_lookup" + -nodeType "mib_texture_checkerboard" -nodeType "mib_texture_polkadot" -nodeType "mib_texture_polkasphere" + -nodeType "mib_texture_turbulence" -nodeType "mib_texture_wave" -nodeType "mib_reflect" + -nodeType "mib_refract" -nodeType "mib_transparency" -nodeType "mib_continue" -nodeType "mib_opacity" + -nodeType "mib_twosided" -nodeType "mib_refraction_index" -nodeType "mib_dielectric" + -nodeType "mib_ray_marcher" -nodeType "mib_illum_lambert" -nodeType "mib_illum_phong" + -nodeType "mib_illum_ward" -nodeType "mib_illum_ward_deriv" -nodeType "mib_illum_blinn" + -nodeType "mib_illum_cooktorr" -nodeType "mib_illum_hair" -nodeType "mib_volume" + -nodeType "mib_color_alpha" -nodeType "mib_color_average" -nodeType "mib_color_intensity" + -nodeType "mib_color_interpolate" -nodeType "mib_color_mix" -nodeType "mib_color_spread" + -nodeType "mib_geo_cube" -nodeType "mib_geo_torus" -nodeType "mib_geo_sphere" -nodeType "mib_geo_cone" + -nodeType "mib_geo_cylinder" -nodeType "mib_geo_square" -nodeType "mib_geo_instance" + -nodeType "mib_geo_instance_mlist" -nodeType "mib_geo_add_uv_texsurf" -nodeType "mib_photon_basic" + -nodeType "mib_light_infinite" -nodeType "mib_light_point" -nodeType "mib_light_spot" + -nodeType "mib_light_photometric" -nodeType "mib_cie_d" -nodeType "mib_blackbody" + -nodeType "mib_shadow_transparency" -nodeType "mib_lens_stencil" -nodeType "mib_lens_clamp" + -nodeType "mib_lightmap_write" -nodeType "mib_lightmap_sample" -nodeType "mib_amb_occlusion" + -nodeType "mib_fast_occlusion" -nodeType "mib_map_get_scalar" -nodeType "mib_map_get_integer" + -nodeType "mib_map_get_vector" -nodeType "mib_map_get_color" -nodeType "mib_map_get_transform" + -nodeType "mib_map_get_scalar_array" -nodeType "mib_map_get_integer_array" -nodeType "mib_fg_occlusion" + -nodeType "mib_bent_normal_env" -nodeType "mib_glossy_reflection" -nodeType "mib_glossy_refraction" + -nodeType "builtin_bsdf_architectural" -nodeType "builtin_bsdf_architectural_comp" + -nodeType "builtin_bsdf_carpaint" -nodeType "builtin_bsdf_ashikhmin" -nodeType "builtin_bsdf_lambert" + -nodeType "builtin_bsdf_mirror" -nodeType "builtin_bsdf_phong" -nodeType "contour_store_function" + -nodeType "contour_store_function_simple" -nodeType "contour_contrast_function_levels" + -nodeType "contour_contrast_function_simple" -nodeType "contour_shader_simple" -nodeType "contour_shader_silhouette" + -nodeType "contour_shader_maxcolor" -nodeType "contour_shader_curvature" -nodeType "contour_shader_factorcolor" + -nodeType "contour_shader_depthfade" -nodeType "contour_shader_framefade" -nodeType "contour_shader_layerthinner" + -nodeType "contour_shader_widthfromcolor" -nodeType "contour_shader_widthfromlightdir" + -nodeType "contour_shader_widthfromlight" -nodeType "contour_shader_combi" -nodeType "contour_only" + -nodeType "contour_composite" -nodeType "contour_ps" -nodeType "mi_metallic_paint" + -nodeType "mi_metallic_paint_x" -nodeType "mi_bump_flakes" -nodeType "mi_car_paint_phen" + -nodeType "mi_metallic_paint_output_mixer" -nodeType "mi_car_paint_phen_x" -nodeType "physical_lens_dof" + -nodeType "physical_light" -nodeType "dgs_material" -nodeType "dgs_material_photon" + -nodeType "dielectric_material" -nodeType "dielectric_material_photon" -nodeType "oversampling_lens" + -nodeType "path_material" -nodeType "parti_volume" -nodeType "parti_volume_photon" + -nodeType "transmat" -nodeType "transmat_photon" -nodeType "mip_rayswitch" -nodeType "mip_rayswitch_advanced" + -nodeType "mip_rayswitch_environment" -nodeType "mip_card_opacity" -nodeType "mip_motionblur" + -nodeType "mip_motion_vector" -nodeType "mip_matteshadow" -nodeType "mip_cameramap" + -nodeType "mip_mirrorball" -nodeType "mip_grayball" -nodeType "mip_gamma_gain" -nodeType "mip_render_subset" + -nodeType "mip_matteshadow_mtl" -nodeType "mip_binaryproxy" -nodeType "mip_rayswitch_stage" + -nodeType "mip_fgshooter" -nodeType "mib_ptex_lookup" -nodeType "misss_physical" + -nodeType "misss_physical_phen" -nodeType "misss_fast_shader" -nodeType "misss_fast_shader_x" + -nodeType "misss_fast_shader2" -nodeType "misss_fast_shader2_x" -nodeType "misss_skin_specular" + -nodeType "misss_lightmap_write" -nodeType "misss_lambert_gamma" -nodeType "misss_call_shader" + -nodeType "misss_set_normal" -nodeType "misss_fast_lmap_maya" -nodeType "misss_fast_simple_maya" + -nodeType "misss_fast_skin_maya" -nodeType "misss_fast_skin_phen" -nodeType "misss_fast_skin_phen_d" + -nodeType "misss_mia_skin2_phen" -nodeType "misss_mia_skin2_phen_d" -nodeType "misss_lightmap_phen" + -nodeType "misss_mia_skin2_surface_phen" -nodeType "surfaceSampler" -nodeType "mib_data_bool" + -nodeType "mib_data_int" -nodeType "mib_data_scalar" -nodeType "mib_data_vector" + -nodeType "mib_data_color" -nodeType "mib_data_string" -nodeType "mib_data_texture" + -nodeType "mib_data_shader" -nodeType "mib_data_bool_array" -nodeType "mib_data_int_array" + -nodeType "mib_data_scalar_array" -nodeType "mib_data_vector_array" -nodeType "mib_data_color_array" + -nodeType "mib_data_string_array" -nodeType "mib_data_texture_array" -nodeType "mib_data_shader_array" + -nodeType "mib_data_get_bool" -nodeType "mib_data_get_int" -nodeType "mib_data_get_scalar" + -nodeType "mib_data_get_vector" -nodeType "mib_data_get_color" -nodeType "mib_data_get_string" + -nodeType "mib_data_get_texture" -nodeType "mib_data_get_shader" -nodeType "mib_data_get_shader_bool" + -nodeType "mib_data_get_shader_int" -nodeType "mib_data_get_shader_scalar" -nodeType "mib_data_get_shader_vector" + -nodeType "mib_data_get_shader_color" -nodeType "user_ibl_env" -nodeType "user_ibl_rect" + -nodeType "mia_material_x_passes" -nodeType "mi_metallic_paint_x_passes" -nodeType "mi_car_paint_phen_x_passes" + -nodeType "misss_fast_shader_x_passes" -dataType "byteArray" "Mayatomr" "2014.0 - 3.11.1.4 "; +currentUnit -l centimeter -a degree -t film; +fileInfo "application" "maya"; +fileInfo "product" "Maya 2014"; +fileInfo "version" "2014 x64"; +fileInfo "cutIdentifier" "201303010241-864206"; +fileInfo "osv" "Microsoft Windows 7 Ultimate Edition, 64-bit Windows 7 Service Pack 1 (Build 7601)\n"; +createNode transform -s -n "persp"; + setAttr ".v" no; + setAttr ".t" -type "double3" 22.248422999787756 12.500732575524742 10.391306855519792 ; + setAttr ".r" -type "double3" -28.538352729610519 64.599999999998701 -3.7075007778321079e-015 ; +createNode camera -s -n "perspShape" -p "persp"; + setAttr -k off ".v" no; + setAttr ".fl" 34.999999999999993; + setAttr ".coi" 27.199165290100083; + setAttr ".imn" -type "string" "persp"; + setAttr ".den" -type "string" "persp_depth"; + setAttr ".man" -type "string" "persp_mask"; + setAttr ".hc" -type "string" "viewSet -p %camera"; +createNode transform -s -n "top"; + setAttr ".v" no; + setAttr ".t" -type "double3" 0 100.1 0 ; + setAttr ".r" -type "double3" -89.999999999999986 0 0 ; +createNode camera -s -n "topShape" -p "top"; + setAttr -k off ".v" no; + setAttr ".rnd" no; + setAttr ".coi" 100.1; + setAttr ".ow" 30; + setAttr ".imn" -type "string" "top"; + setAttr ".den" -type "string" "top_depth"; + setAttr ".man" -type "string" "top_mask"; + setAttr ".hc" -type "string" "viewSet -t %camera"; + setAttr ".o" yes; +createNode transform -s -n "front"; + setAttr ".v" no; + setAttr ".t" -type "double3" 0 0 100.1 ; +createNode camera -s -n "frontShape" -p "front"; + setAttr -k off ".v" no; + setAttr ".rnd" no; + setAttr ".coi" 100.1; + setAttr ".ow" 30; + setAttr ".imn" -type "string" "front"; + setAttr ".den" -type "string" "front_depth"; + setAttr ".man" -type "string" "front_mask"; + setAttr ".hc" -type "string" "viewSet -f %camera"; + setAttr ".o" yes; +createNode transform -s -n "side"; + setAttr ".v" no; + setAttr ".t" -type "double3" 100.1 0 0 ; + setAttr ".r" -type "double3" 0 89.999999999999986 0 ; +createNode camera -s -n "sideShape" -p "side"; + setAttr -k off ".v" no; + setAttr ".rnd" no; + setAttr ".coi" 100.1; + setAttr ".ow" 30; + setAttr ".imn" -type "string" "side"; + setAttr ".den" -type "string" "side_depth"; + setAttr ".man" -type "string" "side_mask"; + setAttr ".hc" -type "string" "viewSet -s %camera"; + setAttr ".o" yes; +createNode transform -n "Group"; +createNode transform -n "Group2" -p "Group"; +createNode transform -n "cubeR" -p "Group2"; + setAttr ".t" -type "double3" -5 0 0 ; +createNode mesh -n "cubeRShape" -p "cubeR"; + setAttr -k off ".v"; + setAttr ".vir" yes; + setAttr ".vif" yes; + setAttr ".uvst[0].uvsn" -type "string" "map1"; + setAttr ".cuvs" -type "string" "map1"; + setAttr ".dcc" -type "string" "Ambient+Diffuse"; + setAttr ".covm[0]" 0 1 1; + setAttr ".cdvm[0]" 0 1 1; +createNode transform -n "cubeL" -p "Group2"; + setAttr ".t" -type "double3" 5 -1.7155814546566843 0 ; +createNode mesh -n "cubeLShape" -p "cubeL"; + setAttr -k off ".v"; + setAttr ".vir" yes; + setAttr ".vif" yes; + setAttr ".uvst[0].uvsn" -type "string" "map1"; + setAttr -s 14 ".uvst[0].uvsp[0:13]" -type "float2" 0.375 0 0.625 0 0.375 + 0.25 0.625 0.25 0.375 0.5 0.625 0.5 0.375 0.75 0.625 0.75 0.375 1 0.625 1 0.875 0 + 0.875 0.25 0.125 0 0.125 0.25; + setAttr ".cuvs" -type "string" "map1"; + setAttr ".dcc" -type "string" "Ambient+Diffuse"; + setAttr ".covm[0]" 0 1 1; + setAttr ".cdvm[0]" 0 1 1; + setAttr -s 8 ".vt[0:7]" -0.5 -0.5 0.5 0.5 -0.5 0.5 -0.5 0.5 0.5 0.5 0.5 0.5 + -0.5 0.5 -0.5 0.5 0.5 -0.5 -0.5 -0.5 -0.5 0.5 -0.5 -0.5; + setAttr -s 12 ".ed[0:11]" 0 1 0 2 3 0 4 5 0 6 7 0 0 2 0 1 3 0 2 4 0 + 3 5 0 4 6 0 5 7 0 6 0 0 7 1 0; + setAttr -s 6 -ch 24 ".fc[0:5]" -type "polyFaces" + f 4 0 5 -2 -5 + mu 0 4 0 1 3 2 + f 4 1 7 -3 -7 + mu 0 4 2 3 5 4 + f 4 2 9 -4 -9 + mu 0 4 4 5 7 6 + f 4 3 11 -1 -11 + mu 0 4 6 7 9 8 + f 4 -12 -10 -8 -6 + mu 0 4 1 10 11 3 + f 4 10 4 6 8 + mu 0 4 12 0 2 13; + setAttr ".cd" -type "dataPolyComponent" Index_Data Edge 0 ; + setAttr ".cvd" -type "dataPolyComponent" Index_Data Vertex 0 ; + setAttr ".hfd" -type "dataPolyComponent" Index_Data Face 0 ; +createNode transform -n "Group3" -p "Group"; + setAttr ".t" -type "double3" 0 0 -2.8742420497365515 ; +createNode transform -n "R_cube" -p "Group3"; + setAttr ".t" -type "double3" -5 -0.71903628511057072 0 ; +createNode mesh -n "R_cubeShape" -p "R_cube"; + setAttr -k off ".v"; + setAttr ".vir" yes; + setAttr ".vif" yes; + setAttr ".uvst[0].uvsn" -type "string" "map1"; + setAttr -s 14 ".uvst[0].uvsp[0:13]" -type "float2" 0.375 0 0.625 0 0.375 + 0.25 0.625 0.25 0.375 0.5 0.625 0.5 0.375 0.75 0.625 0.75 0.375 1 0.625 1 0.875 0 + 0.875 0.25 0.125 0 0.125 0.25; + setAttr ".cuvs" -type "string" "map1"; + setAttr ".dcc" -type "string" "Ambient+Diffuse"; + setAttr ".covm[0]" 0 1 1; + setAttr ".cdvm[0]" 0 1 1; + setAttr -s 8 ".vt[0:7]" -0.5 -0.5 0.5 0.5 -0.5 0.5 -0.5 0.5 0.5 0.5 0.5 0.5 + -0.5 0.5 -0.5 0.5 0.5 -0.5 -0.5 -0.5 -0.5 0.5 -0.5 -0.5; + setAttr -s 12 ".ed[0:11]" 0 1 0 2 3 0 4 5 0 6 7 0 0 2 0 1 3 0 2 4 0 + 3 5 0 4 6 0 5 7 0 6 0 0 7 1 0; + setAttr -s 6 -ch 24 ".fc[0:5]" -type "polyFaces" + f 4 0 5 -2 -5 + mu 0 4 0 1 3 2 + f 4 1 7 -3 -7 + mu 0 4 2 3 5 4 + f 4 2 9 -4 -9 + mu 0 4 4 5 7 6 + f 4 3 11 -1 -11 + mu 0 4 6 7 9 8 + f 4 -12 -10 -8 -6 + mu 0 4 1 10 11 3 + f 4 10 4 6 8 + mu 0 4 12 0 2 13; + setAttr ".cd" -type "dataPolyComponent" Index_Data Edge 0 ; + setAttr ".cvd" -type "dataPolyComponent" Index_Data Vertex 0 ; + setAttr ".hfd" -type "dataPolyComponent" Index_Data Face 0 ; +createNode transform -n "L_cube" -p "Group3"; + setAttr ".t" -type "double3" 2.1362195941342836 4.3031875715542744 0 ; + setAttr -av ".tx"; + setAttr -av ".ty"; +createNode mesh -n "L_cubeShape" -p "L_cube"; + setAttr -k off ".v"; + setAttr ".vir" yes; + setAttr ".vif" yes; + setAttr ".uvst[0].uvsn" -type "string" "map1"; + setAttr -s 14 ".uvst[0].uvsp[0:13]" -type "float2" 0.375 0 0.625 0 0.375 + 0.25 0.625 0.25 0.375 0.5 0.625 0.5 0.375 0.75 0.625 0.75 0.375 1 0.625 1 0.875 0 + 0.875 0.25 0.125 0 0.125 0.25; + setAttr ".cuvs" -type "string" "map1"; + setAttr ".dcc" -type "string" "Ambient+Diffuse"; + setAttr ".covm[0]" 0 1 1; + setAttr ".cdvm[0]" 0 1 1; + setAttr -s 8 ".vt[0:7]" -0.5 -0.5 0.5 0.5 -0.5 0.5 -0.5 0.5 0.5 0.5 0.5 0.5 + -0.5 0.5 -0.5 0.5 0.5 -0.5 -0.5 -0.5 -0.5 0.5 -0.5 -0.5; + setAttr -s 12 ".ed[0:11]" 0 1 0 2 3 0 4 5 0 6 7 0 0 2 0 1 3 0 2 4 0 + 3 5 0 4 6 0 5 7 0 6 0 0 7 1 0; + setAttr -s 6 -ch 24 ".fc[0:5]" -type "polyFaces" + f 4 0 5 -2 -5 + mu 0 4 0 1 3 2 + f 4 1 7 -3 -7 + mu 0 4 2 3 5 4 + f 4 2 9 -4 -9 + mu 0 4 4 5 7 6 + f 4 3 11 -1 -11 + mu 0 4 6 7 9 8 + f 4 -12 -10 -8 -6 + mu 0 4 1 10 11 3 + f 4 10 4 6 8 + mu 0 4 12 0 2 13; + setAttr ".cd" -type "dataPolyComponent" Index_Data Edge 0 ; + setAttr ".cvd" -type "dataPolyComponent" Index_Data Vertex 0 ; + setAttr ".hfd" -type "dataPolyComponent" Index_Data Face 0 ; +createNode mentalrayItemsList -s -n "mentalrayItemsList"; +createNode mentalrayGlobals -s -n "mentalrayGlobals"; +createNode mentalrayOptions -s -n "miDefaultOptions"; + addAttr -ci true -m -sn "stringOptions" -ln "stringOptions" -at "compound" -nc + 3; + addAttr -ci true -sn "name" -ln "name" -dt "string" -p "stringOptions"; + addAttr -ci true -sn "value" -ln "value" -dt "string" -p "stringOptions"; + addAttr -ci true -sn "type" -ln "type" -dt "string" -p "stringOptions"; + addAttr -ci true -sn "miSamplesQualityR" -ln "miSamplesQualityR" -dv 0.25 -min 0.01 + -max 9999999.9000000004 -smn 0.1 -smx 2 -at "double"; + addAttr -ci true -sn "miSamplesQualityG" -ln "miSamplesQualityG" -dv 0.25 -min 0.01 + -max 9999999.9000000004 -smn 0.1 -smx 2 -at "double"; + addAttr -ci true -sn "miSamplesQualityB" -ln "miSamplesQualityB" -dv 0.25 -min 0.01 + -max 9999999.9000000004 -smn 0.1 -smx 2 -at "double"; + addAttr -ci true -sn "miSamplesQualityA" -ln "miSamplesQualityA" -dv 0.25 -min 0.01 + -max 9999999.9000000004 -smn 0.1 -smx 2 -at "double"; + addAttr -ci true -sn "miSamplesMin" -ln "miSamplesMin" -dv 1 -min 0.1 -at "double"; + addAttr -ci true -sn "miSamplesMax" -ln "miSamplesMax" -dv 100 -min 0.1 -at "double"; + addAttr -ci true -sn "miSamplesErrorCutoffR" -ln "miSamplesErrorCutoffR" -min 0 + -max 1 -at "double"; + addAttr -ci true -sn "miSamplesErrorCutoffG" -ln "miSamplesErrorCutoffG" -min 0 + -max 1 -at "double"; + addAttr -ci true -sn "miSamplesErrorCutoffB" -ln "miSamplesErrorCutoffB" -min 0 + -max 1 -at "double"; + addAttr -ci true -sn "miSamplesErrorCutoffA" -ln "miSamplesErrorCutoffA" -min 0 + -max 1 -at "double"; + addAttr -ci true -sn "miSamplesPerObject" -ln "miSamplesPerObject" -min 0 -max 1 + -at "bool"; + addAttr -ci true -sn "miRastShadingSamples" -ln "miRastShadingSamples" -dv 1 -min + 0.25 -at "double"; + addAttr -ci true -sn "miRastSamples" -ln "miRastSamples" -dv 3 -min 1 -at "long"; + addAttr -ci true -sn "miContrastAsColor" -ln "miContrastAsColor" -min 0 -max 1 -at "bool"; + addAttr -ci true -sn "miProgMaxTime" -ln "miProgMaxTime" -min 0 -at "long"; + addAttr -ci true -sn "miProgSubsampleSize" -ln "miProgSubsampleSize" -dv 4 -min + 1 -at "long"; + addAttr -ci true -sn "miTraceCameraMotionVectors" -ln "miTraceCameraMotionVectors" + -min 0 -max 1 -at "bool"; + addAttr -ci true -sn "miTraceCameraClip" -ln "miTraceCameraClip" -min 0 -max 1 -at "bool"; + setAttr -s 45 ".stringOptions"; + setAttr ".stringOptions[0].name" -type "string" "rast motion factor"; + setAttr ".stringOptions[0].value" -type "string" "1.0"; + setAttr ".stringOptions[0].type" -type "string" "scalar"; + setAttr ".stringOptions[1].name" -type "string" "rast transparency depth"; + setAttr ".stringOptions[1].value" -type "string" "8"; + setAttr ".stringOptions[1].type" -type "string" "integer"; + setAttr ".stringOptions[2].name" -type "string" "rast useopacity"; + setAttr ".stringOptions[2].value" -type "string" "true"; + setAttr ".stringOptions[2].type" -type "string" "boolean"; + setAttr ".stringOptions[3].name" -type "string" "importon"; + setAttr ".stringOptions[3].value" -type "string" "false"; + setAttr ".stringOptions[3].type" -type "string" "boolean"; + setAttr ".stringOptions[4].name" -type "string" "importon density"; + setAttr ".stringOptions[4].value" -type "string" "1.0"; + setAttr ".stringOptions[4].type" -type "string" "scalar"; + setAttr ".stringOptions[5].name" -type "string" "importon merge"; + setAttr ".stringOptions[5].value" -type "string" "0.0"; + setAttr ".stringOptions[5].type" -type "string" "scalar"; + setAttr ".stringOptions[6].name" -type "string" "importon trace depth"; + setAttr ".stringOptions[6].value" -type "string" "0"; + setAttr ".stringOptions[6].type" -type "string" "integer"; + setAttr ".stringOptions[7].name" -type "string" "importon traverse"; + setAttr ".stringOptions[7].value" -type "string" "true"; + setAttr ".stringOptions[7].type" -type "string" "boolean"; + setAttr ".stringOptions[8].name" -type "string" "shadowmap pixel samples"; + setAttr ".stringOptions[8].value" -type "string" "3"; + setAttr ".stringOptions[8].type" -type "string" "integer"; + setAttr ".stringOptions[9].name" -type "string" "ambient occlusion"; + setAttr ".stringOptions[9].value" -type "string" "false"; + setAttr ".stringOptions[9].type" -type "string" "boolean"; + setAttr ".stringOptions[10].name" -type "string" "ambient occlusion rays"; + setAttr ".stringOptions[10].value" -type "string" "256"; + setAttr ".stringOptions[10].type" -type "string" "integer"; + setAttr ".stringOptions[11].name" -type "string" "ambient occlusion cache"; + setAttr ".stringOptions[11].value" -type "string" "false"; + setAttr ".stringOptions[11].type" -type "string" "boolean"; + setAttr ".stringOptions[12].name" -type "string" "ambient occlusion cache density"; + setAttr ".stringOptions[12].value" -type "string" "1.0"; + setAttr ".stringOptions[12].type" -type "string" "scalar"; + setAttr ".stringOptions[13].name" -type "string" "ambient occlusion cache points"; + setAttr ".stringOptions[13].value" -type "string" "64"; + setAttr ".stringOptions[13].type" -type "string" "integer"; + setAttr ".stringOptions[14].name" -type "string" "irradiance particles"; + setAttr ".stringOptions[14].value" -type "string" "false"; + setAttr ".stringOptions[14].type" -type "string" "boolean"; + setAttr ".stringOptions[15].name" -type "string" "irradiance particles rays"; + setAttr ".stringOptions[15].value" -type "string" "256"; + setAttr ".stringOptions[15].type" -type "string" "integer"; + setAttr ".stringOptions[16].name" -type "string" "irradiance particles interpolate"; + setAttr ".stringOptions[16].value" -type "string" "1"; + setAttr ".stringOptions[16].type" -type "string" "integer"; + setAttr ".stringOptions[17].name" -type "string" "irradiance particles interppoints"; + setAttr ".stringOptions[17].value" -type "string" "64"; + setAttr ".stringOptions[17].type" -type "string" "integer"; + setAttr ".stringOptions[18].name" -type "string" "irradiance particles indirect passes"; + setAttr ".stringOptions[18].value" -type "string" "0"; + setAttr ".stringOptions[18].type" -type "string" "integer"; + setAttr ".stringOptions[19].name" -type "string" "irradiance particles scale"; + setAttr ".stringOptions[19].value" -type "string" "1.0"; + setAttr ".stringOptions[19].type" -type "string" "scalar"; + setAttr ".stringOptions[20].name" -type "string" "irradiance particles env"; + setAttr ".stringOptions[20].value" -type "string" "true"; + setAttr ".stringOptions[20].type" -type "string" "boolean"; + setAttr ".stringOptions[21].name" -type "string" "irradiance particles env rays"; + setAttr ".stringOptions[21].value" -type "string" "256"; + setAttr ".stringOptions[21].type" -type "string" "integer"; + setAttr ".stringOptions[22].name" -type "string" "irradiance particles env scale"; + setAttr ".stringOptions[22].value" -type "string" "1"; + setAttr ".stringOptions[22].type" -type "string" "integer"; + setAttr ".stringOptions[23].name" -type "string" "irradiance particles rebuild"; + setAttr ".stringOptions[23].value" -type "string" "true"; + setAttr ".stringOptions[23].type" -type "string" "boolean"; + setAttr ".stringOptions[24].name" -type "string" "irradiance particles file"; + setAttr ".stringOptions[24].value" -type "string" ""; + setAttr ".stringOptions[24].type" -type "string" "string"; + setAttr ".stringOptions[25].name" -type "string" "geom displace motion factor"; + setAttr ".stringOptions[25].value" -type "string" "1.0"; + setAttr ".stringOptions[25].type" -type "string" "scalar"; + setAttr ".stringOptions[26].name" -type "string" "contrast all buffers"; + setAttr ".stringOptions[26].value" -type "string" "true"; + setAttr ".stringOptions[26].type" -type "string" "boolean"; + setAttr ".stringOptions[27].name" -type "string" "finalgather normal tolerance"; + setAttr ".stringOptions[27].value" -type "string" "25.842"; + setAttr ".stringOptions[27].type" -type "string" "scalar"; + setAttr ".stringOptions[28].name" -type "string" "trace camera clip"; + setAttr ".stringOptions[28].value" -type "string" "false"; + setAttr ".stringOptions[28].type" -type "string" "boolean"; + setAttr ".stringOptions[29].name" -type "string" "unified sampling"; + setAttr ".stringOptions[29].value" -type "string" "true"; + setAttr ".stringOptions[29].type" -type "string" "boolean"; + setAttr ".stringOptions[30].name" -type "string" "samples quality"; + setAttr ".stringOptions[30].value" -type "string" "0.5 0.5 0.5 0.5"; + setAttr ".stringOptions[30].type" -type "string" "color"; + setAttr ".stringOptions[31].name" -type "string" "samples min"; + setAttr ".stringOptions[31].value" -type "string" "1.0"; + setAttr ".stringOptions[31].type" -type "string" "scalar"; + setAttr ".stringOptions[32].name" -type "string" "samples max"; + setAttr ".stringOptions[32].value" -type "string" "100.0"; + setAttr ".stringOptions[32].type" -type "string" "scalar"; + setAttr ".stringOptions[33].name" -type "string" "samples error cutoff"; + setAttr ".stringOptions[33].value" -type "string" "0.0 0.0 0.0 0.0"; + setAttr ".stringOptions[33].type" -type "string" "color"; + setAttr ".stringOptions[34].name" -type "string" "samples per object"; + setAttr ".stringOptions[34].value" -type "string" "false"; + setAttr ".stringOptions[34].type" -type "string" "boolean"; + setAttr ".stringOptions[35].name" -type "string" "progressive"; + setAttr ".stringOptions[35].value" -type "string" "false"; + setAttr ".stringOptions[35].type" -type "string" "boolean"; + setAttr ".stringOptions[36].name" -type "string" "progressive max time"; + setAttr ".stringOptions[36].value" -type "string" "0"; + setAttr ".stringOptions[36].type" -type "string" "integer"; + setAttr ".stringOptions[37].name" -type "string" "progressive subsampling size"; + setAttr ".stringOptions[37].value" -type "string" "1"; + setAttr ".stringOptions[37].type" -type "string" "integer"; + setAttr ".stringOptions[38].name" -type "string" "iray"; + setAttr ".stringOptions[38].value" -type "string" "false"; + setAttr ".stringOptions[38].type" -type "string" "boolean"; + setAttr ".stringOptions[39].name" -type "string" "light relative scale"; + setAttr ".stringOptions[39].value" -type "string" "0.31831"; + setAttr ".stringOptions[39].type" -type "string" "scalar"; + setAttr ".stringOptions[40].name" -type "string" "trace camera motion vectors"; + setAttr ".stringOptions[40].value" -type "string" "false"; + setAttr ".stringOptions[40].type" -type "string" "boolean"; + setAttr ".stringOptions[41].name" -type "string" "ray differentials"; + setAttr ".stringOptions[41].value" -type "string" "true"; + setAttr ".stringOptions[41].type" -type "string" "boolean"; + setAttr ".stringOptions[42].name" -type "string" "environment lighting mode"; + setAttr ".stringOptions[42].value" -type "string" "off"; + setAttr ".stringOptions[42].type" -type "string" "string"; + setAttr ".stringOptions[43].name" -type "string" "environment lighting quality"; + setAttr ".stringOptions[43].value" -type "string" "0.167"; + setAttr ".stringOptions[43].type" -type "string" "scalar"; + setAttr ".stringOptions[44].name" -type "string" "environment lighting shadow"; + setAttr ".stringOptions[44].value" -type "string" "transparent"; + setAttr ".stringOptions[44].type" -type "string" "string"; +createNode mentalrayFramebuffer -s -n "miDefaultFramebuffer"; +createNode lightLinker -s -n "lightLinker1"; + setAttr -s 2 ".lnk"; + setAttr -s 2 ".slnk"; +createNode displayLayerManager -n "layerManager"; +createNode displayLayer -n "defaultLayer"; +createNode renderLayerManager -n "renderLayerManager"; +createNode renderLayer -n "defaultRenderLayer"; + setAttr ".g" yes; +createNode polyCube -n "polyCube1"; + setAttr ".cuv" 4; +createNode script -n "uiConfigurationScriptNode"; + setAttr ".b" -type "string" ( + "// Maya Mel UI Configuration File.\n//\n// This script is machine generated. Edit at your own risk.\n//\n//\n\nglobal string $gMainPane;\nif (`paneLayout -exists $gMainPane`) {\n\n\tglobal int $gUseScenePanelConfig;\n\tint $useSceneConfig = $gUseScenePanelConfig;\n\tint $menusOkayInPanels = `optionVar -q allowMenusInPanels`;\tint $nVisPanes = `paneLayout -q -nvp $gMainPane`;\n\tint $nPanes = 0;\n\tstring $editorName;\n\tstring $panelName;\n\tstring $itemFilterName;\n\tstring $panelConfig;\n\n\t//\n\t// get current state of the UI\n\t//\n\tsceneUIReplacement -update $gMainPane;\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"modelPanel\" (localizedPanelLabel(\"Top View\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `modelPanel -unParent -l (localizedPanelLabel(\"Top View\")) -mbv $menusOkayInPanels `;\n\t\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"top\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"wireframe\" \n" + + " -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 1\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 8192\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -maxConstantTransparency 1\n -rendererName \"base_OpenGL_Renderer\" \n" + + " -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n" + + " -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tmodelPanel -edit -l (localizedPanelLabel(\"Top View\")) -mbv $menusOkayInPanels $panelName;\n" + + "\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"top\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"wireframe\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 1\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 8192\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -maxConstantTransparency 1\n" + + " -rendererName \"base_OpenGL_Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n" + + " -ikHandles 1\n -deformers 1\n -dynamics 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"modelPanel\" (localizedPanelLabel(\"Side View\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `modelPanel -unParent -l (localizedPanelLabel(\"Side View\")) -mbv $menusOkayInPanels `;\n" + + "\t\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"side\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"wireframe\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 1\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 8192\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n" + + " -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -maxConstantTransparency 1\n -rendererName \"base_OpenGL_Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n" + + " -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n" + + " $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tmodelPanel -edit -l (localizedPanelLabel(\"Side View\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"side\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"wireframe\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 1\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 8192\n -fogging 0\n -fogSource \"fragment\" \n" + + " -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -maxConstantTransparency 1\n -rendererName \"base_OpenGL_Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n" + + " -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"modelPanel\" (localizedPanelLabel(\"Front View\")) `;\n" + + "\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `modelPanel -unParent -l (localizedPanelLabel(\"Front View\")) -mbv $menusOkayInPanels `;\n\t\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"front\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"wireframe\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 1\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n" + + " -textureMaxSize 8192\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -maxConstantTransparency 1\n -rendererName \"base_OpenGL_Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n" + + " -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n" + + " -shadows 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tmodelPanel -edit -l (localizedPanelLabel(\"Front View\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"front\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"wireframe\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 1\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n" + + " -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 8192\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -maxConstantTransparency 1\n -rendererName \"base_OpenGL_Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n" + + " -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n" + + " modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"modelPanel\" (localizedPanelLabel(\"Persp View\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `modelPanel -unParent -l (localizedPanelLabel(\"Persp View\")) -mbv $menusOkayInPanels `;\n\t\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"persp\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"smoothShaded\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 1\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n" + + " -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 8192\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -maxConstantTransparency 1\n -rendererName \"base_OpenGL_Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n" + + " -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n" + + " -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tmodelPanel -edit -l (localizedPanelLabel(\"Persp View\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"persp\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"smoothShaded\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n" + + " -twoSidedLighting 1\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 8192\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -maxConstantTransparency 1\n -rendererName \"base_OpenGL_Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n" + + " -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n" + + " -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"outlinerPanel\" (localizedPanelLabel(\"Outliner\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `outlinerPanel -unParent -l (localizedPanelLabel(\"Outliner\")) -mbv $menusOkayInPanels `;\n\t\t\t$editorName = $panelName;\n outlinerEditor -e \n -docTag \"isolOutln_fromSeln\" \n -showShapes 0\n -showReferenceNodes 1\n -showReferenceMembers 1\n -showAttributes 0\n -showConnected 0\n -showAnimCurvesOnly 0\n -showMuteInfo 0\n -organizeByLayer 1\n -showAnimLayerWeight 1\n" + + " -autoExpandLayers 1\n -autoExpand 0\n -showDagOnly 1\n -showAssets 1\n -showContainedOnly 1\n -showPublishedAsConnected 0\n -showContainerContents 1\n -ignoreDagHierarchy 0\n -expandConnections 0\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 1\n -showLeafs 1\n -showNumericAttrsOnly 0\n -highlightActive 1\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"defaultSetFilter\" \n -showSetMembers 1\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n" + + " -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 0\n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\toutlinerPanel -edit -l (localizedPanelLabel(\"Outliner\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n outlinerEditor -e \n -docTag \"isolOutln_fromSeln\" \n -showShapes 0\n -showReferenceNodes 1\n -showReferenceMembers 1\n -showAttributes 0\n -showConnected 0\n -showAnimCurvesOnly 0\n -showMuteInfo 0\n -organizeByLayer 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n" + + " -autoExpand 0\n -showDagOnly 1\n -showAssets 1\n -showContainedOnly 1\n -showPublishedAsConnected 0\n -showContainerContents 1\n -ignoreDagHierarchy 0\n -expandConnections 0\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 1\n -showLeafs 1\n -showNumericAttrsOnly 0\n -highlightActive 1\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"defaultSetFilter\" \n -showSetMembers 1\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n" + + " -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 0\n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"graphEditor\" (localizedPanelLabel(\"Graph Editor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"graphEditor\" -l (localizedPanelLabel(\"Graph Editor\")) -mbv $menusOkayInPanels `;\n\n\t\t\t$editorName = ($panelName+\"OutlineEd\");\n outlinerEditor -e \n -showShapes 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 1\n -showConnected 1\n -showAnimCurvesOnly 1\n -showMuteInfo 0\n -organizeByLayer 1\n -showAnimLayerWeight 1\n" + + " -autoExpandLayers 1\n -autoExpand 1\n -showDagOnly 0\n -showAssets 1\n -showContainedOnly 0\n -showPublishedAsConnected 0\n -showContainerContents 0\n -ignoreDagHierarchy 0\n -expandConnections 1\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 0\n -showLeafs 1\n -showNumericAttrsOnly 1\n -highlightActive 0\n -autoSelectNewObjects 1\n -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 1\n -setFilter \"0\" \n -showSetMembers 0\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n" + + " -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 1\n -mapMotionTrails 1\n $editorName;\n\n\t\t\t$editorName = ($panelName+\"GraphEd\");\n animCurveEditor -e \n -displayKeys 1\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 1\n -displayInfinities 0\n -autoFit 0\n -snapTime \"integer\" \n -snapValue \"none\" \n -showResults \"off\" \n -showBufferCurves \"off\" \n -smoothness \"fine\" \n -resultSamples 1\n -resultScreenSamples 0\n -resultUpdate \"delayed\" \n" + + " -showUpstreamCurves 1\n -stackedCurves 0\n -stackedCurvesMin -1\n -stackedCurvesMax 1\n -stackedCurvesSpace 0.2\n -displayNormalized 0\n -preSelectionHighlight 0\n -constrainDrag 0\n -classicMode 1\n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Graph Editor\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = ($panelName+\"OutlineEd\");\n outlinerEditor -e \n -showShapes 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 1\n -showConnected 1\n -showAnimCurvesOnly 1\n -showMuteInfo 0\n -organizeByLayer 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 1\n -showDagOnly 0\n -showAssets 1\n" + + " -showContainedOnly 0\n -showPublishedAsConnected 0\n -showContainerContents 0\n -ignoreDagHierarchy 0\n -expandConnections 1\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 0\n -showLeafs 1\n -showNumericAttrsOnly 1\n -highlightActive 0\n -autoSelectNewObjects 1\n -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 1\n -setFilter \"0\" \n -showSetMembers 0\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n" + + " -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 1\n -mapMotionTrails 1\n $editorName;\n\n\t\t\t$editorName = ($panelName+\"GraphEd\");\n animCurveEditor -e \n -displayKeys 1\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 1\n -displayInfinities 0\n -autoFit 0\n -snapTime \"integer\" \n -snapValue \"none\" \n -showResults \"off\" \n -showBufferCurves \"off\" \n -smoothness \"fine\" \n -resultSamples 1\n -resultScreenSamples 0\n -resultUpdate \"delayed\" \n -showUpstreamCurves 1\n -stackedCurves 0\n -stackedCurvesMin -1\n -stackedCurvesMax 1\n" + + " -stackedCurvesSpace 0.2\n -displayNormalized 0\n -preSelectionHighlight 0\n -constrainDrag 0\n -classicMode 1\n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"dopeSheetPanel\" (localizedPanelLabel(\"Dope Sheet\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"dopeSheetPanel\" -l (localizedPanelLabel(\"Dope Sheet\")) -mbv $menusOkayInPanels `;\n\n\t\t\t$editorName = ($panelName+\"OutlineEd\");\n outlinerEditor -e \n -showShapes 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 1\n -showConnected 1\n -showAnimCurvesOnly 1\n -showMuteInfo 0\n -organizeByLayer 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 0\n" + + " -showDagOnly 0\n -showAssets 1\n -showContainedOnly 0\n -showPublishedAsConnected 0\n -showContainerContents 0\n -ignoreDagHierarchy 0\n -expandConnections 1\n -showUpstreamCurves 1\n -showUnitlessCurves 0\n -showCompounds 1\n -showLeafs 1\n -showNumericAttrsOnly 1\n -highlightActive 0\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 1\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"0\" \n -showSetMembers 0\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n" + + " -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 1\n $editorName;\n\n\t\t\t$editorName = ($panelName+\"DopeSheetEd\");\n dopeSheetEditor -e \n -displayKeys 1\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 0\n -displayInfinities 0\n -autoFit 0\n -snapTime \"integer\" \n -snapValue \"none\" \n -outliner \"dopeSheetPanel1OutlineEd\" \n -showSummary 1\n -showScene 0\n -hierarchyBelow 0\n -showTicks 1\n -selectionWindow 0 0 0 0 \n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n" + + "\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Dope Sheet\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = ($panelName+\"OutlineEd\");\n outlinerEditor -e \n -showShapes 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 1\n -showConnected 1\n -showAnimCurvesOnly 1\n -showMuteInfo 0\n -organizeByLayer 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 0\n -showDagOnly 0\n -showAssets 1\n -showContainedOnly 0\n -showPublishedAsConnected 0\n -showContainerContents 0\n -ignoreDagHierarchy 0\n -expandConnections 1\n -showUpstreamCurves 1\n -showUnitlessCurves 0\n -showCompounds 1\n -showLeafs 1\n -showNumericAttrsOnly 1\n -highlightActive 0\n" + + " -autoSelectNewObjects 0\n -doNotSelectNewObjects 1\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"0\" \n -showSetMembers 0\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 1\n $editorName;\n\n\t\t\t$editorName = ($panelName+\"DopeSheetEd\");\n dopeSheetEditor -e \n" + + " -displayKeys 1\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 0\n -displayInfinities 0\n -autoFit 0\n -snapTime \"integer\" \n -snapValue \"none\" \n -outliner \"dopeSheetPanel1OutlineEd\" \n -showSummary 1\n -showScene 0\n -hierarchyBelow 0\n -showTicks 1\n -selectionWindow 0 0 0 0 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"clipEditorPanel\" (localizedPanelLabel(\"Trax Editor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"clipEditorPanel\" -l (localizedPanelLabel(\"Trax Editor\")) -mbv $menusOkayInPanels `;\n\n\t\t\t$editorName = clipEditorNameFromPanel($panelName);\n clipEditor -e \n -displayKeys 0\n -displayTangents 0\n" + + " -displayActiveKeys 0\n -displayActiveKeyTangents 0\n -displayInfinities 0\n -autoFit 0\n -snapTime \"none\" \n -snapValue \"none\" \n -manageSequencer 0 \n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Trax Editor\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = clipEditorNameFromPanel($panelName);\n clipEditor -e \n -displayKeys 0\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 0\n -displayInfinities 0\n -autoFit 0\n -snapTime \"none\" \n -snapValue \"none\" \n -manageSequencer 0 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"sequenceEditorPanel\" (localizedPanelLabel(\"Camera Sequencer\")) `;\n" + + "\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"sequenceEditorPanel\" -l (localizedPanelLabel(\"Camera Sequencer\")) -mbv $menusOkayInPanels `;\n\n\t\t\t$editorName = sequenceEditorNameFromPanel($panelName);\n clipEditor -e \n -displayKeys 0\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 0\n -displayInfinities 0\n -autoFit 0\n -snapTime \"none\" \n -snapValue \"none\" \n -manageSequencer 1 \n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Camera Sequencer\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = sequenceEditorNameFromPanel($panelName);\n clipEditor -e \n -displayKeys 0\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 0\n -displayInfinities 0\n" + + " -autoFit 0\n -snapTime \"none\" \n -snapValue \"none\" \n -manageSequencer 1 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"hyperGraphPanel\" (localizedPanelLabel(\"Hypergraph Hierarchy\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"hyperGraphPanel\" -l (localizedPanelLabel(\"Hypergraph Hierarchy\")) -mbv $menusOkayInPanels `;\n\n\t\t\t$editorName = ($panelName+\"HyperGraphEd\");\n hyperGraph -e \n -graphLayoutStyle \"hierarchicalLayout\" \n -orientation \"horiz\" \n -mergeConnections 0\n -zoom 1\n -animateTransition 0\n -showRelationships 1\n -showShapes 0\n -showDeformers 0\n -showExpressions 0\n -showConstraints 0\n -showConnectionFromSelected 0\n" + + " -showConnectionToSelected 0\n -showUnderworld 0\n -showInvisible 0\n -transitionFrames 1\n -opaqueContainers 0\n -freeform 0\n -imagePosition 0 0 \n -imageScale 1\n -imageEnabled 0\n -graphType \"DAG\" \n -heatMapDisplay 0\n -updateSelection 1\n -updateNodeAdded 1\n -useDrawOverrideColor 0\n -limitGraphTraversal -1\n -range 0 0 \n -iconSize \"smallIcons\" \n -showCachedConnections 0\n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Hypergraph Hierarchy\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = ($panelName+\"HyperGraphEd\");\n hyperGraph -e \n -graphLayoutStyle \"hierarchicalLayout\" \n -orientation \"horiz\" \n -mergeConnections 0\n" + + " -zoom 1\n -animateTransition 0\n -showRelationships 1\n -showShapes 0\n -showDeformers 0\n -showExpressions 0\n -showConstraints 0\n -showConnectionFromSelected 0\n -showConnectionToSelected 0\n -showUnderworld 0\n -showInvisible 0\n -transitionFrames 1\n -opaqueContainers 0\n -freeform 0\n -imagePosition 0 0 \n -imageScale 1\n -imageEnabled 0\n -graphType \"DAG\" \n -heatMapDisplay 0\n -updateSelection 1\n -updateNodeAdded 1\n -useDrawOverrideColor 0\n -limitGraphTraversal -1\n -range 0 0 \n -iconSize \"smallIcons\" \n -showCachedConnections 0\n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"hyperShadePanel\" (localizedPanelLabel(\"Hypershade\")) `;\n" + + "\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"hyperShadePanel\" -l (localizedPanelLabel(\"Hypershade\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Hypershade\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"visorPanel\" (localizedPanelLabel(\"Visor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"visorPanel\" -l (localizedPanelLabel(\"Visor\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Visor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"nodeEditorPanel\" (localizedPanelLabel(\"Node Editor\")) `;\n\tif (\"\" == $panelName) {\n" + + "\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"nodeEditorPanel\" -l (localizedPanelLabel(\"Node Editor\")) -mbv $menusOkayInPanels `;\n\n\t\t\t$editorName = ($panelName+\"NodeEditorEd\");\n nodeEditor -e \n -allAttributes 0\n -allNodes 0\n -autoSizeNodes 1\n -createNodeCommand \"nodeEdCreateNodeCommand\" \n -defaultPinnedState 0\n -ignoreAssets 1\n -additiveGraphingMode 0\n -settingsChangedCallback \"nodeEdSyncControls\" \n -traversalDepthLimit -1\n -keyPressCommand \"nodeEdKeyPressCommand\" \n -keyReleaseCommand \"nodeEdKeyReleaseCommand\" \n -nodeTitleMode \"name\" \n -gridSnap 0\n -gridVisibility 1\n -popupMenuScript \"nodeEdBuildPanelMenus\" \n -island 0\n -showNamespace 1\n -showShapes 1\n -showSGShapes 0\n -showTransforms 1\n" + + " -syncedSelection 1\n -extendToShapes 1\n $editorName;;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Node Editor\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = ($panelName+\"NodeEditorEd\");\n nodeEditor -e \n -allAttributes 0\n -allNodes 0\n -autoSizeNodes 1\n -createNodeCommand \"nodeEdCreateNodeCommand\" \n -defaultPinnedState 0\n -ignoreAssets 1\n -additiveGraphingMode 0\n -settingsChangedCallback \"nodeEdSyncControls\" \n -traversalDepthLimit -1\n -keyPressCommand \"nodeEdKeyPressCommand\" \n -keyReleaseCommand \"nodeEdKeyReleaseCommand\" \n -nodeTitleMode \"name\" \n -gridSnap 0\n -gridVisibility 1\n -popupMenuScript \"nodeEdBuildPanelMenus\" \n -island 0\n -showNamespace 1\n" + + " -showShapes 1\n -showSGShapes 0\n -showTransforms 1\n -syncedSelection 1\n -extendToShapes 1\n $editorName;;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"createNodePanel\" (localizedPanelLabel(\"Create Node\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"createNodePanel\" -l (localizedPanelLabel(\"Create Node\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Create Node\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"polyTexturePlacementPanel\" (localizedPanelLabel(\"UV Texture Editor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"polyTexturePlacementPanel\" -l (localizedPanelLabel(\"UV Texture Editor\")) -mbv $menusOkayInPanels `;\n" + + "\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"UV Texture Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"renderWindowPanel\" (localizedPanelLabel(\"Render View\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"renderWindowPanel\" -l (localizedPanelLabel(\"Render View\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Render View\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"blendShapePanel\" (localizedPanelLabel(\"Blend Shape\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\tblendShapePanel -unParent -l (localizedPanelLabel(\"Blend Shape\")) -mbv $menusOkayInPanels ;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n" + + "\t\tblendShapePanel -edit -l (localizedPanelLabel(\"Blend Shape\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"dynRelEdPanel\" (localizedPanelLabel(\"Dynamic Relationships\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"dynRelEdPanel\" -l (localizedPanelLabel(\"Dynamic Relationships\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Dynamic Relationships\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"relationshipPanel\" (localizedPanelLabel(\"Relationship Editor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"relationshipPanel\" -l (localizedPanelLabel(\"Relationship Editor\")) -mbv $menusOkayInPanels `;\n" + + "\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Relationship Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"referenceEditorPanel\" (localizedPanelLabel(\"Reference Editor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"referenceEditorPanel\" -l (localizedPanelLabel(\"Reference Editor\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Reference Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"componentEditorPanel\" (localizedPanelLabel(\"Component Editor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"componentEditorPanel\" -l (localizedPanelLabel(\"Component Editor\")) -mbv $menusOkayInPanels `;\n" + + "\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Component Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"dynPaintScriptedPanelType\" (localizedPanelLabel(\"Paint Effects\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"dynPaintScriptedPanelType\" -l (localizedPanelLabel(\"Paint Effects\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Paint Effects\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"scriptEditorPanel\" (localizedPanelLabel(\"Script Editor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"scriptEditorPanel\" -l (localizedPanelLabel(\"Script Editor\")) -mbv $menusOkayInPanels `;\n" + + "\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Script Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\tif ($useSceneConfig) {\n\t\tscriptedPanel -e -to $panelName;\n\t}\n\n\n\tif ($useSceneConfig) {\n string $configName = `getPanel -cwl (localizedPanelLabel(\"Current Layout\"))`;\n if (\"\" != $configName) {\n\t\t\tpanelConfiguration -edit -label (localizedPanelLabel(\"Current Layout\")) \n\t\t\t\t-defaultImage \"vacantCell.xP:/\"\n\t\t\t\t-image \"\"\n\t\t\t\t-sc false\n\t\t\t\t-configString \"global string $gMainPane; paneLayout -e -cn \\\"single\\\" -ps 1 100 100 $gMainPane;\"\n\t\t\t\t-removeAllPanels\n\t\t\t\t-ap false\n\t\t\t\t\t(localizedPanelLabel(\"Persp View\")) \n\t\t\t\t\t\"modelPanel\"\n" + + "\t\t\t\t\t\"$panelName = `modelPanel -unParent -l (localizedPanelLabel(\\\"Persp View\\\")) -mbv $menusOkayInPanels `;\\n$editorName = $panelName;\\nmodelEditor -e \\n -cam `findStartUpCamera persp` \\n -useInteractiveMode 0\\n -displayLights \\\"default\\\" \\n -displayAppearance \\\"smoothShaded\\\" \\n -activeOnly 0\\n -ignorePanZoom 0\\n -wireframeOnShaded 0\\n -headsUpDisplay 1\\n -selectionHiliteDisplay 1\\n -useDefaultMaterial 0\\n -bufferMode \\\"double\\\" \\n -twoSidedLighting 1\\n -backfaceCulling 0\\n -xray 0\\n -jointXray 0\\n -activeComponentsXray 0\\n -displayTextures 0\\n -smoothWireframe 0\\n -lineWidth 1\\n -textureAnisotropic 0\\n -textureHilight 1\\n -textureSampling 2\\n -textureDisplay \\\"modulate\\\" \\n -textureMaxSize 8192\\n -fogging 0\\n -fogSource \\\"fragment\\\" \\n -fogMode \\\"linear\\\" \\n -fogStart 0\\n -fogEnd 100\\n -fogDensity 0.1\\n -fogColor 0.5 0.5 0.5 1 \\n -maxConstantTransparency 1\\n -rendererName \\\"base_OpenGL_Renderer\\\" \\n -objectFilterShowInHUD 1\\n -isFiltered 0\\n -colorResolution 256 256 \\n -bumpResolution 512 512 \\n -textureCompression 0\\n -transparencyAlgorithm \\\"frontAndBackCull\\\" \\n -transpInShadows 0\\n -cullingOverride \\\"none\\\" \\n -lowQualityLighting 0\\n -maximumNumHardwareLights 1\\n -occlusionCulling 0\\n -shadingModel 0\\n -useBaseRenderer 0\\n -useReducedRenderer 0\\n -smallObjectCulling 0\\n -smallObjectThreshold -1 \\n -interactiveDisableShadows 0\\n -interactiveBackFaceCull 0\\n -sortTransparent 1\\n -nurbsCurves 1\\n -nurbsSurfaces 1\\n -polymeshes 1\\n -subdivSurfaces 1\\n -planes 1\\n -lights 1\\n -cameras 1\\n -controlVertices 1\\n -hulls 1\\n -grid 1\\n -imagePlane 1\\n -joints 1\\n -ikHandles 1\\n -deformers 1\\n -dynamics 1\\n -fluids 1\\n -hairSystems 1\\n -follicles 1\\n -nCloths 1\\n -nParticles 1\\n -nRigids 1\\n -dynamicConstraints 1\\n -locators 1\\n -manipulators 1\\n -pluginShapes 1\\n -dimensions 1\\n -handles 1\\n -pivots 1\\n -textures 1\\n -strokes 1\\n -motionTrails 1\\n -clipGhosts 1\\n -greasePencils 1\\n -shadows 0\\n $editorName;\\nmodelEditor -e -viewSelected 0 $editorName;\\nmodelEditor -e \\n -pluginObjects \\\"gpuCacheDisplayFilter\\\" 1 \\n $editorName\"\n" + + "\t\t\t\t\t\"modelPanel -edit -l (localizedPanelLabel(\\\"Persp View\\\")) -mbv $menusOkayInPanels $panelName;\\n$editorName = $panelName;\\nmodelEditor -e \\n -cam `findStartUpCamera persp` \\n -useInteractiveMode 0\\n -displayLights \\\"default\\\" \\n -displayAppearance \\\"smoothShaded\\\" \\n -activeOnly 0\\n -ignorePanZoom 0\\n -wireframeOnShaded 0\\n -headsUpDisplay 1\\n -selectionHiliteDisplay 1\\n -useDefaultMaterial 0\\n -bufferMode \\\"double\\\" \\n -twoSidedLighting 1\\n -backfaceCulling 0\\n -xray 0\\n -jointXray 0\\n -activeComponentsXray 0\\n -displayTextures 0\\n -smoothWireframe 0\\n -lineWidth 1\\n -textureAnisotropic 0\\n -textureHilight 1\\n -textureSampling 2\\n -textureDisplay \\\"modulate\\\" \\n -textureMaxSize 8192\\n -fogging 0\\n -fogSource \\\"fragment\\\" \\n -fogMode \\\"linear\\\" \\n -fogStart 0\\n -fogEnd 100\\n -fogDensity 0.1\\n -fogColor 0.5 0.5 0.5 1 \\n -maxConstantTransparency 1\\n -rendererName \\\"base_OpenGL_Renderer\\\" \\n -objectFilterShowInHUD 1\\n -isFiltered 0\\n -colorResolution 256 256 \\n -bumpResolution 512 512 \\n -textureCompression 0\\n -transparencyAlgorithm \\\"frontAndBackCull\\\" \\n -transpInShadows 0\\n -cullingOverride \\\"none\\\" \\n -lowQualityLighting 0\\n -maximumNumHardwareLights 1\\n -occlusionCulling 0\\n -shadingModel 0\\n -useBaseRenderer 0\\n -useReducedRenderer 0\\n -smallObjectCulling 0\\n -smallObjectThreshold -1 \\n -interactiveDisableShadows 0\\n -interactiveBackFaceCull 0\\n -sortTransparent 1\\n -nurbsCurves 1\\n -nurbsSurfaces 1\\n -polymeshes 1\\n -subdivSurfaces 1\\n -planes 1\\n -lights 1\\n -cameras 1\\n -controlVertices 1\\n -hulls 1\\n -grid 1\\n -imagePlane 1\\n -joints 1\\n -ikHandles 1\\n -deformers 1\\n -dynamics 1\\n -fluids 1\\n -hairSystems 1\\n -follicles 1\\n -nCloths 1\\n -nParticles 1\\n -nRigids 1\\n -dynamicConstraints 1\\n -locators 1\\n -manipulators 1\\n -pluginShapes 1\\n -dimensions 1\\n -handles 1\\n -pivots 1\\n -textures 1\\n -strokes 1\\n -motionTrails 1\\n -clipGhosts 1\\n -greasePencils 1\\n -shadows 0\\n $editorName;\\nmodelEditor -e -viewSelected 0 $editorName;\\nmodelEditor -e \\n -pluginObjects \\\"gpuCacheDisplayFilter\\\" 1 \\n $editorName\"\n" + + "\t\t\t\t$configName;\n\n setNamedPanelLayout (localizedPanelLabel(\"Current Layout\"));\n }\n\n panelHistory -e -clear mainPanelHistory;\n setFocus `paneLayout -q -p1 $gMainPane`;\n sceneUIReplacement -deleteRemaining;\n sceneUIReplacement -clear;\n\t}\n\n\ngrid -spacing 5 -size 12 -divisions 5 -displayAxes yes -displayGridLines yes -displayDivisionLines yes -displayPerspectiveLabels no -displayOrthographicLabels no -displayAxesBold yes -perspectiveLabelPosition axis -orthographicLabelPosition edge;\nviewManip -drawCompass 0 -compassAngle 0 -frontParameters \"\" -homeParameters \"\" -selectionLockParameters \"\";\n}\n"); + setAttr ".st" 3; +createNode script -n "sceneConfigurationScriptNode"; + setAttr ".b" -type "string" "playbackOptions -min 1 -max 24 -ast 1 -aet 48 "; + setAttr ".st" 6; +createNode animCurveTU -n "L_cube_visibility"; + setAttr ".tan" 9; + setAttr ".wgt" no; + setAttr ".ktv[0]" 3 1; + setAttr ".kot[0]" 5; +createNode animCurveTL -n "L_cube_translateX"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr ".ktv[0]" 3 5; +createNode animCurveTL -n "L_cube_translateY"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr ".ktv[0]" 3 2.3775028017191246; +createNode animCurveTL -n "L_cube_translateZ"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr ".ktv[0]" 3 0; +createNode animCurveTA -n "L_cube_rotateX"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr ".ktv[0]" 3 0; +createNode animCurveTA -n "L_cube_rotateY"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr ".ktv[0]" 3 0; +createNode animCurveTA -n "L_cube_rotateZ"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr ".ktv[0]" 3 0; +createNode animCurveTU -n "L_cube_scaleX"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr ".ktv[0]" 3 1; +createNode animCurveTU -n "L_cube_scaleY"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr ".ktv[0]" 3 1; +createNode animCurveTU -n "L_cube_scaleZ"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr ".ktv[0]" 3 1; +select -ne :time1; + setAttr -av -k on ".cch"; + setAttr -k on ".ihi"; + setAttr -k on ".nds"; + setAttr -cb on ".bnm"; + setAttr -k on ".o" 12; + setAttr ".unw" 12; +select -ne :renderPartition; + setAttr -k on ".cch"; + setAttr -k on ".ihi"; + setAttr -k on ".nds"; + setAttr -cb on ".bnm"; + setAttr -s 2 ".st"; + setAttr -k on ".an"; + setAttr -k on ".pt"; +select -ne :initialShadingGroup; + setAttr -k on ".cch"; + setAttr -k on ".ihi"; + setAttr -av -k on ".nds"; + setAttr -cb on ".bnm"; + setAttr -s 4 ".dsm"; + setAttr -k on ".mwc"; + setAttr -k on ".an"; + setAttr -k on ".il"; + setAttr -k on ".vo"; + setAttr -k on ".eo"; + setAttr -k on ".fo"; + setAttr -k on ".epo"; + setAttr ".ro" yes; + setAttr -cb on ".mimt"; + setAttr -cb on ".miop"; + setAttr -cb on ".mise"; + setAttr -cb on ".mism"; + setAttr -cb on ".mice"; + setAttr -av -cb on ".micc"; + setAttr -cb on ".mica"; + setAttr -cb on ".micw"; + setAttr -cb on ".mirw"; +select -ne :initialParticleSE; + setAttr -k on ".cch"; + setAttr -k on ".ihi"; + setAttr -av -k on ".nds"; + setAttr -cb on ".bnm"; + setAttr -k on ".mwc"; + setAttr -k on ".an"; + setAttr -k on ".il"; + setAttr -k on ".vo"; + setAttr -k on ".eo"; + setAttr -k on ".fo"; + setAttr -k on ".epo"; + setAttr ".ro" yes; + setAttr -cb on ".mimt"; + setAttr -cb on ".miop"; + setAttr -cb on ".mise"; + setAttr -cb on ".mism"; + setAttr -cb on ".mice"; + setAttr -av -cb on ".micc"; + setAttr -cb on ".mica"; + setAttr -av -cb on ".micw"; + setAttr -cb on ".mirw"; +select -ne :defaultShaderList1; + setAttr -k on ".cch"; + setAttr -k on ".ihi"; + setAttr -k on ".nds"; + setAttr -cb on ".bnm"; + setAttr -s 2 ".s"; +select -ne :postProcessList1; + setAttr -k on ".cch"; + setAttr -k on ".ihi"; + setAttr -k on ".nds"; + setAttr -cb on ".bnm"; + setAttr -s 2 ".p"; +select -ne :defaultRenderingList1; +select -ne :renderGlobalsList1; + setAttr -k on ".cch"; + setAttr -k on ".ihi"; + setAttr -k on ".nds"; + setAttr -cb on ".bnm"; +select -ne :defaultResolution; + setAttr ".pa" 1; +select -ne :defaultLightSet; + setAttr -k on ".cch"; + setAttr -k on ".ihi"; + setAttr -k on ".nds"; + setAttr -k on ".bnm"; + setAttr -k on ".mwc"; + setAttr -k on ".an"; + setAttr -k on ".il"; + setAttr -k on ".vo"; + setAttr -k on ".eo"; + setAttr -k on ".fo"; + setAttr -k on ".epo"; + setAttr -k on ".ro" yes; +select -ne :defaultObjectSet; + setAttr ".ro" yes; +select -ne :hardwareRenderGlobals; + setAttr -k on ".cch"; + setAttr -cb on ".ihi"; + setAttr -k on ".nds"; + setAttr -cb on ".bnm"; + setAttr ".ctrs" 256; + setAttr ".btrs" 512; + setAttr -k off ".fbfm"; + setAttr -k off -cb on ".ehql"; + setAttr -k off -cb on ".eams"; + setAttr -k off -cb on ".eeaa"; + setAttr -k off -cb on ".engm"; + setAttr -k off -cb on ".mes"; + setAttr -k off -cb on ".emb"; + setAttr -av -k off -cb on ".mbbf"; + setAttr -k off -cb on ".mbs"; + setAttr -k off -cb on ".trm"; + setAttr -k off -cb on ".tshc"; + setAttr -k off ".enpt"; + setAttr -k off -cb on ".clmt"; + setAttr -k off -cb on ".tcov"; + setAttr -k off -cb on ".lith"; + setAttr -k off -cb on ".sobc"; + setAttr -k off -cb on ".cuth"; + setAttr -k off -cb on ".hgcd"; + setAttr -k off -cb on ".hgci"; + setAttr -k off -cb on ".mgcs"; + setAttr -k off -cb on ".twa"; + setAttr -k off -cb on ".twz"; + setAttr -k on ".hwcc"; + setAttr -k on ".hwdp"; + setAttr -k on ".hwql"; + setAttr -k on ".hwfr"; +select -ne :hardwareRenderingGlobals; + setAttr ".otfna" -type "stringArray" 18 "NURBS Curves" "NURBS Surfaces" "Polygons" "Subdiv Surfaces" "Particles" "Fluids" "Image Planes" "UI:" "Lights" "Cameras" "Locators" "Joints" "IK Handles" "Deformers" "Motion Trails" "Components" "Misc. UI" "Ornaments" ; + setAttr ".otfva" -type "Int32Array" 18 0 1 1 1 1 1 + 1 0 0 0 0 0 0 0 0 0 0 0 ; +select -ne :defaultHardwareRenderGlobals; + setAttr -k on ".cch"; + setAttr -cb on ".ihi"; + setAttr -k on ".nds"; + setAttr -cb on ".bnm"; + setAttr -k on ".rp"; + setAttr -k on ".cai"; + setAttr -k on ".coi"; + setAttr -cb on ".bc"; + setAttr -av -k on ".bcb"; + setAttr -av -k on ".bcg"; + setAttr -av -k on ".bcr"; + setAttr -k on ".ei"; + setAttr -k on ".ex"; + setAttr -av -k on ".es"; + setAttr -av -k on ".ef"; + setAttr -av -k on ".bf"; + setAttr -k on ".fii"; + setAttr -av -k on ".sf"; + setAttr -k on ".gr"; + setAttr -k on ".li"; + setAttr -k on ".ls"; + setAttr -k on ".mb"; + setAttr -k on ".ti"; + setAttr -k on ".txt"; + setAttr -k on ".mpr"; + setAttr -k on ".wzd"; + setAttr ".fn" -type "string" "im"; + setAttr -k on ".if"; + setAttr ".res" -type "string" "ntsc_4d 646 485 1.333"; + setAttr -k on ".as"; + setAttr -k on ".ds"; + setAttr -k on ".lm"; + setAttr -k on ".fir"; + setAttr -k on ".aap"; + setAttr -k on ".gh"; + setAttr -cb on ".sd"; +connectAttr "polyCube1.out" "cubeRShape.i"; +connectAttr "L_cube_visibility.o" "L_cube.v"; +connectAttr "L_cube_translateX.o" "L_cube.tx"; +connectAttr "L_cube_translateY.o" "L_cube.ty"; +connectAttr "L_cube_translateZ.o" "L_cube.tz"; +connectAttr "L_cube_rotateX.o" "L_cube.rx"; +connectAttr "L_cube_rotateY.o" "L_cube.ry"; +connectAttr "L_cube_rotateZ.o" "L_cube.rz"; +connectAttr "L_cube_scaleX.o" "L_cube.sx"; +connectAttr "L_cube_scaleY.o" "L_cube.sy"; +connectAttr "L_cube_scaleZ.o" "L_cube.sz"; +connectAttr ":mentalrayGlobals.msg" ":mentalrayItemsList.glb"; +connectAttr ":miDefaultOptions.msg" ":mentalrayItemsList.opt" -na; +connectAttr ":miDefaultFramebuffer.msg" ":mentalrayItemsList.fb" -na; +connectAttr ":miDefaultOptions.msg" ":mentalrayGlobals.opt"; +connectAttr ":miDefaultFramebuffer.msg" ":mentalrayGlobals.fb"; +relationship "link" ":lightLinker1" ":initialShadingGroup.message" ":defaultLightSet.message"; +relationship "link" ":lightLinker1" ":initialParticleSE.message" ":defaultLightSet.message"; +relationship "shadowLink" ":lightLinker1" ":initialShadingGroup.message" ":defaultLightSet.message"; +relationship "shadowLink" ":lightLinker1" ":initialParticleSE.message" ":defaultLightSet.message"; +connectAttr "layerManager.dli[0]" "defaultLayer.id"; +connectAttr "renderLayerManager.rlmi[0]" "defaultRenderLayer.rlid"; +connectAttr "cubeRShape.iog" ":initialShadingGroup.dsm" -na; +connectAttr "cubeLShape.iog" ":initialShadingGroup.dsm" -na; +connectAttr "R_cubeShape.iog" ":initialShadingGroup.dsm" -na; +connectAttr "L_cubeShape.iog" ":initialShadingGroup.dsm" -na; +connectAttr "defaultRenderLayer.msg" ":defaultRenderingList1.r" -na; +// End of test_mirror_tables.ma diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_non_unique_names.ma b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_non_unique_names.ma new file mode 100644 index 0000000..00b814a --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_non_unique_names.ma @@ -0,0 +1,797 @@ +//Maya ASCII 2017 scene +//Name: test_non_unique_names.ma +//Last modified: Sat, Feb 04, 2017 11:58:36 PM +//Codeset: 1252 +file -rdi 1 -ns "srcSphere" -rfn "srcSphereRN" -typ "mayaAscii" "C:/Users/hovel/Dropbox/packages/python/Lib/site-packages/studioLibrary/site-packages/mutils/tests/data/sphere.ma"; +file -r -ns "srcSphere" -dr 1 -rfn "srcSphereRN" -typ "mayaAscii" "C:/Users/hovel/Dropbox/packages/python/Lib/site-packages/studioLibrary/site-packages/mutils/tests/data/sphere.ma"; +requires maya "2017"; +requires "stereoCamera" "10.0"; +currentUnit -l centimeter -a degree -t film; +fileInfo "application" "maya"; +fileInfo "product" "Maya 2017"; +fileInfo "version" "2017"; +fileInfo "cutIdentifier" "201606150345-997974"; +fileInfo "osv" "Microsoft Windows 8 Business Edition, 64-bit (Build 9200)\n"; +createNode transform -s -n "persp"; + rename -uid "DDAA8254-4753-78D5-6AAE-159C81EDC3F9"; + setAttr ".v" no; + setAttr ".t" -type "double3" -123.17900131274617 74.628663135067598 32.661032572240735 ; + setAttr ".r" -type "double3" -30.338352727390017 -72.599999999996271 0 ; +createNode camera -s -n "perspShape" -p "persp"; + rename -uid "27F094E9-49EE-F1D7-052F-24B6AD29870D"; + setAttr -k off ".v" no; + setAttr ".fl" 34.999999999999993; + setAttr ".coi" 150.42418693917088; + setAttr ".imn" -type "string" "persp"; + setAttr ".den" -type "string" "persp_depth"; + setAttr ".man" -type "string" "persp_mask"; + setAttr ".hc" -type "string" "viewSet -p %camera"; +createNode transform -s -n "top"; + rename -uid "E6DDBE5E-414D-598C-1652-DDA9896B2C18"; + setAttr ".v" no; + setAttr ".t" -type "double3" 0 100.1 0 ; + setAttr ".r" -type "double3" -89.999999999999986 0 0 ; +createNode camera -s -n "topShape" -p "top"; + rename -uid "BA963D24-4FDB-8DA9-9320-68A3D19A3033"; + setAttr -k off ".v" no; + setAttr ".rnd" no; + setAttr ".coi" 100.1; + setAttr ".ow" 30; + setAttr ".imn" -type "string" "top"; + setAttr ".den" -type "string" "top_depth"; + setAttr ".man" -type "string" "top_mask"; + setAttr ".hc" -type "string" "viewSet -t %camera"; + setAttr ".o" yes; +createNode transform -s -n "front"; + rename -uid "56938C00-4FC9-9BB5-7BA8-22B2465F51AC"; + setAttr ".v" no; + setAttr ".t" -type "double3" 2.0350096678112575 0.39361762628711539 100.1 ; +createNode camera -s -n "frontShape" -p "front"; + rename -uid "25B2B187-477B-D3AA-AC82-5C9C5B6BD4DA"; + setAttr -k off ".v" no; + setAttr ".rnd" no; + setAttr ".coi" 100.1; + setAttr ".ow" 61.766282942468983; + setAttr ".imn" -type "string" "front"; + setAttr ".den" -type "string" "front_depth"; + setAttr ".man" -type "string" "front_mask"; + setAttr ".hc" -type "string" "viewSet -f %camera"; + setAttr ".o" yes; +createNode transform -s -n "side"; + rename -uid "D0276B16-4FEE-5998-5D3D-E7AA9047C23C"; + setAttr ".v" no; + setAttr ".t" -type "double3" 100.1 0 0 ; + setAttr ".r" -type "double3" 0 89.999999999999986 0 ; +createNode camera -s -n "sideShape" -p "side"; + rename -uid "52D7FE6B-4C52-8DC6-B4BD-73870EB09DB0"; + setAttr -k off ".v" no; + setAttr ".rnd" no; + setAttr ".coi" 100.1; + setAttr ".ow" 30; + setAttr ".imn" -type "string" "side"; + setAttr ".den" -type "string" "side_depth"; + setAttr ".man" -type "string" "side_mask"; + setAttr ".hc" -type "string" "viewSet -s %camera"; + setAttr ".o" yes; +createNode transform -n "group"; + rename -uid "E0D02B96-4B6D-0116-B834-3A8B17F2574B"; + addAttr -s false -ci true -sn "testMessage" -ln "testMessage" -at "message"; +createNode transform -n "offset" -p "group"; + rename -uid "53E00748-4BAE-DC3E-72DA-C39AC1FABCA1"; + setAttr -l on ".v"; + setAttr -l on ".tx"; + setAttr -l on ".ty"; + setAttr -l on ".tz"; + setAttr -l on ".rx"; + setAttr -l on ".ry"; + setAttr -l on ".rz"; + setAttr -l on ".sx"; + setAttr -l on ".sy"; + setAttr -l on ".sz"; +createNode transform -n "lockedNode" -p "|group|offset"; + rename -uid "C77C5FBF-4DA8-7E08-F3BE-AC9D0D00D0FC"; +createNode transform -n "sphere" -p "|group|offset|lockedNode"; + rename -uid "8066C85B-4E94-344B-173A-698197FBAF5E"; + addAttr -ci true -sn "testVector" -ln "testVector" -at "double3" -nc 3; + addAttr -ci true -sn "testVectorX" -ln "testVectorX" -at "double" -p "testVector"; + addAttr -ci true -sn "testVectorY" -ln "testVectorY" -at "double" -p "testVector"; + addAttr -ci true -sn "testVectorZ" -ln "testVectorZ" -at "double" -p "testVector"; + addAttr -ci true -uac -sn "testColor" -ln "testColor" -at "float3" -nc 3; + addAttr -ci true -sn "testRed" -ln "testRed" -at "float" -p "testColor"; + addAttr -ci true -sn "testGreen" -ln "testGreen" -at "float" -p "testColor"; + addAttr -ci true -sn "testRed" -ln "testRed" -at "float" -p "testColor"; + addAttr -ci true -sn "testString" -ln "testString" -dt "string"; + addAttr -ci true -sn "testEnum" -ln "testEnum" -min 0 -max 2 -en "Apple:Lemon:Banana" + -at "enum"; + addAttr -ci true -sn "testFloat" -ln "testFloat" -min 0 -max 10 -at "double"; + addAttr -ci true -sn "testBoolean" -ln "testBoolean" -min 0 -max 1 -at "bool"; + addAttr -ci true -sn "testInteger" -ln "testInteger" -min 0 -max 10 -at "long"; + addAttr -ci true -sn "testLocked" -ln "testLocked" -min 0 -max 10 -at "double"; + addAttr -ci true -sn "testHidden" -ln "testHidden" -min 0 -max 10 -at "double"; + addAttr -ci true -sn "testConnect" -ln "testConnect" -at "double"; + addAttr -ci true -sn "testAnimated" -ln "testAnimated" -at "double"; + addAttr -s false -ci true -sn "testMessage" -ln "testMessage" -at "message"; + addAttr -ci true -sn "testLimit" -ln "testLimit" -min -10 -max 10 -at "double"; + addAttr -ci true -sn "testNonKeyable" -ln "testNonKeyable" -at "double"; + setAttr -k on ".testVector"; + setAttr -k on ".testVectorX"; + setAttr -k on ".testVectorY"; + setAttr -k on ".testVectorZ"; + setAttr -k on ".testString"; + setAttr -k on ".testEnum" 2; + setAttr -k on ".testFloat"; + setAttr -k on ".testBoolean"; + setAttr -k on ".testInteger"; + setAttr -l on -k on ".testLocked"; + setAttr -k on ".testConnect"; + setAttr -k on ".testAnimated"; + setAttr -k on ".testLimit"; + setAttr -cb on ".testNonKeyable"; +createNode mesh -n "sphereShape" -p "|group|offset|lockedNode|sphere"; + rename -uid "31DEDCCA-419C-842A-2745-C2BADE15FAD3"; + setAttr -k off ".v"; + setAttr ".vir" yes; + setAttr ".vif" yes; + setAttr ".uvst[0].uvsn" -type "string" "map1"; + setAttr ".cuvs" -type "string" "map1"; + setAttr ".dcc" -type "string" "Ambient+Diffuse"; + setAttr ".covm[0]" 0 1 1; + setAttr ".cdvm[0]" 0 1 1; + setAttr ".ugsdt" no; + setAttr ".vnm" 0; +createNode transform -n "group1"; + rename -uid "3BD55A1F-4D3B-0600-E76E-A3B8DDB90A9E"; + addAttr -s false -ci true -sn "testMessage" -ln "testMessage" -at "message"; +createNode transform -n "offset" -p "group1"; + rename -uid "DB0A4EF6-440F-3E67-85E1-F6A0FC8B3359"; + setAttr -l on ".v"; + setAttr -l on ".tx"; + setAttr -l on ".ty"; + setAttr -l on ".tz"; + setAttr -l on ".rx"; + setAttr -l on ".ry"; + setAttr -l on ".rz"; + setAttr -l on ".sx"; + setAttr -l on ".sy"; + setAttr -l on ".sz"; +createNode transform -n "lockedNode" -p "|group1|offset"; + rename -uid "425F552C-4C6B-094E-065C-43BF75DE749F"; +createNode transform -n "sphere" -p "|group1|offset|lockedNode"; + rename -uid "D9F1C1EE-4A3B-CC6C-E2F6-D0AD5B44CB13"; + addAttr -ci true -sn "testVector" -ln "testVector" -at "double3" -nc 3; + addAttr -ci true -sn "testVectorX" -ln "testVectorX" -at "double" -p "testVector"; + addAttr -ci true -sn "testVectorY" -ln "testVectorY" -at "double" -p "testVector"; + addAttr -ci true -sn "testVectorZ" -ln "testVectorZ" -at "double" -p "testVector"; + addAttr -ci true -uac -sn "testColor" -ln "testColor" -at "float3" -nc 3; + addAttr -ci true -sn "testRed" -ln "testRed" -at "float" -p "testColor"; + addAttr -ci true -sn "testGreen" -ln "testGreen" -at "float" -p "testColor"; + addAttr -ci true -sn "testRed" -ln "testRed" -at "float" -p "testColor"; + addAttr -ci true -sn "testString" -ln "testString" -dt "string"; + addAttr -ci true -sn "testEnum" -ln "testEnum" -min 0 -max 2 -en "Apple:Lemon:Banana" + -at "enum"; + addAttr -ci true -sn "testFloat" -ln "testFloat" -min 0 -max 10 -at "double"; + addAttr -ci true -sn "testBoolean" -ln "testBoolean" -min 0 -max 1 -at "bool"; + addAttr -ci true -sn "testInteger" -ln "testInteger" -min 0 -max 10 -at "long"; + addAttr -ci true -sn "testLocked" -ln "testLocked" -min 0 -max 10 -at "double"; + addAttr -ci true -sn "testHidden" -ln "testHidden" -min 0 -max 10 -at "double"; + addAttr -ci true -sn "testConnect" -ln "testConnect" -at "double"; + addAttr -ci true -sn "testAnimated" -ln "testAnimated" -at "double"; + addAttr -s false -ci true -sn "testMessage" -ln "testMessage" -at "message"; + setAttr -k on ".testVector"; + setAttr -k on ".testVectorX"; + setAttr -k on ".testVectorY"; + setAttr -k on ".testVectorZ"; + setAttr -k on ".testString"; + setAttr -k on ".testEnum" 2; + setAttr -k on ".testFloat"; + setAttr -k on ".testBoolean"; + setAttr -k on ".testInteger"; + setAttr -l on -k on ".testLocked"; + setAttr -k on ".testConnect"; + setAttr -k on ".testAnimated"; +createNode mesh -n "sphereShape" -p "|group1|offset|lockedNode|sphere"; + rename -uid "4D2BA5B2-42B9-056B-13C8-D285A9FBD044"; + setAttr -k off ".v"; + setAttr ".vir" yes; + setAttr ".vif" yes; + setAttr ".uvst[0].uvsn" -type "string" "map1"; + setAttr ".cuvs" -type "string" "map1"; + setAttr ".dcc" -type "string" "Ambient+Diffuse"; + setAttr ".covm[0]" 0 1 1; + setAttr ".cdvm[0]" 0 1 1; + setAttr ".ugsdt" no; + setAttr ".vnm" 0; +createNode lightLinker -s -n "lightLinker1"; + rename -uid "548C9C33-497A-C6D1-8D06-98B89D3D62D8"; + setAttr -s 2 ".lnk"; + setAttr -s 2 ".slnk"; +createNode displayLayerManager -n "layerManager"; + rename -uid "82379A41-4D50-EE15-B9ED-688E288FD51B"; +createNode displayLayer -n "defaultLayer"; + rename -uid "3283B76B-49A2-D9EB-14C2-4C827D163B8F"; +createNode renderLayerManager -n "renderLayerManager"; + rename -uid "72986805-4CFF-9FD5-4A52-5F9D8DBB9B59"; +createNode renderLayer -n "defaultRenderLayer"; + rename -uid "F62FFC33-4D56-2BEB-B85F-A6A272377F4C"; + setAttr ".g" yes; +createNode script -n "sceneConfigurationScriptNode"; + rename -uid "7FD6986F-4794-3763-3E36-59852AA535BF"; + setAttr ".b" -type "string" "playbackOptions -min 1 -max 24 -ast 1 -aet 48 "; + setAttr ".st" 6; +createNode reference -n "srcSphereRN"; + rename -uid "236A7996-4E4A-8901-858E-DDBE7FC55F9A"; + setAttr -s 16 ".phl"; + setAttr ".phl[1]" 0; + setAttr ".phl[2]" 0; + setAttr ".phl[3]" 0; + setAttr ".phl[4]" 0; + setAttr ".phl[5]" 0; + setAttr ".phl[6]" 0; + setAttr ".phl[7]" 0; + setAttr ".phl[8]" 0; + setAttr ".phl[9]" 0; + setAttr ".phl[10]" 0; + setAttr ".phl[11]" 0; + setAttr ".phl[12]" 0; + setAttr ".phl[13]" 0; + setAttr ".phl[14]" 0; + setAttr ".phl[15]" 0; + setAttr ".phl[16]" 0; + setAttr ".ed" -type "dataReferenceEdits" + "srcSphereRN" + "srcSphereRN" 0 + "srcSphereRN" 43 + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode" "visibility" " 1" + + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode" "translate" " -type \"double3\" 0 5 0" + + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode" "translateX" " -av" + + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode" "translateY" " -av" + + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode" "translateZ" " -av" + + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode" "rotate" " -type \"double3\" 0 0 0" + + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode" "rotateX" " -av" + + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode" "rotateY" " -av" + + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode" "rotateZ" " -av" + + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode" "scale" " -type \"double3\" 1 1 1" + + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere" + "translate" " -type \"double3\" 0 8 -12" + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere" + "translateZ" " -av" + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere" + "rotate" " -type \"double3\" 45 50 90" + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere" + "rotateX" " -av" + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere" + "rotateY" " -av" + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere" + "rotateZ" " -av" + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere" + "scale" " -type \"double3\" 0.25 4.66 0.5" + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere" + "scaleX" " -av" + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere" + "scaleY" " -av" + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere" + "scaleZ" " -av" + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere" + "testVector" " -k 1 -type \"double3\" 0.2 1.4 2.6" + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere" + "testVector" " -k 1" + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere" + "testVectorX" " -k 1" + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere" + "testVectorY" " -av -k 1" + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere" + "testVectorZ" " -k 1" + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere" + "testColor" " -type \"float3\" 0.18000000999999999 0.60000001999999997 0.18000000999999999" + + 2 "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere" + "testString" " -k 1 -type \"string\" \"Hello world\"" + 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode.translateZ" + "srcSphereRN.placeHolderList[1]" "" + 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.testVectorX" + "srcSphereRN.placeHolderList[2]" "" + 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.testVectorY" + "srcSphereRN.placeHolderList[3]" "" + 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.testVectorZ" + "srcSphereRN.placeHolderList[4]" "" + 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.testEnum" + "srcSphereRN.placeHolderList[5]" "" + 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.testFloat" + "srcSphereRN.placeHolderList[6]" "" + 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.testBoolean" + "srcSphereRN.placeHolderList[7]" "" + 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.testInteger" + "srcSphereRN.placeHolderList[8]" "" + 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.translateY" + "srcSphereRN.placeHolderList[9]" "" + 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.translateX" + "srcSphereRN.placeHolderList[10]" "" + 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.translateZ" + "srcSphereRN.placeHolderList[11]" "" + 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.rotateX" + "srcSphereRN.placeHolderList[12]" "" + 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.rotateZ" + "srcSphereRN.placeHolderList[13]" "" + 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.scaleX" + "srcSphereRN.placeHolderList[14]" "" + 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.scaleZ" + "srcSphereRN.placeHolderList[15]" "" + 5 4 "srcSphereRN" "|srcSphere:group|srcSphere:offset|srcSphere:lockedNode|srcSphere:sphere.visibility" + "srcSphereRN.placeHolderList[16]" ""; + setAttr ".ptag" -type "string" ""; +lockNode -l 1 ; +createNode animCurveTU -n "srcSphere:sphere_visibility"; + rename -uid "25B7A44D-46CB-EE48-EBD0-1E9ADC4681DE"; + setAttr ".tan" 9; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 10 1; + setAttr -s 2 ".kot[0:1]" 5 5; +createNode animCurveTL -n "srcSphere:sphere_translateX"; + rename -uid "D13498C8-4E35-AB33-9DA8-D0B1AB09A06C"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0 10 0; +createNode animCurveTL -n "srcSphere:sphere_translateY"; + rename -uid "30A68F0C-473D-C3BD-68EE-1A97C506CB8A"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 8 10 8; +createNode animCurveTL -n "srcSphere:sphere_translateZ"; + rename -uid "591EE7E4-471A-2A88-0F1D-48A0CA2F575E"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 -12 10 11.214436147065292; +createNode animCurveTA -n "srcSphere:sphere_rotateX"; + rename -uid "7DAF1ACE-4BF1-C12E-BD6B-A5A56B35773F"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 45 10 30.81018202226841; +createNode animCurveTA -n "srcSphere:sphere_rotateZ"; + rename -uid "86BF49D8-4C94-99EC-28F6-2EA727F428F4"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 90 10 149.70880463068096; +createNode animCurveTU -n "srcSphere:sphere_scaleX"; + rename -uid "9C679B5C-4862-3674-978A-D484AEE966E3"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0.25 10 0.42958527814637792; +createNode animCurveTU -n "srcSphere:sphere_scaleZ"; + rename -uid "F8AEC957-4DD2-855F-9D56-69B153BA1F5C"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0.5 10 0.85917055629275585; +createNode animCurveTU -n "srcSphere:sphere_testVectorX"; + rename -uid "D3E850E5-45D3-3797-2452-828BC0F88BF5"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0.2 10 0.2; +createNode animCurveTU -n "srcSphere:sphere_testVectorY"; + rename -uid "411854EA-4881-2F52-8A0C-DCB3502416B8"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1.4 10 1.4; +createNode animCurveTU -n "srcSphere:sphere_testVectorZ"; + rename -uid "502BF718-4050-BBE2-991E-77BE7C123CAA"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 2.6 10 2.6; +createNode animCurveTU -n "srcSphere:sphere_testEnum"; + rename -uid "8CF62262-46FF-9062-6DED-C4AA2B2CCE2E"; + setAttr ".tan" 9; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 10 1; + setAttr -s 2 ".kot[0:1]" 5 5; +createNode animCurveTU -n "srcSphere:sphere_testFloat"; + rename -uid "498C6886-4FDB-563B-723A-A8A9474E9570"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0.666 10 0.666; +createNode animCurveTU -n "srcSphere:sphere_testBoolean"; + rename -uid "143ED449-4120-35D8-6BC9-A98C802C5CA3"; + setAttr ".tan" 9; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 10 1; + setAttr -s 2 ".kot[0:1]" 5 5; +createNode animCurveTU -n "srcSphere:sphere_testInteger"; + rename -uid "E96551ED-459B-4C0A-CDDA-44A263050285"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 5 10 5; +createNode animCurveTL -n "dstSphere:sphere_translateY"; + rename -uid "20E5403E-4B3D-0674-161A-91A6924D0559"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 8 10 8; +createNode animCurveTL -n "lockedNode_translateZ"; + rename -uid "B63F154D-4C27-9666-D375-138ED9037730"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0 10 15; +createNode animCurveTU -n "sphere_testInteger"; + rename -uid "97499943-4659-497E-3F90-61B92034A6C4"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 5 10 5; +createNode animCurveTU -n "sphere_testEnum"; + rename -uid "B071F69A-4FC0-DA63-9FFE-4A94AA5979B4"; + setAttr ".tan" 9; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 10 1; + setAttr -s 2 ".kot[0:1]" 5 5; +createNode animCurveTL -n "sphere_translateX"; + rename -uid "0768FFC8-4267-269E-B230-439D662AADFE"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0 10 0; +createNode animCurveTL -n "sphere_translateZ"; + rename -uid "4C1A73F4-461D-F4BA-D731-D4B281F14C48"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 -12 10 11.214436147065292; +createNode animCurveTU -n "sphere_testFloat"; + rename -uid "4CE18D96-4C85-2A00-A762-A7A94AE1606A"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0.666 10 0.666; +createNode animCurveTU -n "sphere_scaleX"; + rename -uid "866CDCF6-4F4D-103D-63EC-729E61A6D480"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0.25 10 0.42958527814637792; +createNode animCurveTU -n "sphere_testVectorZ"; + rename -uid "AEBEFB59-4872-F7FD-CADC-EAA305119536"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 2.6 10 2.6; +createNode animCurveTU -n "sphere_scaleZ"; + rename -uid "EFB25E16-44ED-32F9-943A-ED8A845F4D39"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0.5 10 0.85917055629275585; +createNode animCurveTA -n "sphere_rotateX"; + rename -uid "19C44183-45EF-1073-AE60-D0AC778E182D"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 45 10 30.81018202226841; +createNode animCurveTU -n "sphere_testVectorY"; + rename -uid "B55F1B53-48D5-A874-A1E0-C0B71E545F06"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1.4 10 1.4; +createNode animCurveTA -n "sphere_rotateZ"; + rename -uid "07252CD5-4363-F661-068A-66B3EF78D16A"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 90 10 149.70880463068096; +createNode animCurveTU -n "sphere_visibility"; + rename -uid "F78C1BCC-435D-D057-01ED-D1B15A6BE60B"; + setAttr ".tan" 9; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 10 1; + setAttr -s 2 ".kot[0:1]" 5 5; +createNode animCurveTU -n "sphere_testVectorX"; + rename -uid "9FAF8611-4755-AE77-1A60-4FA5FF5469C7"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0.2 10 0.2; +createNode animCurveTU -n "sphere_testBoolean"; + rename -uid "55CCB691-471C-1916-5F57-D78DFC7CE524"; + setAttr ".tan" 9; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 10 1; + setAttr -s 2 ".kot[0:1]" 5 5; +createNode animCurveTL -n "lockedNode_translateZ1"; + rename -uid "12CDCBC7-41D0-13DA-F2E6-04B9FC31CE19"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0 10 15; +createNode renderLayerManager -n "dstSphere:renderLayerManager"; + rename -uid "88F08ACE-4F04-45CD-ED01-1DAC296CF287"; +createNode renderLayer -n "dstSphere:defaultRenderLayer"; + rename -uid "97E29F6D-495A-42D8-7A95-BDADCBE099F0"; + setAttr ".g" yes; +createNode animCurveTU -n "sphere_testAnimated"; + rename -uid "A38AFFD7-4BB6-7949-58F0-1DA330C26C51"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0 10 10; +createNode polySphere -n "srcPolySphere"; + rename -uid "9DC42CA0-4D9A-CAA0-B1D3-56A34DA33DDA"; + setAttr ".r" 4.1417806816985845; +createNode animCurveTU -n "sphere_testAnimated1"; + rename -uid "4785293F-43CF-7E0E-6273-0A9CE9B8C052"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 0 10 10; +createNode polySphere -n "srcPolySphere1"; + rename -uid "22D3CF49-4D45-E0C1-99E9-98949F65BC37"; + setAttr ".r" 4.1417806816985845; +createNode shapeEditorManager -n "shapeEditorManager"; + rename -uid "4E61DE05-49DE-4ABA-D703-36AE442A88AD"; +createNode poseInterpolatorManager -n "poseInterpolatorManager"; + rename -uid "A2E4EC6B-4BE3-25B3-9E39-BCB3468204D9"; +createNode script -n "uiConfigurationScriptNode"; + rename -uid "5DFFAA9C-4881-F956-58D0-CE9DBC5970AC"; + setAttr ".b" -type "string" ( + "// Maya Mel UI Configuration File.\n//\n// This script is machine generated. Edit at your own risk.\n//\n//\n\nglobal string $gMainPane;\nif (`paneLayout -exists $gMainPane`) {\n\n\tglobal int $gUseScenePanelConfig;\n\tint $useSceneConfig = $gUseScenePanelConfig;\n\tint $menusOkayInPanels = `optionVar -q allowMenusInPanels`;\tint $nVisPanes = `paneLayout -q -nvp $gMainPane`;\n\tint $nPanes = 0;\n\tstring $editorName;\n\tstring $panelName;\n\tstring $itemFilterName;\n\tstring $panelConfig;\n\n\t//\n\t// get current state of the UI\n\t//\n\tsceneUIReplacement -update $gMainPane;\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"modelPanel\" (localizedPanelLabel(\"Top View\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `modelPanel -unParent -l (localizedPanelLabel(\"Top View\")) -mbv $menusOkayInPanels `;\n\t\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"top\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"smoothShaded\" \n" + + " -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 0\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 16384\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n -maxConstantTransparency 1\n" + + " -rendererName \"vp2Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n" + + " -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n -captureSequenceNumber -1\n -width 1\n -height 1\n -sceneRenderFilter 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n" + + " -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tmodelPanel -edit -l (localizedPanelLabel(\"Top View\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"top\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"smoothShaded\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 0\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n" + + " -textureMaxSize 16384\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n -maxConstantTransparency 1\n -rendererName \"vp2Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n" + + " -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n -captureSequenceNumber -1\n -width 1\n -height 1\n -sceneRenderFilter 0\n $editorName;\n" + + " modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"modelPanel\" (localizedPanelLabel(\"Side View\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `modelPanel -unParent -l (localizedPanelLabel(\"Side View\")) -mbv $menusOkayInPanels `;\n\t\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"side\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"smoothShaded\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 0\n -backfaceCulling 0\n" + + " -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 16384\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n -maxConstantTransparency 1\n -rendererName \"vp2Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n" + + " -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n" + + " -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n -captureSequenceNumber -1\n -width 1\n -height 1\n -sceneRenderFilter 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tmodelPanel -edit -l (localizedPanelLabel(\"Side View\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"side\" \n -useInteractiveMode 0\n -displayLights \"default\" \n" + + " -displayAppearance \"smoothShaded\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 0\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 16384\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n -maxConstantTransparency 1\n -rendererName \"vp2Renderer\" \n -objectFilterShowInHUD 1\n" + + " -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n" + + " -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n -captureSequenceNumber -1\n -width 1\n -height 1\n -sceneRenderFilter 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"modelPanel\" (localizedPanelLabel(\"Front View\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `modelPanel -unParent -l (localizedPanelLabel(\"Front View\")) -mbv $menusOkayInPanels `;\n" + + "\t\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"front\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"smoothShaded\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 0\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 16384\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n" + + " -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n -maxConstantTransparency 1\n -rendererName \"vp2Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n" + + " -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n -captureSequenceNumber -1\n" + + " -width 1\n -height 1\n -sceneRenderFilter 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tmodelPanel -edit -l (localizedPanelLabel(\"Front View\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"front\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"smoothShaded\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 0\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n" + + " -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 16384\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n -maxConstantTransparency 1\n -rendererName \"vp2Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n" + + " -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n" + + " -clipGhosts 1\n -greasePencils 1\n -shadows 0\n -captureSequenceNumber -1\n -width 1\n -height 1\n -sceneRenderFilter 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"modelPanel\" (localizedPanelLabel(\"Persp View\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `modelPanel -unParent -l (localizedPanelLabel(\"Persp View\")) -mbv $menusOkayInPanels `;\n\t\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"persp\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"smoothShaded\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n" + + " -holdOuts 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 0\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 16384\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n -maxConstantTransparency 1\n -rendererName \"vp2Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n" + + " -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n" + + " -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n -captureSequenceNumber -1\n -width 2058\n -height 1022\n -sceneRenderFilter 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\t}\n\t} else {\n" + + "\t\t$label = `panel -q -label $panelName`;\n\t\tmodelPanel -edit -l (localizedPanelLabel(\"Persp View\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"persp\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"smoothShaded\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 0\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 16384\n -fogging 0\n -fogSource \"fragment\" \n" + + " -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n -maxConstantTransparency 1\n -rendererName \"vp2Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n" + + " -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n -captureSequenceNumber -1\n -width 2058\n -height 1022\n -sceneRenderFilter 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n" + + " $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"outlinerPanel\" (localizedPanelLabel(\"ToggledOutliner\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `outlinerPanel -unParent -l (localizedPanelLabel(\"ToggledOutliner\")) -mbv $menusOkayInPanels `;\n\t\t\t$editorName = $panelName;\n outlinerEditor -e \n -showShapes 0\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 0\n -showConnected 0\n -showAnimCurvesOnly 0\n -showMuteInfo 0\n -organizeByLayer 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 0\n -showDagOnly 1\n -showAssets 1\n -showContainedOnly 1\n -showPublishedAsConnected 0\n" + + " -showContainerContents 1\n -ignoreDagHierarchy 0\n -expandConnections 0\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 1\n -showLeafs 1\n -showNumericAttrsOnly 0\n -highlightActive 1\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"defaultSetFilter\" \n -showSetMembers 1\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -isSet 0\n -isSetMember 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n" + + " -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 0\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n -renderFilterIndex 0\n -selectionOrder \"chronological\" \n -expandAttribute 0\n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\toutlinerPanel -edit -l (localizedPanelLabel(\"ToggledOutliner\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n outlinerEditor -e \n -showShapes 0\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 0\n -showConnected 0\n -showAnimCurvesOnly 0\n" + + " -showMuteInfo 0\n -organizeByLayer 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 0\n -showDagOnly 1\n -showAssets 1\n -showContainedOnly 1\n -showPublishedAsConnected 0\n -showContainerContents 1\n -ignoreDagHierarchy 0\n -expandConnections 0\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 1\n -showLeafs 1\n -showNumericAttrsOnly 0\n -highlightActive 1\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"defaultSetFilter\" \n -showSetMembers 1\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -isSet 0\n -isSetMember 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n" + + " -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 0\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n -renderFilterIndex 0\n -selectionOrder \"chronological\" \n -expandAttribute 0\n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"outlinerPanel\" (localizedPanelLabel(\"Outliner\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `outlinerPanel -unParent -l (localizedPanelLabel(\"Outliner\")) -mbv $menusOkayInPanels `;\n\t\t\t$editorName = $panelName;\n outlinerEditor -e \n" + + " -showShapes 0\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 0\n -showConnected 0\n -showAnimCurvesOnly 0\n -showMuteInfo 0\n -organizeByLayer 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 0\n -showDagOnly 1\n -showAssets 1\n -showContainedOnly 1\n -showPublishedAsConnected 0\n -showContainerContents 1\n -ignoreDagHierarchy 0\n -expandConnections 0\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 1\n -showLeafs 1\n -showNumericAttrsOnly 0\n -highlightActive 1\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 0\n -dropIsParent 1\n" + + " -transmitFilters 0\n -setFilter \"defaultSetFilter\" \n -showSetMembers 1\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 0\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n" + + "\t\toutlinerPanel -edit -l (localizedPanelLabel(\"Outliner\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n outlinerEditor -e \n -showShapes 0\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 0\n -showConnected 0\n -showAnimCurvesOnly 0\n -showMuteInfo 0\n -organizeByLayer 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 0\n -showDagOnly 1\n -showAssets 1\n -showContainedOnly 1\n -showPublishedAsConnected 0\n -showContainerContents 1\n -ignoreDagHierarchy 0\n -expandConnections 0\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 1\n -showLeafs 1\n -showNumericAttrsOnly 0\n -highlightActive 1\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 0\n" + + " -dropIsParent 1\n -transmitFilters 0\n -setFilter \"defaultSetFilter\" \n -showSetMembers 1\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 0\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"graphEditor\" (localizedPanelLabel(\"Graph Editor\")) `;\n" + + "\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"graphEditor\" -l (localizedPanelLabel(\"Graph Editor\")) -mbv $menusOkayInPanels `;\n\n\t\t\t$editorName = ($panelName+\"OutlineEd\");\n outlinerEditor -e \n -showShapes 1\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 1\n -showConnected 1\n -showAnimCurvesOnly 1\n -showMuteInfo 0\n -organizeByLayer 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 1\n -showDagOnly 0\n -showAssets 1\n -showContainedOnly 0\n -showPublishedAsConnected 0\n -showContainerContents 0\n -ignoreDagHierarchy 0\n -expandConnections 1\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n" + + " -showCompounds 0\n -showLeafs 1\n -showNumericAttrsOnly 1\n -highlightActive 0\n -autoSelectNewObjects 1\n -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 1\n -setFilter \"0\" \n -showSetMembers 0\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 1\n" + + " -mapMotionTrails 1\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n $editorName;\n\n\t\t\t$editorName = ($panelName+\"GraphEd\");\n animCurveEditor -e \n -displayKeys 1\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 1\n -displayInfinities 0\n -displayValues 0\n -autoFit 1\n -snapTime \"integer\" \n -snapValue \"none\" \n -showResults \"off\" \n -showBufferCurves \"off\" \n -smoothness \"fine\" \n -resultSamples 0.96\n -resultScreenSamples 0\n -resultUpdate \"delayed\" \n -showUpstreamCurves 1\n -showCurveNames 0\n -showActiveCurveNames 0\n -stackedCurves 0\n -stackedCurvesMin -1\n -stackedCurvesMax 1\n -stackedCurvesSpace 0.2\n" + + " -displayNormalized 0\n -preSelectionHighlight 0\n -constrainDrag 0\n -classicMode 1\n -valueLinesToggle 1\n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Graph Editor\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = ($panelName+\"OutlineEd\");\n outlinerEditor -e \n -showShapes 1\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 1\n -showConnected 1\n -showAnimCurvesOnly 1\n -showMuteInfo 0\n -organizeByLayer 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 1\n -showDagOnly 0\n -showAssets 1\n -showContainedOnly 0\n -showPublishedAsConnected 0\n" + + " -showContainerContents 0\n -ignoreDagHierarchy 0\n -expandConnections 1\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 0\n -showLeafs 1\n -showNumericAttrsOnly 1\n -highlightActive 0\n -autoSelectNewObjects 1\n -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 1\n -setFilter \"0\" \n -showSetMembers 0\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n" + + " -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 1\n -mapMotionTrails 1\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n $editorName;\n\n\t\t\t$editorName = ($panelName+\"GraphEd\");\n animCurveEditor -e \n -displayKeys 1\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 1\n -displayInfinities 0\n -displayValues 0\n -autoFit 1\n -snapTime \"integer\" \n -snapValue \"none\" \n -showResults \"off\" \n -showBufferCurves \"off\" \n -smoothness \"fine\" \n -resultSamples 0.96\n -resultScreenSamples 0\n -resultUpdate \"delayed\" \n -showUpstreamCurves 1\n -showCurveNames 0\n" + + " -showActiveCurveNames 0\n -stackedCurves 0\n -stackedCurvesMin -1\n -stackedCurvesMax 1\n -stackedCurvesSpace 0.2\n -displayNormalized 0\n -preSelectionHighlight 0\n -constrainDrag 0\n -classicMode 1\n -valueLinesToggle 1\n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"dopeSheetPanel\" (localizedPanelLabel(\"Dope Sheet\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"dopeSheetPanel\" -l (localizedPanelLabel(\"Dope Sheet\")) -mbv $menusOkayInPanels `;\n\n\t\t\t$editorName = ($panelName+\"OutlineEd\");\n outlinerEditor -e \n -showShapes 1\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 1\n" + + " -showConnected 1\n -showAnimCurvesOnly 1\n -showMuteInfo 0\n -organizeByLayer 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 0\n -showDagOnly 0\n -showAssets 1\n -showContainedOnly 0\n -showPublishedAsConnected 0\n -showContainerContents 0\n -ignoreDagHierarchy 0\n -expandConnections 1\n -showUpstreamCurves 1\n -showUnitlessCurves 0\n -showCompounds 1\n -showLeafs 1\n -showNumericAttrsOnly 1\n -highlightActive 0\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 1\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"0\" \n -showSetMembers 0\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n" + + " -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 1\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n $editorName;\n\n\t\t\t$editorName = ($panelName+\"DopeSheetEd\");\n dopeSheetEditor -e \n -displayKeys 1\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 0\n -displayInfinities 0\n" + + " -displayValues 0\n -autoFit 0\n -snapTime \"integer\" \n -snapValue \"none\" \n -outliner \"dopeSheetPanel1OutlineEd\" \n -showSummary 1\n -showScene 0\n -hierarchyBelow 0\n -showTicks 1\n -selectionWindow 0 0 0 0 \n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Dope Sheet\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = ($panelName+\"OutlineEd\");\n outlinerEditor -e \n -showShapes 1\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 1\n -showConnected 1\n -showAnimCurvesOnly 1\n -showMuteInfo 0\n -organizeByLayer 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n" + + " -autoExpand 0\n -showDagOnly 0\n -showAssets 1\n -showContainedOnly 0\n -showPublishedAsConnected 0\n -showContainerContents 0\n -ignoreDagHierarchy 0\n -expandConnections 1\n -showUpstreamCurves 1\n -showUnitlessCurves 0\n -showCompounds 1\n -showLeafs 1\n -showNumericAttrsOnly 1\n -highlightActive 0\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 1\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"0\" \n -showSetMembers 0\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n" + + " -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 1\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n $editorName;\n\n\t\t\t$editorName = ($panelName+\"DopeSheetEd\");\n dopeSheetEditor -e \n -displayKeys 1\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 0\n -displayInfinities 0\n -displayValues 0\n -autoFit 0\n -snapTime \"integer\" \n -snapValue \"none\" \n -outliner \"dopeSheetPanel1OutlineEd\" \n -showSummary 1\n" + + " -showScene 0\n -hierarchyBelow 0\n -showTicks 1\n -selectionWindow 0 0 0 0 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"timeEditorPanel\" (localizedPanelLabel(\"Time Editor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"timeEditorPanel\" -l (localizedPanelLabel(\"Time Editor\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Time Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"clipEditorPanel\" (localizedPanelLabel(\"Trax Editor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"clipEditorPanel\" -l (localizedPanelLabel(\"Trax Editor\")) -mbv $menusOkayInPanels `;\n" + + "\n\t\t\t$editorName = clipEditorNameFromPanel($panelName);\n clipEditor -e \n -displayKeys 0\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 0\n -displayInfinities 0\n -displayValues 0\n -autoFit 0\n -snapTime \"none\" \n -snapValue \"none\" \n -initialized 0\n -manageSequencer 0 \n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Trax Editor\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = clipEditorNameFromPanel($panelName);\n clipEditor -e \n -displayKeys 0\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 0\n -displayInfinities 0\n -displayValues 0\n -autoFit 0\n -snapTime \"none\" \n -snapValue \"none\" \n" + + " -initialized 0\n -manageSequencer 0 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"sequenceEditorPanel\" (localizedPanelLabel(\"Camera Sequencer\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"sequenceEditorPanel\" -l (localizedPanelLabel(\"Camera Sequencer\")) -mbv $menusOkayInPanels `;\n\n\t\t\t$editorName = sequenceEditorNameFromPanel($panelName);\n clipEditor -e \n -displayKeys 0\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 0\n -displayInfinities 0\n -displayValues 0\n -autoFit 0\n -snapTime \"none\" \n -snapValue \"none\" \n -initialized 0\n -manageSequencer 1 \n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n" + + "\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Camera Sequencer\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = sequenceEditorNameFromPanel($panelName);\n clipEditor -e \n -displayKeys 0\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 0\n -displayInfinities 0\n -displayValues 0\n -autoFit 0\n -snapTime \"none\" \n -snapValue \"none\" \n -initialized 0\n -manageSequencer 1 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"hyperGraphPanel\" (localizedPanelLabel(\"Hypergraph Hierarchy\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"hyperGraphPanel\" -l (localizedPanelLabel(\"Hypergraph Hierarchy\")) -mbv $menusOkayInPanels `;\n\n\t\t\t$editorName = ($panelName+\"HyperGraphEd\");\n" + + " hyperGraph -e \n -graphLayoutStyle \"hierarchicalLayout\" \n -orientation \"horiz\" \n -mergeConnections 0\n -zoom 1\n -animateTransition 0\n -showRelationships 1\n -showShapes 0\n -showDeformers 0\n -showExpressions 0\n -showConstraints 0\n -showConnectionFromSelected 0\n -showConnectionToSelected 0\n -showConstraintLabels 0\n -showUnderworld 0\n -showInvisible 0\n -transitionFrames 1\n -opaqueContainers 0\n -freeform 0\n -imagePosition 0 0 \n -imageScale 1\n -imageEnabled 0\n -graphType \"DAG\" \n -heatMapDisplay 0\n -updateSelection 1\n -updateNodeAdded 1\n -useDrawOverrideColor 0\n -limitGraphTraversal -1\n -range 0 0 \n" + + " -iconSize \"smallIcons\" \n -showCachedConnections 0\n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Hypergraph Hierarchy\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = ($panelName+\"HyperGraphEd\");\n hyperGraph -e \n -graphLayoutStyle \"hierarchicalLayout\" \n -orientation \"horiz\" \n -mergeConnections 0\n -zoom 1\n -animateTransition 0\n -showRelationships 1\n -showShapes 0\n -showDeformers 0\n -showExpressions 0\n -showConstraints 0\n -showConnectionFromSelected 0\n -showConnectionToSelected 0\n -showConstraintLabels 0\n -showUnderworld 0\n -showInvisible 0\n -transitionFrames 1\n -opaqueContainers 0\n -freeform 0\n -imagePosition 0 0 \n" + + " -imageScale 1\n -imageEnabled 0\n -graphType \"DAG\" \n -heatMapDisplay 0\n -updateSelection 1\n -updateNodeAdded 1\n -useDrawOverrideColor 0\n -limitGraphTraversal -1\n -range 0 0 \n -iconSize \"smallIcons\" \n -showCachedConnections 0\n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"visorPanel\" (localizedPanelLabel(\"Visor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"visorPanel\" -l (localizedPanelLabel(\"Visor\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Visor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"createNodePanel\" (localizedPanelLabel(\"Create Node\")) `;\n" + + "\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"createNodePanel\" -l (localizedPanelLabel(\"Create Node\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Create Node\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"polyTexturePlacementPanel\" (localizedPanelLabel(\"UV Editor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"polyTexturePlacementPanel\" -l (localizedPanelLabel(\"UV Editor\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"UV Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"renderWindowPanel\" (localizedPanelLabel(\"Render View\")) `;\n" + + "\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"renderWindowPanel\" -l (localizedPanelLabel(\"Render View\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Render View\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"shapePanel\" (localizedPanelLabel(\"Shape Editor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\tshapePanel -unParent -l (localizedPanelLabel(\"Shape Editor\")) -mbv $menusOkayInPanels ;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tshapePanel -edit -l (localizedPanelLabel(\"Shape Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"posePanel\" (localizedPanelLabel(\"Pose Editor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\tposePanel -unParent -l (localizedPanelLabel(\"Pose Editor\")) -mbv $menusOkayInPanels ;\n" + + "\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tposePanel -edit -l (localizedPanelLabel(\"Pose Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"dynRelEdPanel\" (localizedPanelLabel(\"Dynamic Relationships\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"dynRelEdPanel\" -l (localizedPanelLabel(\"Dynamic Relationships\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Dynamic Relationships\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"relationshipPanel\" (localizedPanelLabel(\"Relationship Editor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"relationshipPanel\" -l (localizedPanelLabel(\"Relationship Editor\")) -mbv $menusOkayInPanels `;\n" + + "\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Relationship Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"referenceEditorPanel\" (localizedPanelLabel(\"Reference Editor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"referenceEditorPanel\" -l (localizedPanelLabel(\"Reference Editor\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Reference Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"componentEditorPanel\" (localizedPanelLabel(\"Component Editor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"componentEditorPanel\" -l (localizedPanelLabel(\"Component Editor\")) -mbv $menusOkayInPanels `;\n" + + "\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Component Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"dynPaintScriptedPanelType\" (localizedPanelLabel(\"Paint Effects\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"dynPaintScriptedPanelType\" -l (localizedPanelLabel(\"Paint Effects\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Paint Effects\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"scriptEditorPanel\" (localizedPanelLabel(\"Script Editor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"scriptEditorPanel\" -l (localizedPanelLabel(\"Script Editor\")) -mbv $menusOkayInPanels `;\n" + + "\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Script Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"profilerPanel\" (localizedPanelLabel(\"Profiler Tool\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"profilerPanel\" -l (localizedPanelLabel(\"Profiler Tool\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Profiler Tool\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"contentBrowserPanel\" (localizedPanelLabel(\"Content Browser\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"contentBrowserPanel\" -l (localizedPanelLabel(\"Content Browser\")) -mbv $menusOkayInPanels `;\n" + + "\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Content Browser\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"Stereo\" (localizedPanelLabel(\"Stereo\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"Stereo\" -l (localizedPanelLabel(\"Stereo\")) -mbv $menusOkayInPanels `;\nstring $editorName = ($panelName+\"Editor\");\n stereoCameraView -e \n -camera \"persp\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"wireframe\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 1\n" + + " -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 16384\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n -maxConstantTransparency 1\n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 4 4 \n -bumpResolution 4 4 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n" + + " -lowQualityLighting 0\n -maximumNumHardwareLights 0\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n" + + " -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n -captureSequenceNumber -1\n -width 0\n -height 0\n -sceneRenderFilter 0\n -displayMode \"centerEye\" \n -viewColor 0 0 0 1 \n -useCustomBackground 1\n $editorName;\n stereoCameraView -e -viewSelected 0 $editorName;\n stereoCameraView -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Stereo\")) -mbv $menusOkayInPanels $panelName;\nstring $editorName = ($panelName+\"Editor\");\n" + + " stereoCameraView -e \n -camera \"persp\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"wireframe\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 1\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 16384\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n" + + " -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n -maxConstantTransparency 1\n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 4 4 \n -bumpResolution 4 4 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 0\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n" + + " -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n -captureSequenceNumber -1\n -width 0\n -height 0\n" + + " -sceneRenderFilter 0\n -displayMode \"centerEye\" \n -viewColor 0 0 0 1 \n -useCustomBackground 1\n $editorName;\n stereoCameraView -e -viewSelected 0 $editorName;\n stereoCameraView -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"outlinerPanel\" (localizedPanelLabel(\"Outliner\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `outlinerPanel -unParent -l (localizedPanelLabel(\"Outliner\")) -mbv $menusOkayInPanels `;\n\t\t\t$editorName = $panelName;\n outlinerEditor -e \n -showShapes 0\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 0\n -showConnected 0\n -showAnimCurvesOnly 0\n" + + " -showMuteInfo 0\n -organizeByLayer 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 0\n -showDagOnly 1\n -showAssets 1\n -showContainedOnly 1\n -showPublishedAsConnected 0\n -showContainerContents 1\n -ignoreDagHierarchy 0\n -expandConnections 0\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 1\n -showLeafs 1\n -showNumericAttrsOnly 0\n -highlightActive 1\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"defaultSetFilter\" \n -showSetMembers 1\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -isSet 0\n -isSetMember 0\n" + + " -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 0\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n -renderFilterIndex 0\n -selectionOrder \"chronological\" \n -expandAttribute 0\n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\toutlinerPanel -edit -l (localizedPanelLabel(\"Outliner\")) -mbv $menusOkayInPanels $panelName;\n" + + "\t\t$editorName = $panelName;\n outlinerEditor -e \n -showShapes 0\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 0\n -showConnected 0\n -showAnimCurvesOnly 0\n -showMuteInfo 0\n -organizeByLayer 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 0\n -showDagOnly 1\n -showAssets 1\n -showContainedOnly 1\n -showPublishedAsConnected 0\n -showContainerContents 1\n -ignoreDagHierarchy 0\n -expandConnections 0\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 1\n -showLeafs 1\n -showNumericAttrsOnly 0\n -highlightActive 1\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"defaultSetFilter\" \n" + + " -showSetMembers 1\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -isSet 0\n -isSetMember 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 0\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n -renderFilterIndex 0\n -selectionOrder \"chronological\" \n -expandAttribute 0\n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n" + + "\t\t}\n\t}\n\tif ($useSceneConfig) {\n\t\toutlinerPanel -e -to $panelName;\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"hyperShadePanel\" (localizedPanelLabel(\"Hypershade\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"hyperShadePanel\" -l (localizedPanelLabel(\"Hypershade\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Hypershade\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"nodeEditorPanel\" (localizedPanelLabel(\"Node Editor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"nodeEditorPanel\" -l (localizedPanelLabel(\"Node Editor\")) -mbv $menusOkayInPanels `;\n\n\t\t\t$editorName = ($panelName+\"NodeEditorEd\");\n nodeEditor -e \n -allAttributes 0\n -allNodes 0\n -autoSizeNodes 1\n" + + " -consistentNameSize 1\n -createNodeCommand \"nodeEdCreateNodeCommand\" \n -defaultPinnedState 0\n -additiveGraphingMode 0\n -settingsChangedCallback \"nodeEdSyncControls\" \n -traversalDepthLimit -1\n -keyPressCommand \"nodeEdKeyPressCommand\" \n -nodeTitleMode \"name\" \n -gridSnap 0\n -gridVisibility 1\n -popupMenuScript \"nodeEdBuildPanelMenus\" \n -showNamespace 1\n -showShapes 1\n -showSGShapes 0\n -showTransforms 1\n -useAssets 1\n -syncedSelection 1\n -extendToShapes 1\n -activeTab -1\n -editorMode \"default\" \n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Node Editor\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = ($panelName+\"NodeEditorEd\");\n nodeEditor -e \n" + + " -allAttributes 0\n -allNodes 0\n -autoSizeNodes 1\n -consistentNameSize 1\n -createNodeCommand \"nodeEdCreateNodeCommand\" \n -defaultPinnedState 0\n -additiveGraphingMode 0\n -settingsChangedCallback \"nodeEdSyncControls\" \n -traversalDepthLimit -1\n -keyPressCommand \"nodeEdKeyPressCommand\" \n -nodeTitleMode \"name\" \n -gridSnap 0\n -gridVisibility 1\n -popupMenuScript \"nodeEdBuildPanelMenus\" \n -showNamespace 1\n -showShapes 1\n -showSGShapes 0\n -showTransforms 1\n -useAssets 1\n -syncedSelection 1\n -extendToShapes 1\n -activeTab -1\n -editorMode \"default\" \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\tif ($useSceneConfig) {\n string $configName = `getPanel -cwl (localizedPanelLabel(\"Current Layout\"))`;\n" + + " if (\"\" != $configName) {\n\t\t\tpanelConfiguration -edit -label (localizedPanelLabel(\"Current Layout\")) \n\t\t\t\t-userCreated false\n\t\t\t\t-defaultImage \"vacantCell.xP:/\"\n\t\t\t\t-image \"\"\n\t\t\t\t-sc false\n\t\t\t\t-configString \"global string $gMainPane; paneLayout -e -cn \\\"single\\\" -ps 1 100 100 $gMainPane;\"\n\t\t\t\t-removeAllPanels\n\t\t\t\t-ap false\n\t\t\t\t\t(localizedPanelLabel(\"Persp View\")) \n\t\t\t\t\t\"modelPanel\"\n" + + "\t\t\t\t\t\"$panelName = `modelPanel -unParent -l (localizedPanelLabel(\\\"Persp View\\\")) -mbv $menusOkayInPanels `;\\n$editorName = $panelName;\\nmodelEditor -e \\n -cam `findStartUpCamera persp` \\n -useInteractiveMode 0\\n -displayLights \\\"default\\\" \\n -displayAppearance \\\"smoothShaded\\\" \\n -activeOnly 0\\n -ignorePanZoom 0\\n -wireframeOnShaded 0\\n -headsUpDisplay 1\\n -holdOuts 1\\n -selectionHiliteDisplay 1\\n -useDefaultMaterial 0\\n -bufferMode \\\"double\\\" \\n -twoSidedLighting 0\\n -backfaceCulling 0\\n -xray 0\\n -jointXray 0\\n -activeComponentsXray 0\\n -displayTextures 0\\n -smoothWireframe 0\\n -lineWidth 1\\n -textureAnisotropic 0\\n -textureHilight 1\\n -textureSampling 2\\n -textureDisplay \\\"modulate\\\" \\n -textureMaxSize 16384\\n -fogging 0\\n -fogSource \\\"fragment\\\" \\n -fogMode \\\"linear\\\" \\n -fogStart 0\\n -fogEnd 100\\n -fogDensity 0.1\\n -fogColor 0.5 0.5 0.5 1 \\n -depthOfFieldPreview 1\\n -maxConstantTransparency 1\\n -rendererName \\\"vp2Renderer\\\" \\n -objectFilterShowInHUD 1\\n -isFiltered 0\\n -colorResolution 256 256 \\n -bumpResolution 512 512 \\n -textureCompression 0\\n -transparencyAlgorithm \\\"frontAndBackCull\\\" \\n -transpInShadows 0\\n -cullingOverride \\\"none\\\" \\n -lowQualityLighting 0\\n -maximumNumHardwareLights 1\\n -occlusionCulling 0\\n -shadingModel 0\\n -useBaseRenderer 0\\n -useReducedRenderer 0\\n -smallObjectCulling 0\\n -smallObjectThreshold -1 \\n -interactiveDisableShadows 0\\n -interactiveBackFaceCull 0\\n -sortTransparent 1\\n -nurbsCurves 1\\n -nurbsSurfaces 1\\n -polymeshes 1\\n -subdivSurfaces 1\\n -planes 1\\n -lights 1\\n -cameras 1\\n -controlVertices 1\\n -hulls 1\\n -grid 1\\n -imagePlane 1\\n -joints 1\\n -ikHandles 1\\n -deformers 1\\n -dynamics 1\\n -particleInstancers 1\\n -fluids 1\\n -hairSystems 1\\n -follicles 1\\n -nCloths 1\\n -nParticles 1\\n -nRigids 1\\n -dynamicConstraints 1\\n -locators 1\\n -manipulators 1\\n -pluginShapes 1\\n -dimensions 1\\n -handles 1\\n -pivots 1\\n -textures 1\\n -strokes 1\\n -motionTrails 1\\n -clipGhosts 1\\n -greasePencils 1\\n -shadows 0\\n -captureSequenceNumber -1\\n -width 2058\\n -height 1022\\n -sceneRenderFilter 0\\n $editorName;\\nmodelEditor -e -viewSelected 0 $editorName;\\nmodelEditor -e \\n -pluginObjects \\\"gpuCacheDisplayFilter\\\" 1 \\n $editorName\"\n" + + "\t\t\t\t\t\"modelPanel -edit -l (localizedPanelLabel(\\\"Persp View\\\")) -mbv $menusOkayInPanels $panelName;\\n$editorName = $panelName;\\nmodelEditor -e \\n -cam `findStartUpCamera persp` \\n -useInteractiveMode 0\\n -displayLights \\\"default\\\" \\n -displayAppearance \\\"smoothShaded\\\" \\n -activeOnly 0\\n -ignorePanZoom 0\\n -wireframeOnShaded 0\\n -headsUpDisplay 1\\n -holdOuts 1\\n -selectionHiliteDisplay 1\\n -useDefaultMaterial 0\\n -bufferMode \\\"double\\\" \\n -twoSidedLighting 0\\n -backfaceCulling 0\\n -xray 0\\n -jointXray 0\\n -activeComponentsXray 0\\n -displayTextures 0\\n -smoothWireframe 0\\n -lineWidth 1\\n -textureAnisotropic 0\\n -textureHilight 1\\n -textureSampling 2\\n -textureDisplay \\\"modulate\\\" \\n -textureMaxSize 16384\\n -fogging 0\\n -fogSource \\\"fragment\\\" \\n -fogMode \\\"linear\\\" \\n -fogStart 0\\n -fogEnd 100\\n -fogDensity 0.1\\n -fogColor 0.5 0.5 0.5 1 \\n -depthOfFieldPreview 1\\n -maxConstantTransparency 1\\n -rendererName \\\"vp2Renderer\\\" \\n -objectFilterShowInHUD 1\\n -isFiltered 0\\n -colorResolution 256 256 \\n -bumpResolution 512 512 \\n -textureCompression 0\\n -transparencyAlgorithm \\\"frontAndBackCull\\\" \\n -transpInShadows 0\\n -cullingOverride \\\"none\\\" \\n -lowQualityLighting 0\\n -maximumNumHardwareLights 1\\n -occlusionCulling 0\\n -shadingModel 0\\n -useBaseRenderer 0\\n -useReducedRenderer 0\\n -smallObjectCulling 0\\n -smallObjectThreshold -1 \\n -interactiveDisableShadows 0\\n -interactiveBackFaceCull 0\\n -sortTransparent 1\\n -nurbsCurves 1\\n -nurbsSurfaces 1\\n -polymeshes 1\\n -subdivSurfaces 1\\n -planes 1\\n -lights 1\\n -cameras 1\\n -controlVertices 1\\n -hulls 1\\n -grid 1\\n -imagePlane 1\\n -joints 1\\n -ikHandles 1\\n -deformers 1\\n -dynamics 1\\n -particleInstancers 1\\n -fluids 1\\n -hairSystems 1\\n -follicles 1\\n -nCloths 1\\n -nParticles 1\\n -nRigids 1\\n -dynamicConstraints 1\\n -locators 1\\n -manipulators 1\\n -pluginShapes 1\\n -dimensions 1\\n -handles 1\\n -pivots 1\\n -textures 1\\n -strokes 1\\n -motionTrails 1\\n -clipGhosts 1\\n -greasePencils 1\\n -shadows 0\\n -captureSequenceNumber -1\\n -width 2058\\n -height 1022\\n -sceneRenderFilter 0\\n $editorName;\\nmodelEditor -e -viewSelected 0 $editorName;\\nmodelEditor -e \\n -pluginObjects \\\"gpuCacheDisplayFilter\\\" 1 \\n $editorName\"\n" + + "\t\t\t\t$configName;\n\n setNamedPanelLayout (localizedPanelLabel(\"Current Layout\"));\n }\n\n panelHistory -e -clear mainPanelHistory;\n setFocus `paneLayout -q -p1 $gMainPane`;\n sceneUIReplacement -deleteRemaining;\n sceneUIReplacement -clear;\n\t}\n\n\ngrid -spacing 5 -size 12 -divisions 5 -displayAxes yes -displayGridLines yes -displayDivisionLines yes -displayPerspectiveLabels no -displayOrthographicLabels no -displayAxesBold yes -perspectiveLabelPosition axis -orthographicLabelPosition edge;\nviewManip -drawCompass 0 -compassAngle 0 -frontParameters \"\" -homeParameters \"\" -selectionLockParameters \"\";\n}\n"); + setAttr ".st" 3; +select -ne :time1; + setAttr -av -k on ".cch"; + setAttr -cb on ".ihi"; + setAttr -k on ".nds"; + setAttr -cb on ".bnm"; + setAttr -k on ".o" 1; + setAttr -k on ".unw" 1; + setAttr -k on ".etw"; + setAttr -k on ".tps"; + setAttr -k on ".tms"; +lockNode -l 1 ; +select -ne :hardwareRenderingGlobals; + setAttr ".otfna" -type "stringArray" 18 "NURBS Curves" "NURBS Surfaces" "Polygons" "Subdiv Surfaces" "Particles" "Fluids" "Image Planes" "UI:" "Lights" "Cameras" "Locators" "Joints" "IK Handles" "Deformers" "Motion Trails" "Components" "Misc. UI" "Ornaments" ; + setAttr ".otfva" -type "Int32Array" 18 0 1 1 1 1 1 + 1 0 0 0 0 0 0 0 0 0 0 0 ; +select -ne :renderPartition; + setAttr -k on ".cch"; + setAttr -cb on ".ihi"; + setAttr -k on ".nds"; + setAttr -cb on ".bnm"; + setAttr -s 2 ".st"; + setAttr -cb on ".an"; + setAttr -cb on ".pt"; +lockNode -l 1 ; +select -ne :renderGlobalsList1; + setAttr -k on ".cch"; + setAttr -cb on ".ihi"; + setAttr -k on ".nds"; + setAttr -cb on ".bnm"; +select -ne :defaultShaderList1; + setAttr -k on ".cch"; + setAttr -cb on ".ihi"; + setAttr -k on ".nds"; + setAttr -cb on ".bnm"; + setAttr -s 4 ".s"; +select -ne :postProcessList1; + setAttr -k on ".cch"; + setAttr -cb on ".ihi"; + setAttr -k on ".nds"; + setAttr -cb on ".bnm"; + setAttr -s 2 ".p"; +select -ne :defaultRenderingList1; + setAttr -s 3 ".r"; +select -ne :initialShadingGroup; + setAttr -k on ".cch"; + setAttr -cb on ".ihi"; + setAttr -av -k on ".nds"; + setAttr -cb on ".bnm"; + setAttr -s 3 ".dsm"; + setAttr -k on ".mwc"; + setAttr -cb on ".an"; + setAttr -cb on ".il"; + setAttr -cb on ".vo"; + setAttr -cb on ".eo"; + setAttr -cb on ".fo"; + setAttr -cb on ".epo"; + setAttr -k on ".ro" yes; +lockNode -l 1 ; +select -ne :initialParticleSE; + setAttr -av -k on ".cch"; + setAttr -cb on ".ihi"; + setAttr -av -k on ".nds"; + setAttr -cb on ".bnm"; + setAttr -k on ".mwc"; + setAttr -cb on ".an"; + setAttr -cb on ".il"; + setAttr -cb on ".vo"; + setAttr -cb on ".eo"; + setAttr -cb on ".fo"; + setAttr -cb on ".epo"; + setAttr -k on ".ro" yes; +select -ne :defaultRenderGlobals; + setAttr ".ep" 1; +select -ne :defaultResolution; + setAttr -k on ".cch"; + setAttr -k on ".nds"; + setAttr -av ".w" 640; + setAttr -av ".h" 480; + setAttr -k on ".pa" 1; + setAttr -k on ".al"; + setAttr -av ".dar" 1.3333332538604736; + setAttr -k on ".ldar"; + setAttr -k on ".off"; + setAttr -k on ".fld"; + setAttr -k on ".zsl"; +select -ne :defaultLightSet; + setAttr -k on ".cch"; + setAttr -k on ".ihi"; + setAttr -av -k on ".nds"; + setAttr -k on ".bnm"; + setAttr -k on ".mwc"; + setAttr -k on ".an"; + setAttr -k on ".il"; + setAttr -k on ".vo"; + setAttr -k on ".eo"; + setAttr -k on ".fo"; + setAttr -k on ".epo"; + setAttr -k on ".ro" yes; +select -ne :defaultObjectSet; + setAttr ".ro" yes; +lockNode -l 1 ; +select -ne :defaultColorMgtGlobals; + setAttr ".cme" no; +select -ne :hardwareRenderGlobals; + setAttr -k on ".cch"; + setAttr -cb on ".ihi"; + setAttr -k on ".nds"; + setAttr -cb on ".bnm"; + setAttr ".ctrs" 256; + setAttr ".btrs" 512; + setAttr -k off ".fbfm"; + setAttr -k off -cb on ".ehql"; + setAttr -k off -cb on ".eams"; + setAttr -k off -cb on ".eeaa"; + setAttr -k off -cb on ".engm"; + setAttr -k off -cb on ".mes"; + setAttr -k off -cb on ".emb"; + setAttr -av -k off -cb on ".mbbf"; + setAttr -k off -cb on ".mbs"; + setAttr -k off -cb on ".trm"; + setAttr -k off -cb on ".tshc"; + setAttr -k off ".enpt"; + setAttr -k off -cb on ".clmt"; + setAttr -k off -cb on ".tcov"; + setAttr -k off -cb on ".lith"; + setAttr -k off -cb on ".sobc"; + setAttr -k off -cb on ".cuth"; + setAttr -k off -cb on ".hgcd"; + setAttr -k off -cb on ".hgci"; + setAttr -k off -cb on ".mgcs"; + setAttr -k off -cb on ".twa"; + setAttr -k off -cb on ".twz"; + setAttr -k on ".hwcc"; + setAttr -k on ".hwdp"; + setAttr -k on ".hwql"; + setAttr -k on ".hwfr"; +select -ne :ikSystem; + setAttr -k on ".cch"; + setAttr -k on ".ihi"; + setAttr -k on ".nds"; + setAttr -k on ".bnm"; + setAttr -av ".gsn"; + setAttr -k on ".gsv"; + setAttr -s 4 ".sol"; +connectAttr "lockedNode_translateZ.o" "srcSphereRN.phl[1]"; +connectAttr "srcSphere:sphere_testVectorX.o" "srcSphereRN.phl[2]"; +connectAttr "srcSphere:sphere_testVectorY.o" "srcSphereRN.phl[3]"; +connectAttr "srcSphere:sphere_testVectorZ.o" "srcSphereRN.phl[4]"; +connectAttr "srcSphere:sphere_testEnum.o" "srcSphereRN.phl[5]"; +connectAttr "srcSphere:sphere_testFloat.o" "srcSphereRN.phl[6]"; +connectAttr "srcSphere:sphere_testBoolean.o" "srcSphereRN.phl[7]"; +connectAttr "srcSphere:sphere_testInteger.o" "srcSphereRN.phl[8]"; +connectAttr "srcSphere:sphere_translateY.o" "srcSphereRN.phl[9]"; +connectAttr "srcSphere:sphere_translateX.o" "srcSphereRN.phl[10]"; +connectAttr "srcSphere:sphere_translateZ.o" "srcSphereRN.phl[11]"; +connectAttr "srcSphere:sphere_rotateX.o" "srcSphereRN.phl[12]"; +connectAttr "srcSphere:sphere_rotateZ.o" "srcSphereRN.phl[13]"; +connectAttr "srcSphere:sphere_scaleX.o" "srcSphereRN.phl[14]"; +connectAttr "srcSphere:sphere_scaleZ.o" "srcSphereRN.phl[15]"; +connectAttr "srcSphere:sphere_visibility.o" "srcSphereRN.phl[16]"; +connectAttr "|group|offset|lockedNode|sphere.msg" "group.testMessage" -l on; +connectAttr "|group|offset|lockedNode|sphere.ty" "|group|offset|lockedNode|sphere.testConnect" + ; +connectAttr "sphere_testAnimated.o" "|group|offset|lockedNode|sphere.testAnimated" + ; +connectAttr "group.msg" "|group|offset|lockedNode|sphere.testMessage" -l on; +connectAttr "srcPolySphere.out" "|group|offset|lockedNode|sphere|sphereShape.i"; +connectAttr "|group1|offset|lockedNode|sphere.msg" "group1.testMessage" -l on; +connectAttr "|group1|offset|lockedNode|sphere.ty" "|group1|offset|lockedNode|sphere.testConnect" + ; +connectAttr "sphere_testAnimated1.o" "|group1|offset|lockedNode|sphere.testAnimated" + ; +connectAttr "group1.msg" "|group1|offset|lockedNode|sphere.testMessage" -l on; +connectAttr "srcPolySphere1.out" "|group1|offset|lockedNode|sphere|sphereShape.i" + ; +relationship "link" ":lightLinker1" ":initialShadingGroup.message" ":defaultLightSet.message"; +relationship "link" ":lightLinker1" ":initialParticleSE.message" ":defaultLightSet.message"; +relationship "shadowLink" ":lightLinker1" ":initialShadingGroup.message" ":defaultLightSet.message"; +relationship "shadowLink" ":lightLinker1" ":initialParticleSE.message" ":defaultLightSet.message"; +connectAttr "layerManager.dli[0]" "defaultLayer.id"; +connectAttr "renderLayerManager.rlmi[0]" "defaultRenderLayer.rlid"; +connectAttr "dstSphere:renderLayerManager.rlmi[0]" "dstSphere:defaultRenderLayer.rlid" + ; +connectAttr "defaultRenderLayer.msg" ":defaultRenderingList1.r" -na; +connectAttr "dstSphere:defaultRenderLayer.msg" ":defaultRenderingList1.r" -na; +connectAttr "|group|offset|lockedNode|sphere|sphereShape.iog" ":initialShadingGroup.dsm" + -na; +connectAttr "|group1|offset|lockedNode|sphere|sphereShape.iog" ":initialShadingGroup.dsm" + -na; +// End of test_non_unique_names.ma diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_non_unique_names.pose b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_non_unique_names.pose new file mode 100644 index 0000000..25f0497 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_non_unique_names.pose @@ -0,0 +1,151 @@ +{ + "metadata": { + "mayaSceneFile": "C:/Users/hovel/Dropbox/git/site-packages/studiolibrary/packages/mutils/tests/data/test_non_unique_names.ma", + "version": "1.0.0", + "user": "Hovel", + "mayaVersion": "2017", + "ctime": "1518341544" + } +, + "objects": { + "srcSphere:offset": { + "attrs": {} + }, + "srcSphere:sphere": { + "attrs": { + "testInteger": { + "type": "long", + "value": 5 + }, + "testProxy": { + "type": "double", + "value": 1.0 + }, + "scaleY": { + "type": "double", + "value": 4.66 + }, + "testLimit": { + "type": "double", + "value": 10.0 + }, + "testConnect": { + "type": "double", + "value": 8.0 + }, + "testEnum": { + "type": "enum", + "value": 1 + }, + "scaleX": { + "type": "double", + "value": 0.25 + }, + "testString": { + "type": "string", + "value": "Hello world" + }, + "scaleZ": { + "type": "double", + "value": 0.5 + }, + "rotateX": { + "type": "doubleAngle", + "value": 45.0 + }, + "rotateY": { + "type": "doubleAngle", + "value": 50.0 + }, + "rotateZ": { + "type": "doubleAngle", + "value": 90.0 + }, + "translateX": { + "type": "doubleLinear", + "value": 0.0 + }, + "translateY": { + "type": "doubleLinear", + "value": 8.0 + }, + "translateZ": { + "type": "doubleLinear", + "value": -12.0 + }, + "visibility": { + "type": "bool", + "value": true + }, + "testFloat": { + "type": "double", + "value": 0.666 + }, + "testAnimated": { + "type": "double", + "value": 0.0 + }, + "testVectorX": { + "type": "double", + "value": 0.2 + }, + "testVectorY": { + "type": "double", + "value": 1.4 + }, + "testVectorZ": { + "type": "double", + "value": 2.6 + }, + "testBoolean": { + "type": "bool", + "value": true + } + } + }, + "srcSphere:lockedNode": { + "attrs": { + "translateX": { + "type": "doubleLinear", + "value": 0.0 + }, + "translateY": { + "type": "doubleLinear", + "value": 5.0 + }, + "translateZ": { + "type": "doubleLinear", + "value": 0.0 + }, + "scaleX": { + "type": "double", + "value": 1.0 + }, + "scaleY": { + "type": "double", + "value": 1.0 + }, + "visibility": { + "type": "bool", + "value": true + }, + "rotateX": { + "type": "doubleAngle", + "value": 0.0 + }, + "rotateY": { + "type": "doubleAngle", + "value": 0.0 + }, + "rotateZ": { + "type": "doubleAngle", + "value": 0.0 + }, + "scaleZ": { + "type": "double", + "value": 1.0 + } + } + } + } +} \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_older_version.anim/.studioLibrary/record.dict b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_older_version.anim/.studioLibrary/record.dict new file mode 100644 index 0000000..34de2a7 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_older_version.anim/.studioLibrary/record.dict @@ -0,0 +1 @@ +{'end': 24, 'description': 'eded', 'scene': '', 'start': 1, 'mtime': '1391012417', 'owner': 'tlhomme', 'ctime': '1391012417'} \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_older_version.anim/animation.ma b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_older_version.anim/animation.ma new file mode 100644 index 0000000..85956c0 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_older_version.anim/animation.ma @@ -0,0 +1,7123 @@ +//Maya ASCII 2013 scene +//Name: animation.ma +//Last modified: Thu, Feb 07, 2013 04:40:04 PM +//Codeset: 1252 +requires maya "2013"; +requires "stereoCamera" "10.0"; +currentUnit -l centimeter -a degree -t film; +fileInfo "application" "maya"; +fileInfo "product" "Maya 2013"; +fileInfo "version" "2013 x64"; +fileInfo "cutIdentifier" "201202220241-825136"; +fileInfo "osv" "Microsoft Windows 7 Ultimate Edition, 64-bit Windows 7 Service Pack 1 (Build 7601)\n"; +createNode animCurveTL -n "DELETE_NODE_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grp4LipCornerSkinRt|malcolm1:grp3LipCornerSkinRt|malcolm1:grp2LipCornerSkinRt|malcolm1:ctlLipCornerSkinRt.translateX"; +createNode animCurveTL -n "DELETE_NODE_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grp4LipCornerSkinRt|malcolm1:grp3LipCornerSkinRt|malcolm1:grp2LipCornerSkinRt|malcolm1:ctlLipCornerSkinRt.translateY"; +createNode animCurveTL -n "DELETE_NODE_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grp4LipCornerSkinRt|malcolm1:grp3LipCornerSkinRt|malcolm1:grp2LipCornerSkinRt|malcolm1:ctlLipCornerSkinRt.translateZ"; +createNode animCurveTU -n "DELETE_NODE_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grp4LipCornerSkinRt|malcolm1:grp3LipCornerSkinRt|malcolm1:grp2LipCornerSkinRt|malcolm1:ctlLipCornerSkinRt.scaleX"; +createNode animCurveTU -n "DELETE_NODE_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grp4LipCornerSkinRt|malcolm1:grp3LipCornerSkinRt|malcolm1:grp2LipCornerSkinRt|malcolm1:ctlLipCornerSkinRt.scaleY"; +createNode animCurveTU -n "DELETE_NODE_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grp4LipCornerSkinRt|malcolm1:grp3LipCornerSkinRt|malcolm1:grp2LipCornerSkinRt|malcolm1:ctlLipCornerSkinRt.scaleZ"; +createNode animCurveTA -n "DELETE_NODE_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grp4LipCornerSkinRt|malcolm1:grp3LipCornerSkinRt|malcolm1:grp2LipCornerSkinRt|malcolm1:ctlLipCornerSkinRt.rotateX"; +createNode animCurveTA -n "DELETE_NODE_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grp4LipCornerSkinRt|malcolm1:grp3LipCornerSkinRt|malcolm1:grp2LipCornerSkinRt|malcolm1:ctlLipCornerSkinRt.rotateY"; +createNode animCurveTA -n "DELETE_NODE_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grp4LipCornerSkinRt|malcolm1:grp3LipCornerSkinRt|malcolm1:grp2LipCornerSkinRt|malcolm1:ctlLipCornerSkinRt.rotateZ"; +createNode animCurveTL -n "DELETE_NODE1_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grp4LipCornerSkinLf|malcolm1:grp3LipCornerSkinLf|malcolm1:grp2LipCornerSkinLf|malcolm1:ctlLipCornerSkinLf.translateX"; +createNode animCurveTL -n "DELETE_NODE1_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grp4LipCornerSkinLf|malcolm1:grp3LipCornerSkinLf|malcolm1:grp2LipCornerSkinLf|malcolm1:ctlLipCornerSkinLf.translateY"; +createNode animCurveTL -n "DELETE_NODE1_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grp4LipCornerSkinLf|malcolm1:grp3LipCornerSkinLf|malcolm1:grp2LipCornerSkinLf|malcolm1:ctlLipCornerSkinLf.translateZ"; +createNode animCurveTU -n "DELETE_NODE1_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grp4LipCornerSkinLf|malcolm1:grp3LipCornerSkinLf|malcolm1:grp2LipCornerSkinLf|malcolm1:ctlLipCornerSkinLf.scaleX"; +createNode animCurveTU -n "DELETE_NODE1_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grp4LipCornerSkinLf|malcolm1:grp3LipCornerSkinLf|malcolm1:grp2LipCornerSkinLf|malcolm1:ctlLipCornerSkinLf.scaleY"; +createNode animCurveTU -n "DELETE_NODE1_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grp4LipCornerSkinLf|malcolm1:grp3LipCornerSkinLf|malcolm1:grp2LipCornerSkinLf|malcolm1:ctlLipCornerSkinLf.scaleZ"; +createNode animCurveTA -n "DELETE_NODE1_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grp4LipCornerSkinLf|malcolm1:grp3LipCornerSkinLf|malcolm1:grp2LipCornerSkinLf|malcolm1:ctlLipCornerSkinLf.rotateX"; +createNode animCurveTA -n "DELETE_NODE1_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grp4LipCornerSkinLf|malcolm1:grp3LipCornerSkinLf|malcolm1:grp2LipCornerSkinLf|malcolm1:ctlLipCornerSkinLf.rotateY"; +createNode animCurveTA -n "DELETE_NODE1_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grp4LipCornerSkinLf|malcolm1:grp3LipCornerSkinLf|malcolm1:grp2LipCornerSkinLf|malcolm1:ctlLipCornerSkinLf.rotateZ"; +createNode animCurveTU -n "DELETE_NODE2_jawStretch"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:ctlJaw.jawStretch"; +createNode animCurveTL -n "DELETE_NODE2_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:ctlJaw.translateX"; +createNode animCurveTL -n "DELETE_NODE2_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0.0033959318634735991 10 0.0033959318634735991; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:ctlJaw.translateY"; +createNode animCurveTL -n "DELETE_NODE2_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0.037225733300033453 10 0.037225733300033453; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:ctlJaw.translateZ"; +createNode animCurveTU -n "DELETE_NODE2_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:ctlJaw.scaleX"; +createNode animCurveTU -n "DELETE_NODE2_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:ctlJaw.scaleY"; +createNode animCurveTU -n "DELETE_NODE2_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:ctlJaw.scaleZ"; +createNode animCurveTU -n "DELETE_NODE2_lipsSeal"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:ctlJaw.lipsSeal"; +createNode animCurveTA -n "DELETE_NODE2_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 38.044336921645353 6 -5.2124021846970194 + 10 -5.2124021846970194; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:ctlJaw.rotateX"; +createNode animCurveTA -n "DELETE_NODE2_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 -3.4001631649756883 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:ctlJaw.rotateY"; +createNode animCurveTA -n "DELETE_NODE2_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 4.3342393392160101 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:ctlJaw.rotateZ"; +createNode animCurveTU -n "DELETE_NODE2_lipSealHeight"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:ctlJaw.lipSealHeight"; +createNode animCurveTL -n "DELETE_NODE3_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:lipBtDriven|malcolm1:ctlLipBt.translateX"; +createNode animCurveTL -n "DELETE_NODE3_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:lipBtDriven|malcolm1:ctlLipBt.translateY"; +createNode animCurveTL -n "DELETE_NODE3_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:lipBtDriven|malcolm1:ctlLipBt.translateZ"; +createNode animCurveTU -n "DELETE_NODE3_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:lipBtDriven|malcolm1:ctlLipBt.scaleX"; +createNode animCurveTU -n "DELETE_NODE3_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:lipBtDriven|malcolm1:ctlLipBt.scaleY"; +createNode animCurveTU -n "DELETE_NODE3_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:lipBtDriven|malcolm1:ctlLipBt.scaleZ"; +createNode animCurveTA -n "DELETE_NODE3_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:lipBtDriven|malcolm1:ctlLipBt.rotateX"; +createNode animCurveTA -n "DELETE_NODE3_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:lipBtDriven|malcolm1:ctlLipBt.rotateY"; +createNode animCurveTA -n "DELETE_NODE3_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:lipBtDriven|malcolm1:ctlLipBt.rotateZ"; +createNode animCurveTL -n "DELETE_NODE4_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" ( + "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2|malcolm1:grpTongue3|malcolm1:ctlTongue3|malcolm1:grpTongue4|malcolm1:ctlTongue4|malcolm1:grpTongue5|malcolm1:ctlTongue5.translateX"); +createNode animCurveTL -n "DELETE_NODE4_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" ( + "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2|malcolm1:grpTongue3|malcolm1:ctlTongue3|malcolm1:grpTongue4|malcolm1:ctlTongue4|malcolm1:grpTongue5|malcolm1:ctlTongue5.translateY"); +createNode animCurveTL -n "DELETE_NODE4_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" ( + "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2|malcolm1:grpTongue3|malcolm1:ctlTongue3|malcolm1:grpTongue4|malcolm1:ctlTongue4|malcolm1:grpTongue5|malcolm1:ctlTongue5.translateZ"); +createNode animCurveTU -n "DELETE_NODE4_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" ( + "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2|malcolm1:grpTongue3|malcolm1:ctlTongue3|malcolm1:grpTongue4|malcolm1:ctlTongue4|malcolm1:grpTongue5|malcolm1:ctlTongue5.scaleX"); +createNode animCurveTU -n "DELETE_NODE4_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" ( + "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2|malcolm1:grpTongue3|malcolm1:ctlTongue3|malcolm1:grpTongue4|malcolm1:ctlTongue4|malcolm1:grpTongue5|malcolm1:ctlTongue5.scaleY"); +createNode animCurveTU -n "DELETE_NODE4_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" ( + "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2|malcolm1:grpTongue3|malcolm1:ctlTongue3|malcolm1:grpTongue4|malcolm1:ctlTongue4|malcolm1:grpTongue5|malcolm1:ctlTongue5.scaleZ"); +createNode animCurveTA -n "DELETE_NODE4_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" ( + "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2|malcolm1:grpTongue3|malcolm1:ctlTongue3|malcolm1:grpTongue4|malcolm1:ctlTongue4|malcolm1:grpTongue5|malcolm1:ctlTongue5.rotateX"); +createNode animCurveTA -n "DELETE_NODE4_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" ( + "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2|malcolm1:grpTongue3|malcolm1:ctlTongue3|malcolm1:grpTongue4|malcolm1:ctlTongue4|malcolm1:grpTongue5|malcolm1:ctlTongue5.rotateY"); +createNode animCurveTA -n "DELETE_NODE4_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" ( + "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2|malcolm1:grpTongue3|malcolm1:ctlTongue3|malcolm1:grpTongue4|malcolm1:ctlTongue4|malcolm1:grpTongue5|malcolm1:ctlTongue5.rotateZ"); +createNode animCurveTL -n "DELETE_NODE5_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" ( + "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2|malcolm1:grpTongue3|malcolm1:ctlTongue3|malcolm1:grpTongue4|malcolm1:ctlTongue4.translateX"); +createNode animCurveTL -n "DELETE_NODE5_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" ( + "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2|malcolm1:grpTongue3|malcolm1:ctlTongue3|malcolm1:grpTongue4|malcolm1:ctlTongue4.translateY"); +createNode animCurveTL -n "DELETE_NODE5_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" ( + "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2|malcolm1:grpTongue3|malcolm1:ctlTongue3|malcolm1:grpTongue4|malcolm1:ctlTongue4.translateZ"); +createNode animCurveTU -n "DELETE_NODE5_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" ( + "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2|malcolm1:grpTongue3|malcolm1:ctlTongue3|malcolm1:grpTongue4|malcolm1:ctlTongue4.scaleX"); +createNode animCurveTU -n "DELETE_NODE5_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" ( + "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2|malcolm1:grpTongue3|malcolm1:ctlTongue3|malcolm1:grpTongue4|malcolm1:ctlTongue4.scaleY"); +createNode animCurveTU -n "DELETE_NODE5_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" ( + "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2|malcolm1:grpTongue3|malcolm1:ctlTongue3|malcolm1:grpTongue4|malcolm1:ctlTongue4.scaleZ"); +createNode animCurveTA -n "DELETE_NODE5_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" ( + "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2|malcolm1:grpTongue3|malcolm1:ctlTongue3|malcolm1:grpTongue4|malcolm1:ctlTongue4.rotateX"); +createNode animCurveTA -n "DELETE_NODE5_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" ( + "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2|malcolm1:grpTongue3|malcolm1:ctlTongue3|malcolm1:grpTongue4|malcolm1:ctlTongue4.rotateY"); +createNode animCurveTA -n "DELETE_NODE5_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" ( + "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2|malcolm1:grpTongue3|malcolm1:ctlTongue3|malcolm1:grpTongue4|malcolm1:ctlTongue4.rotateZ"); +createNode animCurveTL -n "DELETE_NODE6_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2|malcolm1:grpTongue3|malcolm1:ctlTongue3.translateX"; +createNode animCurveTL -n "DELETE_NODE6_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2|malcolm1:grpTongue3|malcolm1:ctlTongue3.translateY"; +createNode animCurveTL -n "DELETE_NODE6_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2|malcolm1:grpTongue3|malcolm1:ctlTongue3.translateZ"; +createNode animCurveTU -n "DELETE_NODE6_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2|malcolm1:grpTongue3|malcolm1:ctlTongue3.scaleX"; +createNode animCurveTU -n "DELETE_NODE6_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2|malcolm1:grpTongue3|malcolm1:ctlTongue3.scaleY"; +createNode animCurveTU -n "DELETE_NODE6_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2|malcolm1:grpTongue3|malcolm1:ctlTongue3.scaleZ"; +createNode animCurveTA -n "DELETE_NODE6_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2|malcolm1:grpTongue3|malcolm1:ctlTongue3.rotateX"; +createNode animCurveTA -n "DELETE_NODE6_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2|malcolm1:grpTongue3|malcolm1:ctlTongue3.rotateY"; +createNode animCurveTA -n "DELETE_NODE6_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2|malcolm1:grpTongue3|malcolm1:ctlTongue3.rotateZ"; +createNode animCurveTL -n "DELETE_NODE7_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2.translateX"; +createNode animCurveTL -n "DELETE_NODE7_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0.109769011920731 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2.translateY"; +createNode animCurveTL -n "DELETE_NODE7_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2.translateZ"; +createNode animCurveTU -n "DELETE_NODE7_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2.scaleX"; +createNode animCurveTU -n "DELETE_NODE7_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2.scaleY"; +createNode animCurveTU -n "DELETE_NODE7_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2.scaleZ"; +createNode animCurveTA -n "DELETE_NODE7_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2.rotateX"; +createNode animCurveTA -n "DELETE_NODE7_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2.rotateY"; +createNode animCurveTA -n "DELETE_NODE7_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2.rotateZ"; +createNode animCurveTL -n "DELETE_NODE8_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1.translateX"; +createNode animCurveTL -n "DELETE_NODE8_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1.translateY"; +createNode animCurveTL -n "DELETE_NODE8_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1.translateZ"; +createNode animCurveTU -n "DELETE_NODE8_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1.scaleX"; +createNode animCurveTU -n "DELETE_NODE8_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1.scaleY"; +createNode animCurveTU -n "DELETE_NODE8_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1.scaleZ"; +createNode animCurveTA -n "DELETE_NODE8_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1.rotateX"; +createNode animCurveTA -n "DELETE_NODE8_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1.rotateY"; +createNode animCurveTA -n "DELETE_NODE8_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1.rotateZ"; +createNode animCurveTL -n "DELETE_NODE9_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt.translateX"; +createNode animCurveTL -n "DELETE_NODE9_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt.translateY"; +createNode animCurveTL -n "DELETE_NODE9_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt.translateZ"; +createNode animCurveTU -n "DELETE_NODE9_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt.scaleX"; +createNode animCurveTU -n "DELETE_NODE9_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt.scaleY"; +createNode animCurveTU -n "DELETE_NODE9_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt.scaleZ"; +createNode animCurveTA -n "DELETE_NODE9_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt.rotateX"; +createNode animCurveTA -n "DELETE_NODE9_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt.rotateY"; +createNode animCurveTA -n "DELETE_NODE9_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt.rotateZ"; +createNode animCurveTL -n "DELETE_NODE10_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt1Lf|malcolm1:ctlTeethBt1Lf.translateX"; +createNode animCurveTL -n "DELETE_NODE10_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt1Lf|malcolm1:ctlTeethBt1Lf.translateY"; +createNode animCurveTL -n "DELETE_NODE10_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt1Lf|malcolm1:ctlTeethBt1Lf.translateZ"; +createNode animCurveTU -n "DELETE_NODE10_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt1Lf|malcolm1:ctlTeethBt1Lf.scaleX"; +createNode animCurveTU -n "DELETE_NODE10_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt1Lf|malcolm1:ctlTeethBt1Lf.scaleY"; +createNode animCurveTU -n "DELETE_NODE10_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt1Lf|malcolm1:ctlTeethBt1Lf.scaleZ"; +createNode animCurveTA -n "DELETE_NODE10_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt1Lf|malcolm1:ctlTeethBt1Lf.rotateX"; +createNode animCurveTA -n "DELETE_NODE10_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt1Lf|malcolm1:ctlTeethBt1Lf.rotateY"; +createNode animCurveTA -n "DELETE_NODE10_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt1Lf|malcolm1:ctlTeethBt1Lf.rotateZ"; +createNode animCurveTL -n "DELETE_NODE11_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt1Rt|malcolm1:ctlTeethBt1Rt.translateX"; +createNode animCurveTL -n "DELETE_NODE11_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt1Rt|malcolm1:ctlTeethBt1Rt.translateY"; +createNode animCurveTL -n "DELETE_NODE11_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt1Rt|malcolm1:ctlTeethBt1Rt.translateZ"; +createNode animCurveTU -n "DELETE_NODE11_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt1Rt|malcolm1:ctlTeethBt1Rt.scaleX"; +createNode animCurveTU -n "DELETE_NODE11_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt1Rt|malcolm1:ctlTeethBt1Rt.scaleY"; +createNode animCurveTU -n "DELETE_NODE11_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt1Rt|malcolm1:ctlTeethBt1Rt.scaleZ"; +createNode animCurveTA -n "DELETE_NODE11_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt1Rt|malcolm1:ctlTeethBt1Rt.rotateX"; +createNode animCurveTA -n "DELETE_NODE11_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt1Rt|malcolm1:ctlTeethBt1Rt.rotateY"; +createNode animCurveTA -n "DELETE_NODE11_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt1Rt|malcolm1:ctlTeethBt1Rt.rotateZ"; +createNode animCurveTL -n "DELETE_NODE12_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt2Lf|malcolm1:ctlTeethBt2Lf.translateX"; +createNode animCurveTL -n "DELETE_NODE12_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt2Lf|malcolm1:ctlTeethBt2Lf.translateY"; +createNode animCurveTL -n "DELETE_NODE12_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt2Lf|malcolm1:ctlTeethBt2Lf.translateZ"; +createNode animCurveTU -n "DELETE_NODE12_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt2Lf|malcolm1:ctlTeethBt2Lf.scaleX"; +createNode animCurveTU -n "DELETE_NODE12_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt2Lf|malcolm1:ctlTeethBt2Lf.scaleY"; +createNode animCurveTU -n "DELETE_NODE12_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt2Lf|malcolm1:ctlTeethBt2Lf.scaleZ"; +createNode animCurveTA -n "DELETE_NODE12_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt2Lf|malcolm1:ctlTeethBt2Lf.rotateX"; +createNode animCurveTA -n "DELETE_NODE12_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt2Lf|malcolm1:ctlTeethBt2Lf.rotateY"; +createNode animCurveTA -n "DELETE_NODE12_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt2Lf|malcolm1:ctlTeethBt2Lf.rotateZ"; +createNode animCurveTL -n "DELETE_NODE13_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt2Rt|malcolm1:ctlTeethBt2Rt.translateX"; +createNode animCurveTL -n "DELETE_NODE13_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt2Rt|malcolm1:ctlTeethBt2Rt.translateY"; +createNode animCurveTL -n "DELETE_NODE13_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt2Rt|malcolm1:ctlTeethBt2Rt.translateZ"; +createNode animCurveTU -n "DELETE_NODE13_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt2Rt|malcolm1:ctlTeethBt2Rt.scaleX"; +createNode animCurveTU -n "DELETE_NODE13_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt2Rt|malcolm1:ctlTeethBt2Rt.scaleY"; +createNode animCurveTU -n "DELETE_NODE13_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt2Rt|malcolm1:ctlTeethBt2Rt.scaleZ"; +createNode animCurveTA -n "DELETE_NODE13_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt2Rt|malcolm1:ctlTeethBt2Rt.rotateX"; +createNode animCurveTA -n "DELETE_NODE13_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt2Rt|malcolm1:ctlTeethBt2Rt.rotateY"; +createNode animCurveTA -n "DELETE_NODE13_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt2Rt|malcolm1:ctlTeethBt2Rt.rotateZ"; +createNode animCurveTL -n "DELETE_NODE14_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBtCt|malcolm1:ctlTeethBtCt.translateX"; +createNode animCurveTL -n "DELETE_NODE14_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBtCt|malcolm1:ctlTeethBtCt.translateY"; +createNode animCurveTL -n "DELETE_NODE14_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBtCt|malcolm1:ctlTeethBtCt.translateZ"; +createNode animCurveTU -n "DELETE_NODE14_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBtCt|malcolm1:ctlTeethBtCt.scaleX"; +createNode animCurveTU -n "DELETE_NODE14_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBtCt|malcolm1:ctlTeethBtCt.scaleY"; +createNode animCurveTU -n "DELETE_NODE14_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBtCt|malcolm1:ctlTeethBtCt.scaleZ"; +createNode animCurveTA -n "DELETE_NODE14_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBtCt|malcolm1:ctlTeethBtCt.rotateX"; +createNode animCurveTA -n "DELETE_NODE14_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBtCt|malcolm1:ctlTeethBtCt.rotateY"; +createNode animCurveTA -n "DELETE_NODE14_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBtCt|malcolm1:ctlTeethBtCt.rotateZ"; +createNode animCurveTL -n "DELETE_NODE15_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBtLower2Rt|malcolm1:ctlTeethBtLower2Rt.translateX"; +createNode animCurveTL -n "DELETE_NODE15_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBtLower2Rt|malcolm1:ctlTeethBtLower2Rt.translateY"; +createNode animCurveTL -n "DELETE_NODE15_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBtLower2Rt|malcolm1:ctlTeethBtLower2Rt.translateZ"; +createNode animCurveTU -n "DELETE_NODE15_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBtLower2Rt|malcolm1:ctlTeethBtLower2Rt.scaleX"; +createNode animCurveTU -n "DELETE_NODE15_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBtLower2Rt|malcolm1:ctlTeethBtLower2Rt.scaleY"; +createNode animCurveTU -n "DELETE_NODE15_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBtLower2Rt|malcolm1:ctlTeethBtLower2Rt.scaleZ"; +createNode animCurveTA -n "DELETE_NODE15_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBtLower2Rt|malcolm1:ctlTeethBtLower2Rt.rotateX"; +createNode animCurveTA -n "DELETE_NODE15_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBtLower2Rt|malcolm1:ctlTeethBtLower2Rt.rotateY"; +createNode animCurveTA -n "DELETE_NODE15_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBtLower2Rt|malcolm1:ctlTeethBtLower2Rt.rotateZ"; +createNode animCurveTL -n "DELETE_NODE16_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBtLower2Lf|malcolm1:ctlTeethBtLower2Lf.translateX"; +createNode animCurveTL -n "DELETE_NODE16_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBtLower2Lf|malcolm1:ctlTeethBtLower2Lf.translateY"; +createNode animCurveTL -n "DELETE_NODE16_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBtLower2Lf|malcolm1:ctlTeethBtLower2Lf.translateZ"; +createNode animCurveTU -n "DELETE_NODE16_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBtLower2Lf|malcolm1:ctlTeethBtLower2Lf.scaleX"; +createNode animCurveTU -n "DELETE_NODE16_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBtLower2Lf|malcolm1:ctlTeethBtLower2Lf.scaleY"; +createNode animCurveTU -n "DELETE_NODE16_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBtLower2Lf|malcolm1:ctlTeethBtLower2Lf.scaleZ"; +createNode animCurveTA -n "DELETE_NODE16_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBtLower2Lf|malcolm1:ctlTeethBtLower2Lf.rotateX"; +createNode animCurveTA -n "DELETE_NODE16_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBtLower2Lf|malcolm1:ctlTeethBtLower2Lf.rotateY"; +createNode animCurveTA -n "DELETE_NODE16_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBtLower2Lf|malcolm1:ctlTeethBtLower2Lf.rotateZ"; +createNode animCurveTL -n "DELETE_NODE17_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpHeadShaperRigJawAttachSpaced|malcolm1:grpLipBt2SpacedLf|malcolm1:grp2Driven1LipBt2Lf|malcolm1:grp1Driven1LipBt2Lf|malcolm1:ctlLipBt2Lf.translateX"; +createNode animCurveTL -n "DELETE_NODE17_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpHeadShaperRigJawAttachSpaced|malcolm1:grpLipBt2SpacedLf|malcolm1:grp2Driven1LipBt2Lf|malcolm1:grp1Driven1LipBt2Lf|malcolm1:ctlLipBt2Lf.translateY"; +createNode animCurveTL -n "DELETE_NODE17_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpHeadShaperRigJawAttachSpaced|malcolm1:grpLipBt2SpacedLf|malcolm1:grp2Driven1LipBt2Lf|malcolm1:grp1Driven1LipBt2Lf|malcolm1:ctlLipBt2Lf.translateZ"; +createNode animCurveTU -n "DELETE_NODE17_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpHeadShaperRigJawAttachSpaced|malcolm1:grpLipBt2SpacedLf|malcolm1:grp2Driven1LipBt2Lf|malcolm1:grp1Driven1LipBt2Lf|malcolm1:ctlLipBt2Lf.scaleX"; +createNode animCurveTU -n "DELETE_NODE17_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpHeadShaperRigJawAttachSpaced|malcolm1:grpLipBt2SpacedLf|malcolm1:grp2Driven1LipBt2Lf|malcolm1:grp1Driven1LipBt2Lf|malcolm1:ctlLipBt2Lf.scaleY"; +createNode animCurveTU -n "DELETE_NODE17_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpHeadShaperRigJawAttachSpaced|malcolm1:grpLipBt2SpacedLf|malcolm1:grp2Driven1LipBt2Lf|malcolm1:grp1Driven1LipBt2Lf|malcolm1:ctlLipBt2Lf.scaleZ"; +createNode animCurveTA -n "DELETE_NODE17_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpHeadShaperRigJawAttachSpaced|malcolm1:grpLipBt2SpacedLf|malcolm1:grp2Driven1LipBt2Lf|malcolm1:grp1Driven1LipBt2Lf|malcolm1:ctlLipBt2Lf.rotateX"; +createNode animCurveTA -n "DELETE_NODE17_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpHeadShaperRigJawAttachSpaced|malcolm1:grpLipBt2SpacedLf|malcolm1:grp2Driven1LipBt2Lf|malcolm1:grp1Driven1LipBt2Lf|malcolm1:ctlLipBt2Lf.rotateY"; +createNode animCurveTA -n "DELETE_NODE17_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpHeadShaperRigJawAttachSpaced|malcolm1:grpLipBt2SpacedLf|malcolm1:grp2Driven1LipBt2Lf|malcolm1:grp1Driven1LipBt2Lf|malcolm1:ctlLipBt2Lf.rotateZ"; +createNode animCurveTL -n "DELETE_NODE18_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpHeadShaperRigJawAttachSpaced|malcolm1:grpLipBt2SpacedRt|malcolm1:grp2Driven1LipBt2Rt|malcolm1:grp1Driven1LipBt2Rt|malcolm1:ctlLipBt2Rt.translateX"; +createNode animCurveTL -n "DELETE_NODE18_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpHeadShaperRigJawAttachSpaced|malcolm1:grpLipBt2SpacedRt|malcolm1:grp2Driven1LipBt2Rt|malcolm1:grp1Driven1LipBt2Rt|malcolm1:ctlLipBt2Rt.translateY"; +createNode animCurveTL -n "DELETE_NODE18_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpHeadShaperRigJawAttachSpaced|malcolm1:grpLipBt2SpacedRt|malcolm1:grp2Driven1LipBt2Rt|malcolm1:grp1Driven1LipBt2Rt|malcolm1:ctlLipBt2Rt.translateZ"; +createNode animCurveTU -n "DELETE_NODE18_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpHeadShaperRigJawAttachSpaced|malcolm1:grpLipBt2SpacedRt|malcolm1:grp2Driven1LipBt2Rt|malcolm1:grp1Driven1LipBt2Rt|malcolm1:ctlLipBt2Rt.scaleX"; +createNode animCurveTU -n "DELETE_NODE18_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpHeadShaperRigJawAttachSpaced|malcolm1:grpLipBt2SpacedRt|malcolm1:grp2Driven1LipBt2Rt|malcolm1:grp1Driven1LipBt2Rt|malcolm1:ctlLipBt2Rt.scaleY"; +createNode animCurveTU -n "DELETE_NODE18_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpHeadShaperRigJawAttachSpaced|malcolm1:grpLipBt2SpacedRt|malcolm1:grp2Driven1LipBt2Rt|malcolm1:grp1Driven1LipBt2Rt|malcolm1:ctlLipBt2Rt.scaleZ"; +createNode animCurveTA -n "DELETE_NODE18_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpHeadShaperRigJawAttachSpaced|malcolm1:grpLipBt2SpacedRt|malcolm1:grp2Driven1LipBt2Rt|malcolm1:grp1Driven1LipBt2Rt|malcolm1:ctlLipBt2Rt.rotateX"; +createNode animCurveTA -n "DELETE_NODE18_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpHeadShaperRigJawAttachSpaced|malcolm1:grpLipBt2SpacedRt|malcolm1:grp2Driven1LipBt2Rt|malcolm1:grp1Driven1LipBt2Rt|malcolm1:ctlLipBt2Rt.rotateY"; +createNode animCurveTA -n "DELETE_NODE18_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpHeadShaperRigJawAttachSpaced|malcolm1:grpLipBt2SpacedRt|malcolm1:grp2Driven1LipBt2Rt|malcolm1:grp1Driven1LipBt2Rt|malcolm1:ctlLipBt2Rt.rotateZ"; +createNode animCurveTL -n "DELETE_NODE19_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt|malcolm1:grpLipBt1SpacedLf|malcolm1:grp2Driven1LipBt1Lf|malcolm1:grp1Driven1LipBt1Lf|malcolm1:ctlLipBt1Lf.translateX"; +createNode animCurveTL -n "DELETE_NODE19_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt|malcolm1:grpLipBt1SpacedLf|malcolm1:grp2Driven1LipBt1Lf|malcolm1:grp1Driven1LipBt1Lf|malcolm1:ctlLipBt1Lf.translateY"; +createNode animCurveTL -n "DELETE_NODE19_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt|malcolm1:grpLipBt1SpacedLf|malcolm1:grp2Driven1LipBt1Lf|malcolm1:grp1Driven1LipBt1Lf|malcolm1:ctlLipBt1Lf.translateZ"; +createNode animCurveTU -n "DELETE_NODE19_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt|malcolm1:grpLipBt1SpacedLf|malcolm1:grp2Driven1LipBt1Lf|malcolm1:grp1Driven1LipBt1Lf|malcolm1:ctlLipBt1Lf.scaleX"; +createNode animCurveTU -n "DELETE_NODE19_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt|malcolm1:grpLipBt1SpacedLf|malcolm1:grp2Driven1LipBt1Lf|malcolm1:grp1Driven1LipBt1Lf|malcolm1:ctlLipBt1Lf.scaleY"; +createNode animCurveTU -n "DELETE_NODE19_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt|malcolm1:grpLipBt1SpacedLf|malcolm1:grp2Driven1LipBt1Lf|malcolm1:grp1Driven1LipBt1Lf|malcolm1:ctlLipBt1Lf.scaleZ"; +createNode animCurveTA -n "DELETE_NODE19_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt|malcolm1:grpLipBt1SpacedLf|malcolm1:grp2Driven1LipBt1Lf|malcolm1:grp1Driven1LipBt1Lf|malcolm1:ctlLipBt1Lf.rotateX"; +createNode animCurveTA -n "DELETE_NODE19_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt|malcolm1:grpLipBt1SpacedLf|malcolm1:grp2Driven1LipBt1Lf|malcolm1:grp1Driven1LipBt1Lf|malcolm1:ctlLipBt1Lf.rotateY"; +createNode animCurveTA -n "DELETE_NODE19_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt|malcolm1:grpLipBt1SpacedLf|malcolm1:grp2Driven1LipBt1Lf|malcolm1:grp1Driven1LipBt1Lf|malcolm1:ctlLipBt1Lf.rotateZ"; +createNode animCurveTL -n "DELETE_NODE20_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt|malcolm1:grpLipBt1SpacedRt|malcolm1:grp2Driven1LipBt1Rt|malcolm1:grp1Driven1LipBt1Rt|malcolm1:ctlLipBt1Rt.translateX"; +createNode animCurveTL -n "DELETE_NODE20_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt|malcolm1:grpLipBt1SpacedRt|malcolm1:grp2Driven1LipBt1Rt|malcolm1:grp1Driven1LipBt1Rt|malcolm1:ctlLipBt1Rt.translateY"; +createNode animCurveTL -n "DELETE_NODE20_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt|malcolm1:grpLipBt1SpacedRt|malcolm1:grp2Driven1LipBt1Rt|malcolm1:grp1Driven1LipBt1Rt|malcolm1:ctlLipBt1Rt.translateZ"; +createNode animCurveTU -n "DELETE_NODE20_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt|malcolm1:grpLipBt1SpacedRt|malcolm1:grp2Driven1LipBt1Rt|malcolm1:grp1Driven1LipBt1Rt|malcolm1:ctlLipBt1Rt.scaleX"; +createNode animCurveTU -n "DELETE_NODE20_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt|malcolm1:grpLipBt1SpacedRt|malcolm1:grp2Driven1LipBt1Rt|malcolm1:grp1Driven1LipBt1Rt|malcolm1:ctlLipBt1Rt.scaleY"; +createNode animCurveTU -n "DELETE_NODE20_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt|malcolm1:grpLipBt1SpacedRt|malcolm1:grp2Driven1LipBt1Rt|malcolm1:grp1Driven1LipBt1Rt|malcolm1:ctlLipBt1Rt.scaleZ"; +createNode animCurveTA -n "DELETE_NODE20_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt|malcolm1:grpLipBt1SpacedRt|malcolm1:grp2Driven1LipBt1Rt|malcolm1:grp1Driven1LipBt1Rt|malcolm1:ctlLipBt1Rt.rotateX"; +createNode animCurveTA -n "DELETE_NODE20_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt|malcolm1:grpLipBt1SpacedRt|malcolm1:grp2Driven1LipBt1Rt|malcolm1:grp1Driven1LipBt1Rt|malcolm1:ctlLipBt1Rt.rotateY"; +createNode animCurveTA -n "DELETE_NODE20_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt|malcolm1:grpLipBt1SpacedRt|malcolm1:grp2Driven1LipBt1Rt|malcolm1:grp1Driven1LipBt1Rt|malcolm1:ctlLipBt1Rt.rotateZ"; +createNode animCurveTL -n "DELETE_NODE21_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt|malcolm1:grpLipBtCtSpaced|malcolm1:grp2Driven1LipBtCt|malcolm1:grp1Driven1LipBtCt|malcolm1:ctlLipBtCt.translateX"; +createNode animCurveTL -n "DELETE_NODE21_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt|malcolm1:grpLipBtCtSpaced|malcolm1:grp2Driven1LipBtCt|malcolm1:grp1Driven1LipBtCt|malcolm1:ctlLipBtCt.translateY"; +createNode animCurveTL -n "DELETE_NODE21_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt|malcolm1:grpLipBtCtSpaced|malcolm1:grp2Driven1LipBtCt|malcolm1:grp1Driven1LipBtCt|malcolm1:ctlLipBtCt.translateZ"; +createNode animCurveTU -n "DELETE_NODE21_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt|malcolm1:grpLipBtCtSpaced|malcolm1:grp2Driven1LipBtCt|malcolm1:grp1Driven1LipBtCt|malcolm1:ctlLipBtCt.scaleX"; +createNode animCurveTU -n "DELETE_NODE21_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt|malcolm1:grpLipBtCtSpaced|malcolm1:grp2Driven1LipBtCt|malcolm1:grp1Driven1LipBtCt|malcolm1:ctlLipBtCt.scaleY"; +createNode animCurveTU -n "DELETE_NODE21_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt|malcolm1:grpLipBtCtSpaced|malcolm1:grp2Driven1LipBtCt|malcolm1:grp1Driven1LipBtCt|malcolm1:ctlLipBtCt.scaleZ"; +createNode animCurveTA -n "DELETE_NODE21_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt|malcolm1:grpLipBtCtSpaced|malcolm1:grp2Driven1LipBtCt|malcolm1:grp1Driven1LipBtCt|malcolm1:ctlLipBtCt.rotateX"; +createNode animCurveTA -n "DELETE_NODE21_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt|malcolm1:grpLipBtCtSpaced|malcolm1:grp2Driven1LipBtCt|malcolm1:grp1Driven1LipBtCt|malcolm1:ctlLipBtCt.rotateY"; +createNode animCurveTA -n "DELETE_NODE21_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt|malcolm1:grpLipBtCtSpaced|malcolm1:grp2Driven1LipBtCt|malcolm1:grp1Driven1LipBtCt|malcolm1:ctlLipBtCt.rotateZ"; +createNode animCurveTL -n "DELETE_NODE22_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot.translateX"; +createNode animCurveTL -n "DELETE_NODE22_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot.translateY"; +createNode animCurveTL -n "DELETE_NODE22_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot.translateZ"; +createNode animCurveTU -n "DELETE_NODE22_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot.scaleX"; +createNode animCurveTU -n "DELETE_NODE22_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot.scaleY"; +createNode animCurveTU -n "DELETE_NODE22_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot.scaleZ"; +createNode animCurveTA -n "DELETE_NODE22_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot.rotateX"; +createNode animCurveTA -n "DELETE_NODE22_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot.rotateY"; +createNode animCurveTA -n "DELETE_NODE22_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot.rotateZ"; +createNode animCurveTL -n "DELETE_NODE23_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipTpSkin1Driven|malcolm1:ctlLipTp.translateX"; +createNode animCurveTL -n "DELETE_NODE23_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipTpSkin1Driven|malcolm1:ctlLipTp.translateY"; +createNode animCurveTL -n "DELETE_NODE23_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipTpSkin1Driven|malcolm1:ctlLipTp.translateZ"; +createNode animCurveTU -n "DELETE_NODE23_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipTpSkin1Driven|malcolm1:ctlLipTp.scaleX"; +createNode animCurveTU -n "DELETE_NODE23_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipTpSkin1Driven|malcolm1:ctlLipTp.scaleY"; +createNode animCurveTU -n "DELETE_NODE23_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipTpSkin1Driven|malcolm1:ctlLipTp.scaleZ"; +createNode animCurveTA -n "DELETE_NODE23_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipTpSkin1Driven|malcolm1:ctlLipTp.rotateX"; +createNode animCurveTA -n "DELETE_NODE23_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipTpSkin1Driven|malcolm1:ctlLipTp.rotateY"; +createNode animCurveTA -n "DELETE_NODE23_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipTpSkin1Driven|malcolm1:ctlLipTp.rotateZ"; +createNode animCurveTL -n "DELETE_NODE24_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp.translateX"; +createNode animCurveTL -n "DELETE_NODE24_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp.translateY"; +createNode animCurveTL -n "DELETE_NODE24_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp.translateZ"; +createNode animCurveTU -n "DELETE_NODE24_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp.scaleX"; +createNode animCurveTU -n "DELETE_NODE24_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp.scaleY"; +createNode animCurveTU -n "DELETE_NODE24_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp.scaleZ"; +createNode animCurveTA -n "DELETE_NODE24_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp.rotateX"; +createNode animCurveTA -n "DELETE_NODE24_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp.rotateY"; +createNode animCurveTA -n "DELETE_NODE24_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp.rotateZ"; +createNode animCurveTL -n "DELETE_NODE25_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp1Lf|malcolm1:ctlTeethTp1Lf.translateX"; +createNode animCurveTL -n "DELETE_NODE25_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp1Lf|malcolm1:ctlTeethTp1Lf.translateY"; +createNode animCurveTL -n "DELETE_NODE25_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp1Lf|malcolm1:ctlTeethTp1Lf.translateZ"; +createNode animCurveTU -n "DELETE_NODE25_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp1Lf|malcolm1:ctlTeethTp1Lf.scaleX"; +createNode animCurveTU -n "DELETE_NODE25_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp1Lf|malcolm1:ctlTeethTp1Lf.scaleY"; +createNode animCurveTU -n "DELETE_NODE25_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp1Lf|malcolm1:ctlTeethTp1Lf.scaleZ"; +createNode animCurveTA -n "DELETE_NODE25_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp1Lf|malcolm1:ctlTeethTp1Lf.rotateX"; +createNode animCurveTA -n "DELETE_NODE25_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp1Lf|malcolm1:ctlTeethTp1Lf.rotateY"; +createNode animCurveTA -n "DELETE_NODE25_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp1Lf|malcolm1:ctlTeethTp1Lf.rotateZ"; +createNode animCurveTL -n "DELETE_NODE26_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp1Rt|malcolm1:ctlTeethTp1Rt.translateX"; +createNode animCurveTL -n "DELETE_NODE26_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp1Rt|malcolm1:ctlTeethTp1Rt.translateY"; +createNode animCurveTL -n "DELETE_NODE26_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp1Rt|malcolm1:ctlTeethTp1Rt.translateZ"; +createNode animCurveTU -n "DELETE_NODE26_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp1Rt|malcolm1:ctlTeethTp1Rt.scaleX"; +createNode animCurveTU -n "DELETE_NODE26_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp1Rt|malcolm1:ctlTeethTp1Rt.scaleY"; +createNode animCurveTU -n "DELETE_NODE26_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp1Rt|malcolm1:ctlTeethTp1Rt.scaleZ"; +createNode animCurveTA -n "DELETE_NODE26_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp1Rt|malcolm1:ctlTeethTp1Rt.rotateX"; +createNode animCurveTA -n "DELETE_NODE26_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp1Rt|malcolm1:ctlTeethTp1Rt.rotateY"; +createNode animCurveTA -n "DELETE_NODE26_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp1Rt|malcolm1:ctlTeethTp1Rt.rotateZ"; +createNode animCurveTL -n "DELETE_NODE27_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp2Lf|malcolm1:ctlTeethTp2Lf.translateX"; +createNode animCurveTL -n "DELETE_NODE27_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp2Lf|malcolm1:ctlTeethTp2Lf.translateY"; +createNode animCurveTL -n "DELETE_NODE27_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp2Lf|malcolm1:ctlTeethTp2Lf.translateZ"; +createNode animCurveTU -n "DELETE_NODE27_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp2Lf|malcolm1:ctlTeethTp2Lf.scaleX"; +createNode animCurveTU -n "DELETE_NODE27_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp2Lf|malcolm1:ctlTeethTp2Lf.scaleY"; +createNode animCurveTU -n "DELETE_NODE27_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp2Lf|malcolm1:ctlTeethTp2Lf.scaleZ"; +createNode animCurveTA -n "DELETE_NODE27_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp2Lf|malcolm1:ctlTeethTp2Lf.rotateX"; +createNode animCurveTA -n "DELETE_NODE27_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp2Lf|malcolm1:ctlTeethTp2Lf.rotateY"; +createNode animCurveTA -n "DELETE_NODE27_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp2Lf|malcolm1:ctlTeethTp2Lf.rotateZ"; +createNode animCurveTL -n "DELETE_NODE28_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp2Rt|malcolm1:ctlTeethTp2Rt.translateX"; +createNode animCurveTL -n "DELETE_NODE28_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp2Rt|malcolm1:ctlTeethTp2Rt.translateY"; +createNode animCurveTL -n "DELETE_NODE28_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp2Rt|malcolm1:ctlTeethTp2Rt.translateZ"; +createNode animCurveTU -n "DELETE_NODE28_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp2Rt|malcolm1:ctlTeethTp2Rt.scaleX"; +createNode animCurveTU -n "DELETE_NODE28_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp2Rt|malcolm1:ctlTeethTp2Rt.scaleY"; +createNode animCurveTU -n "DELETE_NODE28_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp2Rt|malcolm1:ctlTeethTp2Rt.scaleZ"; +createNode animCurveTA -n "DELETE_NODE28_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp2Rt|malcolm1:ctlTeethTp2Rt.rotateX"; +createNode animCurveTA -n "DELETE_NODE28_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp2Rt|malcolm1:ctlTeethTp2Rt.rotateY"; +createNode animCurveTA -n "DELETE_NODE28_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp2Rt|malcolm1:ctlTeethTp2Rt.rotateZ"; +createNode animCurveTL -n "DELETE_NODE29_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTpCt|malcolm1:ctlTeethTpCt.translateX"; +createNode animCurveTL -n "DELETE_NODE29_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTpCt|malcolm1:ctlTeethTpCt.translateY"; +createNode animCurveTL -n "DELETE_NODE29_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTpCt|malcolm1:ctlTeethTpCt.translateZ"; +createNode animCurveTU -n "DELETE_NODE29_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTpCt|malcolm1:ctlTeethTpCt.scaleX"; +createNode animCurveTU -n "DELETE_NODE29_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTpCt|malcolm1:ctlTeethTpCt.scaleY"; +createNode animCurveTU -n "DELETE_NODE29_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTpCt|malcolm1:ctlTeethTpCt.scaleZ"; +createNode animCurveTA -n "DELETE_NODE29_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTpCt|malcolm1:ctlTeethTpCt.rotateX"; +createNode animCurveTA -n "DELETE_NODE29_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTpCt|malcolm1:ctlTeethTpCt.rotateY"; +createNode animCurveTA -n "DELETE_NODE29_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTpCt|malcolm1:ctlTeethTpCt.rotateZ"; +createNode animCurveTL -n "DELETE_NODE30_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTpUpper2Lf|malcolm1:ctlTeethTpUpper2Lf.translateX"; +createNode animCurveTL -n "DELETE_NODE30_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTpUpper2Lf|malcolm1:ctlTeethTpUpper2Lf.translateY"; +createNode animCurveTL -n "DELETE_NODE30_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTpUpper2Lf|malcolm1:ctlTeethTpUpper2Lf.translateZ"; +createNode animCurveTU -n "DELETE_NODE30_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTpUpper2Lf|malcolm1:ctlTeethTpUpper2Lf.scaleX"; +createNode animCurveTU -n "DELETE_NODE30_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTpUpper2Lf|malcolm1:ctlTeethTpUpper2Lf.scaleY"; +createNode animCurveTU -n "DELETE_NODE30_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTpUpper2Lf|malcolm1:ctlTeethTpUpper2Lf.scaleZ"; +createNode animCurveTA -n "DELETE_NODE30_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTpUpper2Lf|malcolm1:ctlTeethTpUpper2Lf.rotateX"; +createNode animCurveTA -n "DELETE_NODE30_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTpUpper2Lf|malcolm1:ctlTeethTpUpper2Lf.rotateY"; +createNode animCurveTA -n "DELETE_NODE30_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTpUpper2Lf|malcolm1:ctlTeethTpUpper2Lf.rotateZ"; +createNode animCurveTL -n "DELETE_NODE31_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTpUpper2Rt|malcolm1:ctlTeethTpUpper2Rt.translateX"; +createNode animCurveTL -n "DELETE_NODE31_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTpUpper2Rt|malcolm1:ctlTeethTpUpper2Rt.translateY"; +createNode animCurveTL -n "DELETE_NODE31_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTpUpper2Rt|malcolm1:ctlTeethTpUpper2Rt.translateZ"; +createNode animCurveTU -n "DELETE_NODE31_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTpUpper2Rt|malcolm1:ctlTeethTpUpper2Rt.scaleX"; +createNode animCurveTU -n "DELETE_NODE31_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTpUpper2Rt|malcolm1:ctlTeethTpUpper2Rt.scaleY"; +createNode animCurveTU -n "DELETE_NODE31_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTpUpper2Rt|malcolm1:ctlTeethTpUpper2Rt.scaleZ"; +createNode animCurveTA -n "DELETE_NODE31_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTpUpper2Rt|malcolm1:ctlTeethTpUpper2Rt.rotateX"; +createNode animCurveTA -n "DELETE_NODE31_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTpUpper2Rt|malcolm1:ctlTeethTpUpper2Rt.rotateY"; +createNode animCurveTA -n "DELETE_NODE31_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTpUpper2Rt|malcolm1:ctlTeethTpUpper2Rt.rotateZ"; +createNode animCurveTL -n "DELETE_NODE32_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:grpCheek1SpacedRt|malcolm1:ctlCheek1Rt.translateX"; +createNode animCurveTL -n "DELETE_NODE32_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:grpCheek1SpacedRt|malcolm1:ctlCheek1Rt.translateY"; +createNode animCurveTL -n "DELETE_NODE32_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:grpCheek1SpacedRt|malcolm1:ctlCheek1Rt.translateZ"; +createNode animCurveTU -n "DELETE_NODE32_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:grpCheek1SpacedRt|malcolm1:ctlCheek1Rt.scaleX"; +createNode animCurveTU -n "DELETE_NODE32_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:grpCheek1SpacedRt|malcolm1:ctlCheek1Rt.scaleY"; +createNode animCurveTU -n "DELETE_NODE32_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:grpCheek1SpacedRt|malcolm1:ctlCheek1Rt.scaleZ"; +createNode animCurveTA -n "DELETE_NODE32_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:grpCheek1SpacedRt|malcolm1:ctlCheek1Rt.rotateX"; +createNode animCurveTA -n "DELETE_NODE32_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:grpCheek1SpacedRt|malcolm1:ctlCheek1Rt.rotateY"; +createNode animCurveTA -n "DELETE_NODE32_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:grpCheek1SpacedRt|malcolm1:ctlCheek1Rt.rotateZ"; +createNode animCurveTU -n "DELETE_NODE32_puff"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:grpCheek1SpacedRt|malcolm1:ctlCheek1Rt.puff"; +createNode animCurveTL -n "DELETE_NODE33_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:grpCheek1SpacedLf|malcolm1:ctlCheek1Lf.translateX"; +createNode animCurveTL -n "DELETE_NODE33_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:grpCheek1SpacedLf|malcolm1:ctlCheek1Lf.translateY"; +createNode animCurveTL -n "DELETE_NODE33_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:grpCheek1SpacedLf|malcolm1:ctlCheek1Lf.translateZ"; +createNode animCurveTU -n "DELETE_NODE33_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:grpCheek1SpacedLf|malcolm1:ctlCheek1Lf.scaleX"; +createNode animCurveTU -n "DELETE_NODE33_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:grpCheek1SpacedLf|malcolm1:ctlCheek1Lf.scaleY"; +createNode animCurveTU -n "DELETE_NODE33_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:grpCheek1SpacedLf|malcolm1:ctlCheek1Lf.scaleZ"; +createNode animCurveTA -n "DELETE_NODE33_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:grpCheek1SpacedLf|malcolm1:ctlCheek1Lf.rotateX"; +createNode animCurveTA -n "DELETE_NODE33_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:grpCheek1SpacedLf|malcolm1:ctlCheek1Lf.rotateY"; +createNode animCurveTA -n "DELETE_NODE33_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:grpCheek1SpacedLf|malcolm1:ctlCheek1Lf.rotateZ"; +createNode animCurveTU -n "DELETE_NODE33_puff"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:grpCheek1SpacedLf|malcolm1:ctlCheek1Lf.puff"; +createNode animCurveTL -n "DELETE_NODE34_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:lipJointsSpacedRt_NeutralPose|malcolm1:lipJointsSpacedRt|malcolm1:grpLipTp2SpacedRt|malcolm1:grp2Driven1LipTp2Rt|malcolm1:grp1Driven1LipTp2Rt|malcolm1:ctlLipTp2Rt.translateX"; +createNode animCurveTL -n "DELETE_NODE34_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:lipJointsSpacedRt_NeutralPose|malcolm1:lipJointsSpacedRt|malcolm1:grpLipTp2SpacedRt|malcolm1:grp2Driven1LipTp2Rt|malcolm1:grp1Driven1LipTp2Rt|malcolm1:ctlLipTp2Rt.translateY"; +createNode animCurveTL -n "DELETE_NODE34_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:lipJointsSpacedRt_NeutralPose|malcolm1:lipJointsSpacedRt|malcolm1:grpLipTp2SpacedRt|malcolm1:grp2Driven1LipTp2Rt|malcolm1:grp1Driven1LipTp2Rt|malcolm1:ctlLipTp2Rt.translateZ"; +createNode animCurveTU -n "DELETE_NODE34_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:lipJointsSpacedRt_NeutralPose|malcolm1:lipJointsSpacedRt|malcolm1:grpLipTp2SpacedRt|malcolm1:grp2Driven1LipTp2Rt|malcolm1:grp1Driven1LipTp2Rt|malcolm1:ctlLipTp2Rt.scaleX"; +createNode animCurveTU -n "DELETE_NODE34_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:lipJointsSpacedRt_NeutralPose|malcolm1:lipJointsSpacedRt|malcolm1:grpLipTp2SpacedRt|malcolm1:grp2Driven1LipTp2Rt|malcolm1:grp1Driven1LipTp2Rt|malcolm1:ctlLipTp2Rt.scaleY"; +createNode animCurveTU -n "DELETE_NODE34_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:lipJointsSpacedRt_NeutralPose|malcolm1:lipJointsSpacedRt|malcolm1:grpLipTp2SpacedRt|malcolm1:grp2Driven1LipTp2Rt|malcolm1:grp1Driven1LipTp2Rt|malcolm1:ctlLipTp2Rt.scaleZ"; +createNode animCurveTA -n "DELETE_NODE34_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:lipJointsSpacedRt_NeutralPose|malcolm1:lipJointsSpacedRt|malcolm1:grpLipTp2SpacedRt|malcolm1:grp2Driven1LipTp2Rt|malcolm1:grp1Driven1LipTp2Rt|malcolm1:ctlLipTp2Rt.rotateX"; +createNode animCurveTA -n "DELETE_NODE34_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:lipJointsSpacedRt_NeutralPose|malcolm1:lipJointsSpacedRt|malcolm1:grpLipTp2SpacedRt|malcolm1:grp2Driven1LipTp2Rt|malcolm1:grp1Driven1LipTp2Rt|malcolm1:ctlLipTp2Rt.rotateY"; +createNode animCurveTA -n "DELETE_NODE34_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:lipJointsSpacedRt_NeutralPose|malcolm1:lipJointsSpacedRt|malcolm1:grpLipTp2SpacedRt|malcolm1:grp2Driven1LipTp2Rt|malcolm1:grp1Driven1LipTp2Rt|malcolm1:ctlLipTp2Rt.rotateZ"; +createNode animCurveTL -n "DELETE_NODE35_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp|malcolm1:grpLipTpCtSpaced|malcolm1:grp2Driven1LipTpCt|malcolm1:grp1Driven1LipTpCt|malcolm1:ctlLipTpCt.translateX"; +createNode animCurveTL -n "DELETE_NODE35_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp|malcolm1:grpLipTpCtSpaced|malcolm1:grp2Driven1LipTpCt|malcolm1:grp1Driven1LipTpCt|malcolm1:ctlLipTpCt.translateY"; +createNode animCurveTL -n "DELETE_NODE35_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp|malcolm1:grpLipTpCtSpaced|malcolm1:grp2Driven1LipTpCt|malcolm1:grp1Driven1LipTpCt|malcolm1:ctlLipTpCt.translateZ"; +createNode animCurveTU -n "DELETE_NODE35_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp|malcolm1:grpLipTpCtSpaced|malcolm1:grp2Driven1LipTpCt|malcolm1:grp1Driven1LipTpCt|malcolm1:ctlLipTpCt.scaleX"; +createNode animCurveTU -n "DELETE_NODE35_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp|malcolm1:grpLipTpCtSpaced|malcolm1:grp2Driven1LipTpCt|malcolm1:grp1Driven1LipTpCt|malcolm1:ctlLipTpCt.scaleY"; +createNode animCurveTU -n "DELETE_NODE35_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp|malcolm1:grpLipTpCtSpaced|malcolm1:grp2Driven1LipTpCt|malcolm1:grp1Driven1LipTpCt|malcolm1:ctlLipTpCt.scaleZ"; +createNode animCurveTA -n "DELETE_NODE35_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp|malcolm1:grpLipTpCtSpaced|malcolm1:grp2Driven1LipTpCt|malcolm1:grp1Driven1LipTpCt|malcolm1:ctlLipTpCt.rotateX"; +createNode animCurveTA -n "DELETE_NODE35_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp|malcolm1:grpLipTpCtSpaced|malcolm1:grp2Driven1LipTpCt|malcolm1:grp1Driven1LipTpCt|malcolm1:ctlLipTpCt.rotateY"; +createNode animCurveTA -n "DELETE_NODE35_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp|malcolm1:grpLipTpCtSpaced|malcolm1:grp2Driven1LipTpCt|malcolm1:grp1Driven1LipTpCt|malcolm1:ctlLipTpCt.rotateZ"; +createNode animCurveTL -n "DELETE_NODE36_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp|malcolm1:grpLipTp1SpacedLf|malcolm1:grp2Driven1LipTp1Lf|malcolm1:grp1Driven1LipTp1Lf|malcolm1:ctlLipTp1Lf.translateX"; +createNode animCurveTL -n "DELETE_NODE36_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp|malcolm1:grpLipTp1SpacedLf|malcolm1:grp2Driven1LipTp1Lf|malcolm1:grp1Driven1LipTp1Lf|malcolm1:ctlLipTp1Lf.translateY"; +createNode animCurveTL -n "DELETE_NODE36_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp|malcolm1:grpLipTp1SpacedLf|malcolm1:grp2Driven1LipTp1Lf|malcolm1:grp1Driven1LipTp1Lf|malcolm1:ctlLipTp1Lf.translateZ"; +createNode animCurveTU -n "DELETE_NODE36_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp|malcolm1:grpLipTp1SpacedLf|malcolm1:grp2Driven1LipTp1Lf|malcolm1:grp1Driven1LipTp1Lf|malcolm1:ctlLipTp1Lf.scaleX"; +createNode animCurveTU -n "DELETE_NODE36_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp|malcolm1:grpLipTp1SpacedLf|malcolm1:grp2Driven1LipTp1Lf|malcolm1:grp1Driven1LipTp1Lf|malcolm1:ctlLipTp1Lf.scaleY"; +createNode animCurveTU -n "DELETE_NODE36_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp|malcolm1:grpLipTp1SpacedLf|malcolm1:grp2Driven1LipTp1Lf|malcolm1:grp1Driven1LipTp1Lf|malcolm1:ctlLipTp1Lf.scaleZ"; +createNode animCurveTA -n "DELETE_NODE36_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp|malcolm1:grpLipTp1SpacedLf|malcolm1:grp2Driven1LipTp1Lf|malcolm1:grp1Driven1LipTp1Lf|malcolm1:ctlLipTp1Lf.rotateX"; +createNode animCurveTA -n "DELETE_NODE36_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp|malcolm1:grpLipTp1SpacedLf|malcolm1:grp2Driven1LipTp1Lf|malcolm1:grp1Driven1LipTp1Lf|malcolm1:ctlLipTp1Lf.rotateY"; +createNode animCurveTA -n "DELETE_NODE36_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp|malcolm1:grpLipTp1SpacedLf|malcolm1:grp2Driven1LipTp1Lf|malcolm1:grp1Driven1LipTp1Lf|malcolm1:ctlLipTp1Lf.rotateZ"; +createNode animCurveTL -n "DELETE_NODE37_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp|malcolm1:grpLipTp1SpacedRt|malcolm1:grp2Driven1LipTp1Rt|malcolm1:grp1Driven1LipTp1Rt|malcolm1:ctlLipTp1Rt.translateX"; +createNode animCurveTL -n "DELETE_NODE37_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp|malcolm1:grpLipTp1SpacedRt|malcolm1:grp2Driven1LipTp1Rt|malcolm1:grp1Driven1LipTp1Rt|malcolm1:ctlLipTp1Rt.translateY"; +createNode animCurveTL -n "DELETE_NODE37_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp|malcolm1:grpLipTp1SpacedRt|malcolm1:grp2Driven1LipTp1Rt|malcolm1:grp1Driven1LipTp1Rt|malcolm1:ctlLipTp1Rt.translateZ"; +createNode animCurveTU -n "DELETE_NODE37_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp|malcolm1:grpLipTp1SpacedRt|malcolm1:grp2Driven1LipTp1Rt|malcolm1:grp1Driven1LipTp1Rt|malcolm1:ctlLipTp1Rt.scaleX"; +createNode animCurveTU -n "DELETE_NODE37_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp|malcolm1:grpLipTp1SpacedRt|malcolm1:grp2Driven1LipTp1Rt|malcolm1:grp1Driven1LipTp1Rt|malcolm1:ctlLipTp1Rt.scaleY"; +createNode animCurveTU -n "DELETE_NODE37_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp|malcolm1:grpLipTp1SpacedRt|malcolm1:grp2Driven1LipTp1Rt|malcolm1:grp1Driven1LipTp1Rt|malcolm1:ctlLipTp1Rt.scaleZ"; +createNode animCurveTA -n "DELETE_NODE37_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp|malcolm1:grpLipTp1SpacedRt|malcolm1:grp2Driven1LipTp1Rt|malcolm1:grp1Driven1LipTp1Rt|malcolm1:ctlLipTp1Rt.rotateX"; +createNode animCurveTA -n "DELETE_NODE37_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp|malcolm1:grpLipTp1SpacedRt|malcolm1:grp2Driven1LipTp1Rt|malcolm1:grp1Driven1LipTp1Rt|malcolm1:ctlLipTp1Rt.rotateY"; +createNode animCurveTA -n "DELETE_NODE37_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp|malcolm1:grpLipTp1SpacedRt|malcolm1:grp2Driven1LipTp1Rt|malcolm1:grp1Driven1LipTp1Rt|malcolm1:ctlLipTp1Rt.rotateZ"; +createNode animCurveTU -n "DELETE_NODE38_md"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp.md"; +createNode animCurveTU -n "DELETE_NODE38_funnel"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp.funnel"; +createNode animCurveTL -n "DELETE_NODE38_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp.translateX"; +createNode animCurveTL -n "DELETE_NODE38_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0.027074020754017242 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp.translateY"; +createNode animCurveTL -n "DELETE_NODE38_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 -0.0057109771758436824 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp.translateZ"; +createNode animCurveTU -n "DELETE_NODE38_thicknessY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp.thicknessY"; +createNode animCurveTU -n "DELETE_NODE38_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp.scaleX"; +createNode animCurveTU -n "DELETE_NODE38_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp.scaleY"; +createNode animCurveTU -n "DELETE_NODE38_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp.scaleZ"; +createNode animCurveTA -n "DELETE_NODE38_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 -11.911318607773504 6 18.007232567490711 + 10 18.007232567490711; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp.rotateX"; +createNode animCurveTA -n "DELETE_NODE38_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp.rotateY"; +createNode animCurveTA -n "DELETE_NODE38_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp.rotateZ"; +createNode animCurveTU -n "DELETE_NODE38_peak"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp.peak"; +createNode animCurveTU -n "DELETE_NODE38_press"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp.press"; +createNode animCurveTU -n "DELETE_NODE38_puff"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp.puff"; +createNode animCurveTU -n "DELETE_NODE38_thicknessZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp.thicknessZ"; +createNode animCurveTL -n "DELETE_NODE39_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll.translateX"; +createNode animCurveTL -n "DELETE_NODE39_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll.translateY"; +createNode animCurveTL -n "DELETE_NODE39_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll.translateZ"; +createNode animCurveTU -n "DELETE_NODE39_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll.scaleX"; +createNode animCurveTU -n "DELETE_NODE39_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll.scaleY"; +createNode animCurveTU -n "DELETE_NODE39_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll.scaleZ"; +createNode animCurveTA -n "DELETE_NODE39_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll.rotateX"; +createNode animCurveTA -n "DELETE_NODE39_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll.rotateY"; +createNode animCurveTA -n "DELETE_NODE39_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll.rotateZ"; +createNode animCurveTL -n "DELETE_NODE40_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipTp2SpacedLf|malcolm1:grp2Driven1LipTp2Lf|malcolm1:grp1Driven1LipTp2Lf|malcolm1:ctlLipTp2Lf.translateX"; +createNode animCurveTL -n "DELETE_NODE40_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipTp2SpacedLf|malcolm1:grp2Driven1LipTp2Lf|malcolm1:grp1Driven1LipTp2Lf|malcolm1:ctlLipTp2Lf.translateY"; +createNode animCurveTL -n "DELETE_NODE40_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipTp2SpacedLf|malcolm1:grp2Driven1LipTp2Lf|malcolm1:grp1Driven1LipTp2Lf|malcolm1:ctlLipTp2Lf.translateZ"; +createNode animCurveTU -n "DELETE_NODE40_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipTp2SpacedLf|malcolm1:grp2Driven1LipTp2Lf|malcolm1:grp1Driven1LipTp2Lf|malcolm1:ctlLipTp2Lf.scaleX"; +createNode animCurveTU -n "DELETE_NODE40_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipTp2SpacedLf|malcolm1:grp2Driven1LipTp2Lf|malcolm1:grp1Driven1LipTp2Lf|malcolm1:ctlLipTp2Lf.scaleY"; +createNode animCurveTU -n "DELETE_NODE40_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipTp2SpacedLf|malcolm1:grp2Driven1LipTp2Lf|malcolm1:grp1Driven1LipTp2Lf|malcolm1:ctlLipTp2Lf.scaleZ"; +createNode animCurveTA -n "DELETE_NODE40_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipTp2SpacedLf|malcolm1:grp2Driven1LipTp2Lf|malcolm1:grp1Driven1LipTp2Lf|malcolm1:ctlLipTp2Lf.rotateX"; +createNode animCurveTA -n "DELETE_NODE40_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipTp2SpacedLf|malcolm1:grp2Driven1LipTp2Lf|malcolm1:grp1Driven1LipTp2Lf|malcolm1:ctlLipTp2Lf.rotateY"; +createNode animCurveTA -n "DELETE_NODE40_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipTp2SpacedLf|malcolm1:grp2Driven1LipTp2Lf|malcolm1:grp1Driven1LipTp2Lf|malcolm1:ctlLipTp2Lf.rotateZ"; +createNode animCurveTL -n "DELETE_NODE41_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipJointsSpacedLf|malcolm1:grpLipCrnSpacedLf|malcolm1:grp2Driven1LipCrnLf|malcolm1:grp1Driven1LipCrnLf|malcolm1:ctlLipCrnLf|malcolm1:grpLipCrnBtSpacedLf|malcolm1:ctlLipCrnBtLf.translateX"; +createNode animCurveTL -n "DELETE_NODE41_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipJointsSpacedLf|malcolm1:grpLipCrnSpacedLf|malcolm1:grp2Driven1LipCrnLf|malcolm1:grp1Driven1LipCrnLf|malcolm1:ctlLipCrnLf|malcolm1:grpLipCrnBtSpacedLf|malcolm1:ctlLipCrnBtLf.translateY"; +createNode animCurveTL -n "DELETE_NODE41_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipJointsSpacedLf|malcolm1:grpLipCrnSpacedLf|malcolm1:grp2Driven1LipCrnLf|malcolm1:grp1Driven1LipCrnLf|malcolm1:ctlLipCrnLf|malcolm1:grpLipCrnBtSpacedLf|malcolm1:ctlLipCrnBtLf.translateZ"; +createNode animCurveTU -n "DELETE_NODE41_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipJointsSpacedLf|malcolm1:grpLipCrnSpacedLf|malcolm1:grp2Driven1LipCrnLf|malcolm1:grp1Driven1LipCrnLf|malcolm1:ctlLipCrnLf|malcolm1:grpLipCrnBtSpacedLf|malcolm1:ctlLipCrnBtLf.scaleX"; +createNode animCurveTU -n "DELETE_NODE41_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipJointsSpacedLf|malcolm1:grpLipCrnSpacedLf|malcolm1:grp2Driven1LipCrnLf|malcolm1:grp1Driven1LipCrnLf|malcolm1:ctlLipCrnLf|malcolm1:grpLipCrnBtSpacedLf|malcolm1:ctlLipCrnBtLf.scaleY"; +createNode animCurveTU -n "DELETE_NODE41_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipJointsSpacedLf|malcolm1:grpLipCrnSpacedLf|malcolm1:grp2Driven1LipCrnLf|malcolm1:grp1Driven1LipCrnLf|malcolm1:ctlLipCrnLf|malcolm1:grpLipCrnBtSpacedLf|malcolm1:ctlLipCrnBtLf.scaleZ"; +createNode animCurveTA -n "DELETE_NODE41_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipJointsSpacedLf|malcolm1:grpLipCrnSpacedLf|malcolm1:grp2Driven1LipCrnLf|malcolm1:grp1Driven1LipCrnLf|malcolm1:ctlLipCrnLf|malcolm1:grpLipCrnBtSpacedLf|malcolm1:ctlLipCrnBtLf.rotateX"; +createNode animCurveTA -n "DELETE_NODE41_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipJointsSpacedLf|malcolm1:grpLipCrnSpacedLf|malcolm1:grp2Driven1LipCrnLf|malcolm1:grp1Driven1LipCrnLf|malcolm1:ctlLipCrnLf|malcolm1:grpLipCrnBtSpacedLf|malcolm1:ctlLipCrnBtLf.rotateY"; +createNode animCurveTA -n "DELETE_NODE41_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipJointsSpacedLf|malcolm1:grpLipCrnSpacedLf|malcolm1:grp2Driven1LipCrnLf|malcolm1:grp1Driven1LipCrnLf|malcolm1:ctlLipCrnLf|malcolm1:grpLipCrnBtSpacedLf|malcolm1:ctlLipCrnBtLf.rotateZ"; +createNode animCurveTL -n "DELETE_NODE42_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipJointsSpacedLf|malcolm1:grpLipCrnSpacedLf|malcolm1:grp2Driven1LipCrnLf|malcolm1:grp1Driven1LipCrnLf|malcolm1:ctlLipCrnLf|malcolm1:grpLipCrnTpSpacedLf|malcolm1:ctlLipCrnTpLf.translateX"; +createNode animCurveTL -n "DELETE_NODE42_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipJointsSpacedLf|malcolm1:grpLipCrnSpacedLf|malcolm1:grp2Driven1LipCrnLf|malcolm1:grp1Driven1LipCrnLf|malcolm1:ctlLipCrnLf|malcolm1:grpLipCrnTpSpacedLf|malcolm1:ctlLipCrnTpLf.translateY"; +createNode animCurveTL -n "DELETE_NODE42_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipJointsSpacedLf|malcolm1:grpLipCrnSpacedLf|malcolm1:grp2Driven1LipCrnLf|malcolm1:grp1Driven1LipCrnLf|malcolm1:ctlLipCrnLf|malcolm1:grpLipCrnTpSpacedLf|malcolm1:ctlLipCrnTpLf.translateZ"; +createNode animCurveTU -n "DELETE_NODE42_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipJointsSpacedLf|malcolm1:grpLipCrnSpacedLf|malcolm1:grp2Driven1LipCrnLf|malcolm1:grp1Driven1LipCrnLf|malcolm1:ctlLipCrnLf|malcolm1:grpLipCrnTpSpacedLf|malcolm1:ctlLipCrnTpLf.scaleX"; +createNode animCurveTU -n "DELETE_NODE42_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipJointsSpacedLf|malcolm1:grpLipCrnSpacedLf|malcolm1:grp2Driven1LipCrnLf|malcolm1:grp1Driven1LipCrnLf|malcolm1:ctlLipCrnLf|malcolm1:grpLipCrnTpSpacedLf|malcolm1:ctlLipCrnTpLf.scaleY"; +createNode animCurveTU -n "DELETE_NODE42_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipJointsSpacedLf|malcolm1:grpLipCrnSpacedLf|malcolm1:grp2Driven1LipCrnLf|malcolm1:grp1Driven1LipCrnLf|malcolm1:ctlLipCrnLf|malcolm1:grpLipCrnTpSpacedLf|malcolm1:ctlLipCrnTpLf.scaleZ"; +createNode animCurveTA -n "DELETE_NODE42_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipJointsSpacedLf|malcolm1:grpLipCrnSpacedLf|malcolm1:grp2Driven1LipCrnLf|malcolm1:grp1Driven1LipCrnLf|malcolm1:ctlLipCrnLf|malcolm1:grpLipCrnTpSpacedLf|malcolm1:ctlLipCrnTpLf.rotateX"; +createNode animCurveTA -n "DELETE_NODE42_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipJointsSpacedLf|malcolm1:grpLipCrnSpacedLf|malcolm1:grp2Driven1LipCrnLf|malcolm1:grp1Driven1LipCrnLf|malcolm1:ctlLipCrnLf|malcolm1:grpLipCrnTpSpacedLf|malcolm1:ctlLipCrnTpLf.rotateY"; +createNode animCurveTA -n "DELETE_NODE42_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipJointsSpacedLf|malcolm1:grpLipCrnSpacedLf|malcolm1:grp2Driven1LipCrnLf|malcolm1:grp1Driven1LipCrnLf|malcolm1:ctlLipCrnLf|malcolm1:grpLipCrnTpSpacedLf|malcolm1:ctlLipCrnTpLf.rotateZ"; +createNode animCurveTL -n "DELETE_NODE43_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipJointsSpacedLf|malcolm1:grpLipCrnSpacedLf|malcolm1:grp2Driven1LipCrnLf|malcolm1:grp1Driven1LipCrnLf|malcolm1:ctlLipCrnLf.translateX"; +createNode animCurveTL -n "DELETE_NODE43_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipJointsSpacedLf|malcolm1:grpLipCrnSpacedLf|malcolm1:grp2Driven1LipCrnLf|malcolm1:grp1Driven1LipCrnLf|malcolm1:ctlLipCrnLf.translateY"; +createNode animCurveTL -n "DELETE_NODE43_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipJointsSpacedLf|malcolm1:grpLipCrnSpacedLf|malcolm1:grp2Driven1LipCrnLf|malcolm1:grp1Driven1LipCrnLf|malcolm1:ctlLipCrnLf.translateZ"; +createNode animCurveTU -n "DELETE_NODE43_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipJointsSpacedLf|malcolm1:grpLipCrnSpacedLf|malcolm1:grp2Driven1LipCrnLf|malcolm1:grp1Driven1LipCrnLf|malcolm1:ctlLipCrnLf.scaleX"; +createNode animCurveTU -n "DELETE_NODE43_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipJointsSpacedLf|malcolm1:grpLipCrnSpacedLf|malcolm1:grp2Driven1LipCrnLf|malcolm1:grp1Driven1LipCrnLf|malcolm1:ctlLipCrnLf.scaleY"; +createNode animCurveTU -n "DELETE_NODE43_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipJointsSpacedLf|malcolm1:grpLipCrnSpacedLf|malcolm1:grp2Driven1LipCrnLf|malcolm1:grp1Driven1LipCrnLf|malcolm1:ctlLipCrnLf.scaleZ"; +createNode animCurveTA -n "DELETE_NODE43_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipJointsSpacedLf|malcolm1:grpLipCrnSpacedLf|malcolm1:grp2Driven1LipCrnLf|malcolm1:grp1Driven1LipCrnLf|malcolm1:ctlLipCrnLf.rotateX"; +createNode animCurveTA -n "DELETE_NODE43_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipJointsSpacedLf|malcolm1:grpLipCrnSpacedLf|malcolm1:grp2Driven1LipCrnLf|malcolm1:grp1Driven1LipCrnLf|malcolm1:ctlLipCrnLf.rotateY"; +createNode animCurveTA -n "DELETE_NODE43_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipJointsSpacedLf|malcolm1:grpLipCrnSpacedLf|malcolm1:grp2Driven1LipCrnLf|malcolm1:grp1Driven1LipCrnLf|malcolm1:ctlLipCrnLf.rotateZ"; +createNode animCurveTL -n "DELETE_NODE44_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipCrnSpacedRt|malcolm1:grp2Driven1LipCrnRt|malcolm1:grp1Driven1LipCrnRt|malcolm1:ctlLipCrnRt|malcolm1:grpLipCrnTpSpacedRt|malcolm1:ctlLipCrnTpRt.translateX"; +createNode animCurveTL -n "DELETE_NODE44_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipCrnSpacedRt|malcolm1:grp2Driven1LipCrnRt|malcolm1:grp1Driven1LipCrnRt|malcolm1:ctlLipCrnRt|malcolm1:grpLipCrnTpSpacedRt|malcolm1:ctlLipCrnTpRt.translateY"; +createNode animCurveTL -n "DELETE_NODE44_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipCrnSpacedRt|malcolm1:grp2Driven1LipCrnRt|malcolm1:grp1Driven1LipCrnRt|malcolm1:ctlLipCrnRt|malcolm1:grpLipCrnTpSpacedRt|malcolm1:ctlLipCrnTpRt.translateZ"; +createNode animCurveTU -n "DELETE_NODE44_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipCrnSpacedRt|malcolm1:grp2Driven1LipCrnRt|malcolm1:grp1Driven1LipCrnRt|malcolm1:ctlLipCrnRt|malcolm1:grpLipCrnTpSpacedRt|malcolm1:ctlLipCrnTpRt.scaleX"; +createNode animCurveTU -n "DELETE_NODE44_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipCrnSpacedRt|malcolm1:grp2Driven1LipCrnRt|malcolm1:grp1Driven1LipCrnRt|malcolm1:ctlLipCrnRt|malcolm1:grpLipCrnTpSpacedRt|malcolm1:ctlLipCrnTpRt.scaleY"; +createNode animCurveTU -n "DELETE_NODE44_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipCrnSpacedRt|malcolm1:grp2Driven1LipCrnRt|malcolm1:grp1Driven1LipCrnRt|malcolm1:ctlLipCrnRt|malcolm1:grpLipCrnTpSpacedRt|malcolm1:ctlLipCrnTpRt.scaleZ"; +createNode animCurveTA -n "DELETE_NODE44_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipCrnSpacedRt|malcolm1:grp2Driven1LipCrnRt|malcolm1:grp1Driven1LipCrnRt|malcolm1:ctlLipCrnRt|malcolm1:grpLipCrnTpSpacedRt|malcolm1:ctlLipCrnTpRt.rotateX"; +createNode animCurveTA -n "DELETE_NODE44_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipCrnSpacedRt|malcolm1:grp2Driven1LipCrnRt|malcolm1:grp1Driven1LipCrnRt|malcolm1:ctlLipCrnRt|malcolm1:grpLipCrnTpSpacedRt|malcolm1:ctlLipCrnTpRt.rotateY"; +createNode animCurveTA -n "DELETE_NODE44_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipCrnSpacedRt|malcolm1:grp2Driven1LipCrnRt|malcolm1:grp1Driven1LipCrnRt|malcolm1:ctlLipCrnRt|malcolm1:grpLipCrnTpSpacedRt|malcolm1:ctlLipCrnTpRt.rotateZ"; +createNode animCurveTL -n "DELETE_NODE45_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipCrnSpacedRt|malcolm1:grp2Driven1LipCrnRt|malcolm1:grp1Driven1LipCrnRt|malcolm1:ctlLipCrnRt|malcolm1:grpLipCrnBtSpacedRt|malcolm1:ctlLipCrnBtRt.translateX"; +createNode animCurveTL -n "DELETE_NODE45_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipCrnSpacedRt|malcolm1:grp2Driven1LipCrnRt|malcolm1:grp1Driven1LipCrnRt|malcolm1:ctlLipCrnRt|malcolm1:grpLipCrnBtSpacedRt|malcolm1:ctlLipCrnBtRt.translateY"; +createNode animCurveTL -n "DELETE_NODE45_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipCrnSpacedRt|malcolm1:grp2Driven1LipCrnRt|malcolm1:grp1Driven1LipCrnRt|malcolm1:ctlLipCrnRt|malcolm1:grpLipCrnBtSpacedRt|malcolm1:ctlLipCrnBtRt.translateZ"; +createNode animCurveTU -n "DELETE_NODE45_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipCrnSpacedRt|malcolm1:grp2Driven1LipCrnRt|malcolm1:grp1Driven1LipCrnRt|malcolm1:ctlLipCrnRt|malcolm1:grpLipCrnBtSpacedRt|malcolm1:ctlLipCrnBtRt.scaleX"; +createNode animCurveTU -n "DELETE_NODE45_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipCrnSpacedRt|malcolm1:grp2Driven1LipCrnRt|malcolm1:grp1Driven1LipCrnRt|malcolm1:ctlLipCrnRt|malcolm1:grpLipCrnBtSpacedRt|malcolm1:ctlLipCrnBtRt.scaleY"; +createNode animCurveTU -n "DELETE_NODE45_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipCrnSpacedRt|malcolm1:grp2Driven1LipCrnRt|malcolm1:grp1Driven1LipCrnRt|malcolm1:ctlLipCrnRt|malcolm1:grpLipCrnBtSpacedRt|malcolm1:ctlLipCrnBtRt.scaleZ"; +createNode animCurveTA -n "DELETE_NODE45_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipCrnSpacedRt|malcolm1:grp2Driven1LipCrnRt|malcolm1:grp1Driven1LipCrnRt|malcolm1:ctlLipCrnRt|malcolm1:grpLipCrnBtSpacedRt|malcolm1:ctlLipCrnBtRt.rotateX"; +createNode animCurveTA -n "DELETE_NODE45_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipCrnSpacedRt|malcolm1:grp2Driven1LipCrnRt|malcolm1:grp1Driven1LipCrnRt|malcolm1:ctlLipCrnRt|malcolm1:grpLipCrnBtSpacedRt|malcolm1:ctlLipCrnBtRt.rotateY"; +createNode animCurveTA -n "DELETE_NODE45_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipCrnSpacedRt|malcolm1:grp2Driven1LipCrnRt|malcolm1:grp1Driven1LipCrnRt|malcolm1:ctlLipCrnRt|malcolm1:grpLipCrnBtSpacedRt|malcolm1:ctlLipCrnBtRt.rotateZ"; +createNode animCurveTL -n "DELETE_NODE46_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipCrnSpacedRt|malcolm1:grp2Driven1LipCrnRt|malcolm1:grp1Driven1LipCrnRt|malcolm1:ctlLipCrnRt.translateX"; +createNode animCurveTL -n "DELETE_NODE46_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipCrnSpacedRt|malcolm1:grp2Driven1LipCrnRt|malcolm1:grp1Driven1LipCrnRt|malcolm1:ctlLipCrnRt.translateY"; +createNode animCurveTL -n "DELETE_NODE46_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipCrnSpacedRt|malcolm1:grp2Driven1LipCrnRt|malcolm1:grp1Driven1LipCrnRt|malcolm1:ctlLipCrnRt.translateZ"; +createNode animCurveTU -n "DELETE_NODE46_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipCrnSpacedRt|malcolm1:grp2Driven1LipCrnRt|malcolm1:grp1Driven1LipCrnRt|malcolm1:ctlLipCrnRt.scaleX"; +createNode animCurveTU -n "DELETE_NODE46_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipCrnSpacedRt|malcolm1:grp2Driven1LipCrnRt|malcolm1:grp1Driven1LipCrnRt|malcolm1:ctlLipCrnRt.scaleY"; +createNode animCurveTU -n "DELETE_NODE46_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipCrnSpacedRt|malcolm1:grp2Driven1LipCrnRt|malcolm1:grp1Driven1LipCrnRt|malcolm1:ctlLipCrnRt.scaleZ"; +createNode animCurveTA -n "DELETE_NODE46_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipCrnSpacedRt|malcolm1:grp2Driven1LipCrnRt|malcolm1:grp1Driven1LipCrnRt|malcolm1:ctlLipCrnRt.rotateX"; +createNode animCurveTA -n "DELETE_NODE46_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipCrnSpacedRt|malcolm1:grp2Driven1LipCrnRt|malcolm1:grp1Driven1LipCrnRt|malcolm1:ctlLipCrnRt.rotateY"; +createNode animCurveTA -n "DELETE_NODE46_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipCrnSpacedRt|malcolm1:grp2Driven1LipCrnRt|malcolm1:grp1Driven1LipCrnRt|malcolm1:ctlLipCrnRt.rotateZ"; +createNode animCurveTL -n "DELETE_NODE47_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt.translateX"; +createNode animCurveTL -n "DELETE_NODE47_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt.translateY"; +createNode animCurveTL -n "DELETE_NODE47_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt.translateZ"; +createNode animCurveTU -n "DELETE_NODE47_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt.scaleX"; +createNode animCurveTU -n "DELETE_NODE47_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt.scaleY"; +createNode animCurveTU -n "DELETE_NODE47_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt.scaleZ"; +createNode animCurveTA -n "DELETE_NODE47_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt.rotateX"; +createNode animCurveTA -n "DELETE_NODE47_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt.rotateY"; +createNode animCurveTA -n "DELETE_NODE47_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt.rotateZ"; +createNode animCurveTL -n "DELETE_NODE48_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNose|malcolm1:ctlNose1.translateX"; +createNode animCurveTL -n "DELETE_NODE48_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNose|malcolm1:ctlNose1.translateY"; +createNode animCurveTL -n "DELETE_NODE48_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNose|malcolm1:ctlNose1.translateZ"; +createNode animCurveTU -n "DELETE_NODE48_noseBrowCrunch"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNose|malcolm1:ctlNose1.noseBrowCrunch"; +createNode animCurveTU -n "DELETE_NODE48_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNose|malcolm1:ctlNose1.scaleX"; +createNode animCurveTU -n "DELETE_NODE48_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNose|malcolm1:ctlNose1.scaleY"; +createNode animCurveTU -n "DELETE_NODE48_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNose|malcolm1:ctlNose1.scaleZ"; +createNode animCurveTA -n "DELETE_NODE48_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 7.3329886924191845 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNose|malcolm1:ctlNose1.rotateX"; +createNode animCurveTA -n "DELETE_NODE48_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 1.9135552963620606 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNose|malcolm1:ctlNose1.rotateY"; +createNode animCurveTA -n "DELETE_NODE48_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 1.3626335147650102 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNose|malcolm1:ctlNose1.rotateZ"; +createNode animCurveTL -n "DELETE_NODE49_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0.026292450592984858 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNoseLf|malcolm1:ctlNoseLf.translateX"; +createNode animCurveTL -n "DELETE_NODE49_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0.10532761562485417 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNoseLf|malcolm1:ctlNoseLf.translateY"; +createNode animCurveTL -n "DELETE_NODE49_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNoseLf|malcolm1:ctlNoseLf.translateZ"; +createNode animCurveTU -n "DELETE_NODE49_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNoseLf|malcolm1:ctlNoseLf.scaleX"; +createNode animCurveTU -n "DELETE_NODE49_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNoseLf|malcolm1:ctlNoseLf.scaleY"; +createNode animCurveTU -n "DELETE_NODE49_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNoseLf|malcolm1:ctlNoseLf.scaleZ"; +createNode animCurveTA -n "DELETE_NODE49_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNoseLf|malcolm1:ctlNoseLf.rotateX"; +createNode animCurveTA -n "DELETE_NODE49_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNoseLf|malcolm1:ctlNoseLf.rotateY"; +createNode animCurveTA -n "DELETE_NODE49_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNoseLf|malcolm1:ctlNoseLf.rotateZ"; +createNode animCurveTL -n "DELETE_NODE50_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNoseRt|malcolm1:ctlNoseRt.translateX"; +createNode animCurveTL -n "DELETE_NODE50_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNoseRt|malcolm1:ctlNoseRt.translateY"; +createNode animCurveTL -n "DELETE_NODE50_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNoseRt|malcolm1:ctlNoseRt.translateZ"; +createNode animCurveTU -n "DELETE_NODE50_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNoseRt|malcolm1:ctlNoseRt.scaleX"; +createNode animCurveTU -n "DELETE_NODE50_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNoseRt|malcolm1:ctlNoseRt.scaleY"; +createNode animCurveTU -n "DELETE_NODE50_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNoseRt|malcolm1:ctlNoseRt.scaleZ"; +createNode animCurveTA -n "DELETE_NODE50_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNoseRt|malcolm1:ctlNoseRt.rotateX"; +createNode animCurveTA -n "DELETE_NODE50_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNoseRt|malcolm1:ctlNoseRt.rotateY"; +createNode animCurveTA -n "DELETE_NODE50_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNoseRt|malcolm1:ctlNoseRt.rotateZ"; +createNode animCurveTU -n "DELETE_NODE51_nasoCrease"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerRt|malcolm1:ctlCornerRt.nasoCrease"; +createNode animCurveTU -n "DELETE_NODE51_cornerHeight"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerRt|malcolm1:ctlCornerRt.cornerHeight"; +createNode animCurveTL -n "DELETE_NODE51_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 1.0559747460952333 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerRt|malcolm1:ctlCornerRt.translateX"; +createNode animCurveTL -n "DELETE_NODE51_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 -0.41604976362508006 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerRt|malcolm1:ctlCornerRt.translateY"; +createNode animCurveTL -n "DELETE_NODE51_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerRt|malcolm1:ctlCornerRt.translateZ"; +createNode animCurveTA -n "DELETE_NODE51_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerRt|malcolm1:ctlCornerRt.rotateY"; +createNode animCurveTU -n "DELETE_NODE51_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerRt|malcolm1:ctlCornerRt.scaleX"; +createNode animCurveTU -n "DELETE_NODE51_pucker"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerRt|malcolm1:ctlCornerRt.pucker"; +createNode animCurveTU -n "DELETE_NODE51_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerRt|malcolm1:ctlCornerRt.scaleY"; +createNode animCurveTU -n "DELETE_NODE51_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerRt|malcolm1:ctlCornerRt.scaleZ"; +createNode animCurveTA -n "DELETE_NODE51_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerRt|malcolm1:ctlCornerRt.rotateX"; +createNode animCurveTU -n "DELETE_NODE51_cornerPinchIn"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerRt|malcolm1:ctlCornerRt.cornerPinchIn"; +createNode animCurveTA -n "DELETE_NODE51_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerRt|malcolm1:ctlCornerRt.rotateZ"; +createNode animCurveTU -n "DELETE_NODE51_disableAutoPucker"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerRt|malcolm1:ctlCornerRt.disableAutoPucker"; +createNode animCurveTU -n "DELETE_NODE51_cornerPinchOt"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerRt|malcolm1:ctlCornerRt.cornerPinchOt"; +createNode animCurveTU -n "DELETE_NODE52_nasoCrease"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerLf|malcolm1:ctlCornerLf.nasoCrease"; +createNode animCurveTU -n "DELETE_NODE52_cornerHeight"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerLf|malcolm1:ctlCornerLf.cornerHeight"; +createNode animCurveTL -n "DELETE_NODE52_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 1.0559747460952331 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerLf|malcolm1:ctlCornerLf.translateX"; +createNode animCurveTL -n "DELETE_NODE52_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 -0.41604976362508 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerLf|malcolm1:ctlCornerLf.translateY"; +createNode animCurveTL -n "DELETE_NODE52_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerLf|malcolm1:ctlCornerLf.translateZ"; +createNode animCurveTA -n "DELETE_NODE52_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerLf|malcolm1:ctlCornerLf.rotateY"; +createNode animCurveTU -n "DELETE_NODE52_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerLf|malcolm1:ctlCornerLf.scaleX"; +createNode animCurveTU -n "DELETE_NODE52_pucker"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerLf|malcolm1:ctlCornerLf.pucker"; +createNode animCurveTU -n "DELETE_NODE52_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerLf|malcolm1:ctlCornerLf.scaleY"; +createNode animCurveTU -n "DELETE_NODE52_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerLf|malcolm1:ctlCornerLf.scaleZ"; +createNode animCurveTA -n "DELETE_NODE52_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerLf|malcolm1:ctlCornerLf.rotateX"; +createNode animCurveTU -n "DELETE_NODE52_cornerPinchIn"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerLf|malcolm1:ctlCornerLf.cornerPinchIn"; +createNode animCurveTA -n "DELETE_NODE52_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerLf|malcolm1:ctlCornerLf.rotateZ"; +createNode animCurveTU -n "DELETE_NODE52_disableAutoPucker"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerLf|malcolm1:ctlCornerLf.disableAutoPucker"; +createNode animCurveTU -n "DELETE_NODE52_cornerPinchOt"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerLf|malcolm1:ctlCornerLf.cornerPinchOt"; +createNode animCurveTA -n "DELETE_NODE53_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp.rotateX"; +createNode animCurveTL -n "DELETE_NODE53_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp.translateX"; +createNode animCurveTL -n "DELETE_NODE53_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp.translateY"; +createNode animCurveTL -n "DELETE_NODE53_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp.translateZ"; +createNode animCurveTU -n "DELETE_NODE53_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp.scaleX"; +createNode animCurveTU -n "DELETE_NODE53_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp.scaleY"; +createNode animCurveTU -n "DELETE_NODE53_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp.scaleZ"; +createNode animCurveTU -n "DELETE_NODE53_squetch"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp.squetch"; +createNode animCurveTA -n "DELETE_NODE53_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp.rotateY"; +createNode animCurveTA -n "DELETE_NODE53_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp.rotateZ"; +createNode animCurveTL -n "DELETE_NODE54_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 8.8817841970009752e-016 6 8.8817841970009752e-016 + 10 8.8817841970009752e-016; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowInLf|malcolm1:ctlBrowInLf.translateX"; +createNode animCurveTL -n "DELETE_NODE54_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 1.304649902425564 6 0.88330452769852741 + 10 0.88330452769852741; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowInLf|malcolm1:ctlBrowInLf.translateY"; +createNode animCurveTL -n "DELETE_NODE54_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowInLf|malcolm1:ctlBrowInLf.translateZ"; +createNode animCurveTU -n "DELETE_NODE54_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowInLf|malcolm1:ctlBrowInLf.scaleX"; +createNode animCurveTU -n "DELETE_NODE54_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowInLf|malcolm1:ctlBrowInLf.scaleY"; +createNode animCurveTU -n "DELETE_NODE54_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowInLf|malcolm1:ctlBrowInLf.scaleZ"; +createNode animCurveTA -n "DELETE_NODE54_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowInLf|malcolm1:ctlBrowInLf.rotateX"; +createNode animCurveTA -n "DELETE_NODE54_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowInLf|malcolm1:ctlBrowInLf.rotateY"; +createNode animCurveTA -n "DELETE_NODE54_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowInLf|malcolm1:ctlBrowInLf.rotateZ"; +createNode animCurveTL -n "DELETE_NODE55_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 4.4408920985004368e-016 6 4.4408920985004368e-016 + 10 4.4408920985004368e-016; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowMdLf|malcolm1:ctlBrowMdLf.translateX"; +createNode animCurveTL -n "DELETE_NODE55_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 -0.11940397604903523 6 0.88330452769852819 + 10 0.88330452769852819; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowMdLf|malcolm1:ctlBrowMdLf.translateY"; +createNode animCurveTL -n "DELETE_NODE55_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowMdLf|malcolm1:ctlBrowMdLf.translateZ"; +createNode animCurveTU -n "DELETE_NODE55_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowMdLf|malcolm1:ctlBrowMdLf.scaleX"; +createNode animCurveTU -n "DELETE_NODE55_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowMdLf|malcolm1:ctlBrowMdLf.scaleY"; +createNode animCurveTU -n "DELETE_NODE55_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowMdLf|malcolm1:ctlBrowMdLf.scaleZ"; +createNode animCurveTA -n "DELETE_NODE55_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowMdLf|malcolm1:ctlBrowMdLf.rotateX"; +createNode animCurveTA -n "DELETE_NODE55_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowMdLf|malcolm1:ctlBrowMdLf.rotateY"; +createNode animCurveTA -n "DELETE_NODE55_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowMdLf|malcolm1:ctlBrowMdLf.rotateZ"; +createNode animCurveTL -n "DELETE_NODE56_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 8.8817841970009802e-016 6 8.8817841970009802e-016 + 10 8.8817841970009802e-016; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowInRt|malcolm1:ctlBrowInRt.translateX"; +createNode animCurveTL -n "DELETE_NODE56_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 1.304649902425564 6 0.88330452769852763 + 10 0.88330452769852763; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowInRt|malcolm1:ctlBrowInRt.translateY"; +createNode animCurveTL -n "DELETE_NODE56_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowInRt|malcolm1:ctlBrowInRt.translateZ"; +createNode animCurveTU -n "DELETE_NODE56_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowInRt|malcolm1:ctlBrowInRt.scaleX"; +createNode animCurveTU -n "DELETE_NODE56_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowInRt|malcolm1:ctlBrowInRt.scaleY"; +createNode animCurveTU -n "DELETE_NODE56_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowInRt|malcolm1:ctlBrowInRt.scaleZ"; +createNode animCurveTA -n "DELETE_NODE56_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowInRt|malcolm1:ctlBrowInRt.rotateX"; +createNode animCurveTA -n "DELETE_NODE56_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowInRt|malcolm1:ctlBrowInRt.rotateY"; +createNode animCurveTA -n "DELETE_NODE56_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowInRt|malcolm1:ctlBrowInRt.rotateZ"; +createNode animCurveTL -n "DELETE_NODE57_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 4.4408920985004368e-016 6 4.4408920985004368e-016 + 10 4.4408920985004368e-016; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowMdRt|malcolm1:ctlBrowMdRt.translateX"; +createNode animCurveTL -n "DELETE_NODE57_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 -0.11940397604903506 6 0.88330452769852785 + 10 0.88330452769852785; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowMdRt|malcolm1:ctlBrowMdRt.translateY"; +createNode animCurveTL -n "DELETE_NODE57_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowMdRt|malcolm1:ctlBrowMdRt.translateZ"; +createNode animCurveTU -n "DELETE_NODE57_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowMdRt|malcolm1:ctlBrowMdRt.scaleX"; +createNode animCurveTU -n "DELETE_NODE57_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowMdRt|malcolm1:ctlBrowMdRt.scaleY"; +createNode animCurveTU -n "DELETE_NODE57_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowMdRt|malcolm1:ctlBrowMdRt.scaleZ"; +createNode animCurveTA -n "DELETE_NODE57_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowMdRt|malcolm1:ctlBrowMdRt.rotateX"; +createNode animCurveTA -n "DELETE_NODE57_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowMdRt|malcolm1:ctlBrowMdRt.rotateY"; +createNode animCurveTA -n "DELETE_NODE57_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowMdRt|malcolm1:ctlBrowMdRt.rotateZ"; +createNode animCurveTL -n "DELETE_NODE58_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowOtRt|malcolm1:ctlBrowOtRt.translateX"; +createNode animCurveTL -n "DELETE_NODE58_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0.3507284991589627 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowOtRt|malcolm1:ctlBrowOtRt.translateY"; +createNode animCurveTL -n "DELETE_NODE58_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowOtRt|malcolm1:ctlBrowOtRt.translateZ"; +createNode animCurveTU -n "DELETE_NODE58_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowOtRt|malcolm1:ctlBrowOtRt.scaleX"; +createNode animCurveTU -n "DELETE_NODE58_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowOtRt|malcolm1:ctlBrowOtRt.scaleY"; +createNode animCurveTU -n "DELETE_NODE58_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowOtRt|malcolm1:ctlBrowOtRt.scaleZ"; +createNode animCurveTA -n "DELETE_NODE58_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowOtRt|malcolm1:ctlBrowOtRt.rotateX"; +createNode animCurveTA -n "DELETE_NODE58_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowOtRt|malcolm1:ctlBrowOtRt.rotateY"; +createNode animCurveTA -n "DELETE_NODE58_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowOtRt|malcolm1:ctlBrowOtRt.rotateZ"; +createNode animCurveTL -n "DELETE_NODE59_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grp1CheekTpOtSpacedLf|malcolm1:ctlCheekTpOtLf.translateX"; +createNode animCurveTL -n "DELETE_NODE59_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grp1CheekTpOtSpacedLf|malcolm1:ctlCheekTpOtLf.translateY"; +createNode animCurveTL -n "DELETE_NODE59_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grp1CheekTpOtSpacedLf|malcolm1:ctlCheekTpOtLf.translateZ"; +createNode animCurveTU -n "DELETE_NODE59_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grp1CheekTpOtSpacedLf|malcolm1:ctlCheekTpOtLf.scaleX"; +createNode animCurveTU -n "DELETE_NODE59_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grp1CheekTpOtSpacedLf|malcolm1:ctlCheekTpOtLf.scaleY"; +createNode animCurveTU -n "DELETE_NODE59_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grp1CheekTpOtSpacedLf|malcolm1:ctlCheekTpOtLf.scaleZ"; +createNode animCurveTA -n "DELETE_NODE59_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grp1CheekTpOtSpacedLf|malcolm1:ctlCheekTpOtLf.rotateX"; +createNode animCurveTA -n "DELETE_NODE59_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grp1CheekTpOtSpacedLf|malcolm1:ctlCheekTpOtLf.rotateY"; +createNode animCurveTA -n "DELETE_NODE59_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grp1CheekTpOtSpacedLf|malcolm1:ctlCheekTpOtLf.rotateZ"; +createNode animCurveTL -n "DELETE_NODE60_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowOtLf|malcolm1:ctlBrowOtLf.translateX"; +createNode animCurveTL -n "DELETE_NODE60_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0.35072849915896281 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowOtLf|malcolm1:ctlBrowOtLf.translateY"; +createNode animCurveTL -n "DELETE_NODE60_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowOtLf|malcolm1:ctlBrowOtLf.translateZ"; +createNode animCurveTU -n "DELETE_NODE60_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowOtLf|malcolm1:ctlBrowOtLf.scaleX"; +createNode animCurveTU -n "DELETE_NODE60_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowOtLf|malcolm1:ctlBrowOtLf.scaleY"; +createNode animCurveTU -n "DELETE_NODE60_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowOtLf|malcolm1:ctlBrowOtLf.scaleZ"; +createNode animCurveTA -n "DELETE_NODE60_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowOtLf|malcolm1:ctlBrowOtLf.rotateX"; +createNode animCurveTA -n "DELETE_NODE60_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowOtLf|malcolm1:ctlBrowOtLf.rotateY"; +createNode animCurveTA -n "DELETE_NODE60_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowOtLf|malcolm1:ctlBrowOtLf.rotateZ"; +createNode animCurveTL -n "DELETE_NODE61_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grp1CheekTpOtSpacedRt|malcolm1:ctlCheekTpOtRt.translateX"; +createNode animCurveTL -n "DELETE_NODE61_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grp1CheekTpOtSpacedRt|malcolm1:ctlCheekTpOtRt.translateY"; +createNode animCurveTL -n "DELETE_NODE61_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grp1CheekTpOtSpacedRt|malcolm1:ctlCheekTpOtRt.translateZ"; +createNode animCurveTU -n "DELETE_NODE61_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grp1CheekTpOtSpacedRt|malcolm1:ctlCheekTpOtRt.scaleX"; +createNode animCurveTU -n "DELETE_NODE61_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grp1CheekTpOtSpacedRt|malcolm1:ctlCheekTpOtRt.scaleY"; +createNode animCurveTU -n "DELETE_NODE61_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grp1CheekTpOtSpacedRt|malcolm1:ctlCheekTpOtRt.scaleZ"; +createNode animCurveTA -n "DELETE_NODE61_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grp1CheekTpOtSpacedRt|malcolm1:ctlCheekTpOtRt.rotateX"; +createNode animCurveTA -n "DELETE_NODE61_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grp1CheekTpOtSpacedRt|malcolm1:ctlCheekTpOtRt.rotateY"; +createNode animCurveTA -n "DELETE_NODE61_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grp1CheekTpOtSpacedRt|malcolm1:ctlCheekTpOtRt.rotateZ"; +createNode animCurveTL -n "DELETE_NODE62_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpEyeLf|malcolm1:grpEyeLid1Lf|malcolm1:ctlEyeLf|malcolm1:eyeLidDrivenLf|malcolm1:ctlEyeLidLf.translateX"; +createNode animCurveTL -n "DELETE_NODE62_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpEyeLf|malcolm1:grpEyeLid1Lf|malcolm1:ctlEyeLf|malcolm1:eyeLidDrivenLf|malcolm1:ctlEyeLidLf.translateY"; +createNode animCurveTL -n "DELETE_NODE62_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpEyeLf|malcolm1:grpEyeLid1Lf|malcolm1:ctlEyeLf|malcolm1:eyeLidDrivenLf|malcolm1:ctlEyeLidLf.translateZ"; +createNode animCurveTU -n "DELETE_NODE62_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpEyeLf|malcolm1:grpEyeLid1Lf|malcolm1:ctlEyeLf|malcolm1:eyeLidDrivenLf|malcolm1:ctlEyeLidLf.scaleX"; +createNode animCurveTU -n "DELETE_NODE62_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpEyeLf|malcolm1:grpEyeLid1Lf|malcolm1:ctlEyeLf|malcolm1:eyeLidDrivenLf|malcolm1:ctlEyeLidLf.scaleY"; +createNode animCurveTU -n "DELETE_NODE62_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpEyeLf|malcolm1:grpEyeLid1Lf|malcolm1:ctlEyeLf|malcolm1:eyeLidDrivenLf|malcolm1:ctlEyeLidLf.scaleZ"; +createNode animCurveTA -n "DELETE_NODE62_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpEyeLf|malcolm1:grpEyeLid1Lf|malcolm1:ctlEyeLf|malcolm1:eyeLidDrivenLf|malcolm1:ctlEyeLidLf.rotateX"; +createNode animCurveTA -n "DELETE_NODE62_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpEyeLf|malcolm1:grpEyeLid1Lf|malcolm1:ctlEyeLf|malcolm1:eyeLidDrivenLf|malcolm1:ctlEyeLidLf.rotateY"; +createNode animCurveTA -n "DELETE_NODE62_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpEyeLf|malcolm1:grpEyeLid1Lf|malcolm1:ctlEyeLf|malcolm1:eyeLidDrivenLf|malcolm1:ctlEyeLidLf.rotateZ"; +createNode animCurveTL -n "DELETE_NODE63_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpEyeLf|malcolm1:grpEyeLid1Lf|malcolm1:ctlEyeLf.translateX"; +createNode animCurveTL -n "DELETE_NODE63_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpEyeLf|malcolm1:grpEyeLid1Lf|malcolm1:ctlEyeLf.translateY"; +createNode animCurveTL -n "DELETE_NODE63_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpEyeLf|malcolm1:grpEyeLid1Lf|malcolm1:ctlEyeLf.translateZ"; +createNode animCurveTU -n "DELETE_NODE63_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpEyeLf|malcolm1:grpEyeLid1Lf|malcolm1:ctlEyeLf.scaleX"; +createNode animCurveTU -n "DELETE_NODE63_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1.1604626114368255 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpEyeLf|malcolm1:grpEyeLid1Lf|malcolm1:ctlEyeLf.scaleY"; +createNode animCurveTU -n "DELETE_NODE63_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpEyeLf|malcolm1:grpEyeLid1Lf|malcolm1:ctlEyeLf.scaleZ"; +createNode animCurveTA -n "DELETE_NODE63_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpEyeLf|malcolm1:grpEyeLid1Lf|malcolm1:ctlEyeLf.rotateX"; +createNode animCurveTA -n "DELETE_NODE63_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpEyeLf|malcolm1:grpEyeLid1Lf|malcolm1:ctlEyeLf.rotateY"; +createNode animCurveTA -n "DELETE_NODE63_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpEyeLf|malcolm1:grpEyeLid1Lf|malcolm1:ctlEyeLf.rotateZ"; +createNode animCurveTL -n "DELETE_NODE64_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidBtLf|malcolm1:ctlLidBtLf.translateX"; +createNode animCurveTL -n "DELETE_NODE64_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 -0.24385272226567933 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidBtLf|malcolm1:ctlLidBtLf.translateY"; +createNode animCurveTL -n "DELETE_NODE64_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidBtLf|malcolm1:ctlLidBtLf.translateZ"; +createNode animCurveTU -n "DELETE_NODE64_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidBtLf|malcolm1:ctlLidBtLf.scaleX"; +createNode animCurveTU -n "DELETE_NODE64_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidBtLf|malcolm1:ctlLidBtLf.scaleY"; +createNode animCurveTU -n "DELETE_NODE64_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidBtLf|malcolm1:ctlLidBtLf.scaleZ"; +createNode animCurveTA -n "DELETE_NODE64_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidBtLf|malcolm1:ctlLidBtLf.rotateX"; +createNode animCurveTA -n "DELETE_NODE64_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidBtLf|malcolm1:ctlLidBtLf.rotateY"; +createNode animCurveTA -n "DELETE_NODE64_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidBtLf|malcolm1:ctlLidBtLf.rotateZ"; +createNode animCurveTU -n "DELETE_NODE64_lidCheek"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 1 6 1 10 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidBtLf|malcolm1:ctlLidBtLf.lidCheek"; +createNode animCurveTU -n "DELETE_NODE64_squint"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidBtLf|malcolm1:ctlLidBtLf.squint"; +createNode animCurveTL -n "DELETE_NODE65_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidCrnInLf|malcolm1:ctlLidCrnInLf.translateX"; +createNode animCurveTL -n "DELETE_NODE65_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidCrnInLf|malcolm1:ctlLidCrnInLf.translateY"; +createNode animCurveTL -n "DELETE_NODE65_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidCrnInLf|malcolm1:ctlLidCrnInLf.translateZ"; +createNode animCurveTU -n "DELETE_NODE65_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidCrnInLf|malcolm1:ctlLidCrnInLf.scaleX"; +createNode animCurveTU -n "DELETE_NODE65_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidCrnInLf|malcolm1:ctlLidCrnInLf.scaleY"; +createNode animCurveTU -n "DELETE_NODE65_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidCrnInLf|malcolm1:ctlLidCrnInLf.scaleZ"; +createNode animCurveTA -n "DELETE_NODE65_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidCrnInLf|malcolm1:ctlLidCrnInLf.rotateX"; +createNode animCurveTA -n "DELETE_NODE65_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidCrnInLf|malcolm1:ctlLidCrnInLf.rotateY"; +createNode animCurveTA -n "DELETE_NODE65_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidCrnInLf|malcolm1:ctlLidCrnInLf.rotateZ"; +createNode animCurveTL -n "DELETE_NODE66_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidCrnOtLf|malcolm1:ctlLidCrnOtLf.translateX"; +createNode animCurveTL -n "DELETE_NODE66_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidCrnOtLf|malcolm1:ctlLidCrnOtLf.translateY"; +createNode animCurveTL -n "DELETE_NODE66_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidCrnOtLf|malcolm1:ctlLidCrnOtLf.translateZ"; +createNode animCurveTU -n "DELETE_NODE66_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidCrnOtLf|malcolm1:ctlLidCrnOtLf.scaleX"; +createNode animCurveTU -n "DELETE_NODE66_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidCrnOtLf|malcolm1:ctlLidCrnOtLf.scaleY"; +createNode animCurveTU -n "DELETE_NODE66_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidCrnOtLf|malcolm1:ctlLidCrnOtLf.scaleZ"; +createNode animCurveTA -n "DELETE_NODE66_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidCrnOtLf|malcolm1:ctlLidCrnOtLf.rotateX"; +createNode animCurveTA -n "DELETE_NODE66_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidCrnOtLf|malcolm1:ctlLidCrnOtLf.rotateY"; +createNode animCurveTA -n "DELETE_NODE66_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidCrnOtLf|malcolm1:ctlLidCrnOtLf.rotateZ"; +createNode animCurveTL -n "DELETE_NODE67_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidTpLf|malcolm1:ctlLidTpLf.translateX"; +createNode animCurveTL -n "DELETE_NODE67_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 1.2069617148462117 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidTpLf|malcolm1:ctlLidTpLf.translateY"; +createNode animCurveTL -n "DELETE_NODE67_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidTpLf|malcolm1:ctlLidTpLf.translateZ"; +createNode animCurveTU -n "DELETE_NODE67_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidTpLf|malcolm1:ctlLidTpLf.scaleX"; +createNode animCurveTU -n "DELETE_NODE67_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidTpLf|malcolm1:ctlLidTpLf.scaleY"; +createNode animCurveTU -n "DELETE_NODE67_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidTpLf|malcolm1:ctlLidTpLf.scaleZ"; +createNode animCurveTA -n "DELETE_NODE67_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidTpLf|malcolm1:ctlLidTpLf.rotateX"; +createNode animCurveTA -n "DELETE_NODE67_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidTpLf|malcolm1:ctlLidTpLf.rotateY"; +createNode animCurveTA -n "DELETE_NODE67_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidTpLf|malcolm1:ctlLidTpLf.rotateZ"; +createNode animCurveTU -n "DELETE_NODE67_squint"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidTpLf|malcolm1:ctlLidTpLf.squint"; +createNode animCurveTU -n "DELETE_NODE68_iris"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpPupilLf|malcolm1:ctlPupilLf.iris"; +createNode animCurveTL -n "DELETE_NODE68_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpPupilLf|malcolm1:ctlPupilLf.translateX"; +createNode animCurveTL -n "DELETE_NODE68_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpPupilLf|malcolm1:ctlPupilLf.translateY"; +createNode animCurveTL -n "DELETE_NODE68_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpPupilLf|malcolm1:ctlPupilLf.translateZ"; +createNode animCurveTU -n "DELETE_NODE68_eyeShaperVis"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 9; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr -s 3 ".kot[0:2]" 5 5 5; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpPupilLf|malcolm1:ctlPupilLf.eyeShaperVis"; +createNode animCurveTU -n "DELETE_NODE68_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpPupilLf|malcolm1:ctlPupilLf.scaleX"; +createNode animCurveTU -n "DELETE_NODE68_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpPupilLf|malcolm1:ctlPupilLf.scaleY"; +createNode animCurveTU -n "DELETE_NODE68_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpPupilLf|malcolm1:ctlPupilLf.scaleZ"; +createNode animCurveTU -n "DELETE_NODE68_aim"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpPupilLf|malcolm1:ctlPupilLf.aim"; +createNode animCurveTA -n "DELETE_NODE68_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpPupilLf|malcolm1:ctlPupilLf.rotateY"; +createNode animCurveTA -n "DELETE_NODE68_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpPupilLf|malcolm1:ctlPupilLf.rotateZ"; +createNode animCurveTU -n "DELETE_NODE68_eyeBulge"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpPupilLf|malcolm1:ctlPupilLf.eyeBulge"; +createNode animCurveTU -n "DELETE_NODE68_pupil"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpPupilLf|malcolm1:ctlPupilLf.pupil"; +createNode animCurveTU -n "DELETE_NODE68_lidShaperVis"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 9; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr -s 3 ".kot[0:2]" 5 5 5; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpPupilLf|malcolm1:ctlPupilLf.lidShaperVis"; +createNode animCurveTA -n "DELETE_NODE68_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpPupilLf|malcolm1:ctlPupilLf.rotateX"; +createNode animCurveTL -n "DELETE_NODE69_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpEyeRt|malcolm1:grpEyeLid1Rt|malcolm1:ctlEyeRt|malcolm1:eyeLidDrivenRt|malcolm1:ctlEyeLidRt.translateX"; +createNode animCurveTL -n "DELETE_NODE69_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpEyeRt|malcolm1:grpEyeLid1Rt|malcolm1:ctlEyeRt|malcolm1:eyeLidDrivenRt|malcolm1:ctlEyeLidRt.translateY"; +createNode animCurveTL -n "DELETE_NODE69_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpEyeRt|malcolm1:grpEyeLid1Rt|malcolm1:ctlEyeRt|malcolm1:eyeLidDrivenRt|malcolm1:ctlEyeLidRt.translateZ"; +createNode animCurveTU -n "DELETE_NODE69_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpEyeRt|malcolm1:grpEyeLid1Rt|malcolm1:ctlEyeRt|malcolm1:eyeLidDrivenRt|malcolm1:ctlEyeLidRt.scaleX"; +createNode animCurveTU -n "DELETE_NODE69_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpEyeRt|malcolm1:grpEyeLid1Rt|malcolm1:ctlEyeRt|malcolm1:eyeLidDrivenRt|malcolm1:ctlEyeLidRt.scaleY"; +createNode animCurveTU -n "DELETE_NODE69_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpEyeRt|malcolm1:grpEyeLid1Rt|malcolm1:ctlEyeRt|malcolm1:eyeLidDrivenRt|malcolm1:ctlEyeLidRt.scaleZ"; +createNode animCurveTA -n "DELETE_NODE69_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpEyeRt|malcolm1:grpEyeLid1Rt|malcolm1:ctlEyeRt|malcolm1:eyeLidDrivenRt|malcolm1:ctlEyeLidRt.rotateX"; +createNode animCurveTA -n "DELETE_NODE69_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpEyeRt|malcolm1:grpEyeLid1Rt|malcolm1:ctlEyeRt|malcolm1:eyeLidDrivenRt|malcolm1:ctlEyeLidRt.rotateY"; +createNode animCurveTA -n "DELETE_NODE69_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpEyeRt|malcolm1:grpEyeLid1Rt|malcolm1:ctlEyeRt|malcolm1:eyeLidDrivenRt|malcolm1:ctlEyeLidRt.rotateZ"; +createNode animCurveTL -n "DELETE_NODE70_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpEyeRt|malcolm1:grpEyeLid1Rt|malcolm1:ctlEyeRt.translateX"; +createNode animCurveTL -n "DELETE_NODE70_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpEyeRt|malcolm1:grpEyeLid1Rt|malcolm1:ctlEyeRt.translateY"; +createNode animCurveTL -n "DELETE_NODE70_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpEyeRt|malcolm1:grpEyeLid1Rt|malcolm1:ctlEyeRt.translateZ"; +createNode animCurveTU -n "DELETE_NODE70_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpEyeRt|malcolm1:grpEyeLid1Rt|malcolm1:ctlEyeRt.scaleX"; +createNode animCurveTU -n "DELETE_NODE70_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1.1604626114368255 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpEyeRt|malcolm1:grpEyeLid1Rt|malcolm1:ctlEyeRt.scaleY"; +createNode animCurveTU -n "DELETE_NODE70_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpEyeRt|malcolm1:grpEyeLid1Rt|malcolm1:ctlEyeRt.scaleZ"; +createNode animCurveTA -n "DELETE_NODE70_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpEyeRt|malcolm1:grpEyeLid1Rt|malcolm1:ctlEyeRt.rotateX"; +createNode animCurveTA -n "DELETE_NODE70_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpEyeRt|malcolm1:grpEyeLid1Rt|malcolm1:ctlEyeRt.rotateY"; +createNode animCurveTA -n "DELETE_NODE70_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpEyeRt|malcolm1:grpEyeLid1Rt|malcolm1:ctlEyeRt.rotateZ"; +createNode animCurveTL -n "DELETE_NODE71_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidBtRt|malcolm1:ctlLidBtRt.translateX"; +createNode animCurveTL -n "DELETE_NODE71_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 -0.24385272226567936 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidBtRt|malcolm1:ctlLidBtRt.translateY"; +createNode animCurveTL -n "DELETE_NODE71_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidBtRt|malcolm1:ctlLidBtRt.translateZ"; +createNode animCurveTU -n "DELETE_NODE71_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidBtRt|malcolm1:ctlLidBtRt.scaleX"; +createNode animCurveTU -n "DELETE_NODE71_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidBtRt|malcolm1:ctlLidBtRt.scaleY"; +createNode animCurveTU -n "DELETE_NODE71_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidBtRt|malcolm1:ctlLidBtRt.scaleZ"; +createNode animCurveTA -n "DELETE_NODE71_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidBtRt|malcolm1:ctlLidBtRt.rotateX"; +createNode animCurveTA -n "DELETE_NODE71_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidBtRt|malcolm1:ctlLidBtRt.rotateY"; +createNode animCurveTA -n "DELETE_NODE71_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidBtRt|malcolm1:ctlLidBtRt.rotateZ"; +createNode animCurveTU -n "DELETE_NODE71_lidCheek"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 1 6 1 10 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidBtRt|malcolm1:ctlLidBtRt.lidCheek"; +createNode animCurveTU -n "DELETE_NODE71_squint"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidBtRt|malcolm1:ctlLidBtRt.squint"; +createNode animCurveTL -n "DELETE_NODE72_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidCrnInRt|malcolm1:ctlLidCrnInRt.translateX"; +createNode animCurveTL -n "DELETE_NODE72_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidCrnInRt|malcolm1:ctlLidCrnInRt.translateY"; +createNode animCurveTL -n "DELETE_NODE72_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidCrnInRt|malcolm1:ctlLidCrnInRt.translateZ"; +createNode animCurveTU -n "DELETE_NODE72_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidCrnInRt|malcolm1:ctlLidCrnInRt.scaleX"; +createNode animCurveTU -n "DELETE_NODE72_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidCrnInRt|malcolm1:ctlLidCrnInRt.scaleY"; +createNode animCurveTU -n "DELETE_NODE72_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidCrnInRt|malcolm1:ctlLidCrnInRt.scaleZ"; +createNode animCurveTA -n "DELETE_NODE72_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidCrnInRt|malcolm1:ctlLidCrnInRt.rotateX"; +createNode animCurveTA -n "DELETE_NODE72_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidCrnInRt|malcolm1:ctlLidCrnInRt.rotateY"; +createNode animCurveTA -n "DELETE_NODE72_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidCrnInRt|malcolm1:ctlLidCrnInRt.rotateZ"; +createNode animCurveTL -n "DELETE_NODE73_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidCrnOtRt|malcolm1:ctlLidCrnOtRt.translateX"; +createNode animCurveTL -n "DELETE_NODE73_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidCrnOtRt|malcolm1:ctlLidCrnOtRt.translateY"; +createNode animCurveTL -n "DELETE_NODE73_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidCrnOtRt|malcolm1:ctlLidCrnOtRt.translateZ"; +createNode animCurveTU -n "DELETE_NODE73_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidCrnOtRt|malcolm1:ctlLidCrnOtRt.scaleX"; +createNode animCurveTU -n "DELETE_NODE73_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidCrnOtRt|malcolm1:ctlLidCrnOtRt.scaleY"; +createNode animCurveTU -n "DELETE_NODE73_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidCrnOtRt|malcolm1:ctlLidCrnOtRt.scaleZ"; +createNode animCurveTA -n "DELETE_NODE73_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidCrnOtRt|malcolm1:ctlLidCrnOtRt.rotateX"; +createNode animCurveTA -n "DELETE_NODE73_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidCrnOtRt|malcolm1:ctlLidCrnOtRt.rotateY"; +createNode animCurveTA -n "DELETE_NODE73_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidCrnOtRt|malcolm1:ctlLidCrnOtRt.rotateZ"; +createNode animCurveTL -n "DELETE_NODE74_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidTpRt|malcolm1:ctlLidTpRt.translateX"; +createNode animCurveTL -n "DELETE_NODE74_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 1.2069617148462115 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidTpRt|malcolm1:ctlLidTpRt.translateY"; +createNode animCurveTL -n "DELETE_NODE74_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidTpRt|malcolm1:ctlLidTpRt.translateZ"; +createNode animCurveTU -n "DELETE_NODE74_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidTpRt|malcolm1:ctlLidTpRt.scaleX"; +createNode animCurveTU -n "DELETE_NODE74_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidTpRt|malcolm1:ctlLidTpRt.scaleY"; +createNode animCurveTU -n "DELETE_NODE74_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidTpRt|malcolm1:ctlLidTpRt.scaleZ"; +createNode animCurveTA -n "DELETE_NODE74_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidTpRt|malcolm1:ctlLidTpRt.rotateX"; +createNode animCurveTA -n "DELETE_NODE74_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidTpRt|malcolm1:ctlLidTpRt.rotateY"; +createNode animCurveTA -n "DELETE_NODE74_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidTpRt|malcolm1:ctlLidTpRt.rotateZ"; +createNode animCurveTU -n "DELETE_NODE74_squint"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidTpRt|malcolm1:ctlLidTpRt.squint"; +createNode animCurveTU -n "DELETE_NODE75_iris"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpPupilRt|malcolm1:ctlPupilRt.iris"; +createNode animCurveTL -n "DELETE_NODE75_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpPupilRt|malcolm1:ctlPupilRt.translateX"; +createNode animCurveTL -n "DELETE_NODE75_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpPupilRt|malcolm1:ctlPupilRt.translateY"; +createNode animCurveTL -n "DELETE_NODE75_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpPupilRt|malcolm1:ctlPupilRt.translateZ"; +createNode animCurveTU -n "DELETE_NODE75_eyeShaperVis"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 9; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr -s 3 ".kot[0:2]" 5 5 5; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpPupilRt|malcolm1:ctlPupilRt.eyeShaperVis"; +createNode animCurveTU -n "DELETE_NODE75_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpPupilRt|malcolm1:ctlPupilRt.scaleX"; +createNode animCurveTU -n "DELETE_NODE75_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpPupilRt|malcolm1:ctlPupilRt.scaleY"; +createNode animCurveTU -n "DELETE_NODE75_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpPupilRt|malcolm1:ctlPupilRt.scaleZ"; +createNode animCurveTU -n "DELETE_NODE75_aim"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpPupilRt|malcolm1:ctlPupilRt.aim"; +createNode animCurveTA -n "DELETE_NODE75_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpPupilRt|malcolm1:ctlPupilRt.rotateY"; +createNode animCurveTA -n "DELETE_NODE75_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpPupilRt|malcolm1:ctlPupilRt.rotateZ"; +createNode animCurveTU -n "DELETE_NODE75_eyeBulge"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpPupilRt|malcolm1:ctlPupilRt.eyeBulge"; +createNode animCurveTU -n "DELETE_NODE75_pupil"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpPupilRt|malcolm1:ctlPupilRt.pupil"; +createNode animCurveTU -n "DELETE_NODE75_lidShaperVis"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 9; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr -s 3 ".kot[0:2]" 5 5 5; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpPupilRt|malcolm1:ctlPupilRt.lidShaperVis"; +createNode animCurveTA -n "DELETE_NODE75_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpPupilRt|malcolm1:ctlPupilRt.rotateX"; +createNode animCurveTL -n "DELETE_NODE76_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHairRig|malcolm1:grpHairFront|malcolm1:ctlHairFront.translateX"; +createNode animCurveTL -n "DELETE_NODE76_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHairRig|malcolm1:grpHairFront|malcolm1:ctlHairFront.translateY"; +createNode animCurveTL -n "DELETE_NODE76_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHairRig|malcolm1:grpHairFront|malcolm1:ctlHairFront.translateZ"; +createNode animCurveTU -n "DELETE_NODE76_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHairRig|malcolm1:grpHairFront|malcolm1:ctlHairFront.scaleX"; +createNode animCurveTU -n "DELETE_NODE76_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHairRig|malcolm1:grpHairFront|malcolm1:ctlHairFront.scaleY"; +createNode animCurveTU -n "DELETE_NODE76_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHairRig|malcolm1:grpHairFront|malcolm1:ctlHairFront.scaleZ"; +createNode animCurveTA -n "DELETE_NODE76_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHairRig|malcolm1:grpHairFront|malcolm1:ctlHairFront.rotateX"; +createNode animCurveTA -n "DELETE_NODE76_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHairRig|malcolm1:grpHairFront|malcolm1:ctlHairFront.rotateY"; +createNode animCurveTA -n "DELETE_NODE76_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHairRig|malcolm1:grpHairFront|malcolm1:ctlHairFront.rotateZ"; +createNode animCurveTL -n "DELETE_NODE77_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHairRig|malcolm1:grpHairFront|malcolm1:ctlHairFront|malcolm1:grpFHair1|malcolm1:ctlFHair2.translateX"; +createNode animCurveTL -n "DELETE_NODE77_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHairRig|malcolm1:grpHairFront|malcolm1:ctlHairFront|malcolm1:grpFHair1|malcolm1:ctlFHair2.translateY"; +createNode animCurveTL -n "DELETE_NODE77_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHairRig|malcolm1:grpHairFront|malcolm1:ctlHairFront|malcolm1:grpFHair1|malcolm1:ctlFHair2.translateZ"; +createNode animCurveTU -n "DELETE_NODE77_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHairRig|malcolm1:grpHairFront|malcolm1:ctlHairFront|malcolm1:grpFHair1|malcolm1:ctlFHair2.scaleX"; +createNode animCurveTU -n "DELETE_NODE77_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHairRig|malcolm1:grpHairFront|malcolm1:ctlHairFront|malcolm1:grpFHair1|malcolm1:ctlFHair2.scaleY"; +createNode animCurveTU -n "DELETE_NODE77_visibility"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 9; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr -s 2 ".kot[0:1]" 5 5; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHairRig|malcolm1:grpHairFront|malcolm1:ctlHairFront|malcolm1:grpFHair1|malcolm1:ctlFHair2.visibility"; +createNode animCurveTA -n "DELETE_NODE77_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHairRig|malcolm1:grpHairFront|malcolm1:ctlHairFront|malcolm1:grpFHair1|malcolm1:ctlFHair2.rotateX"; +createNode animCurveTA -n "DELETE_NODE77_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHairRig|malcolm1:grpHairFront|malcolm1:ctlHairFront|malcolm1:grpFHair1|malcolm1:ctlFHair2.rotateY"; +createNode animCurveTA -n "DELETE_NODE77_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHairRig|malcolm1:grpHairFront|malcolm1:ctlHairFront|malcolm1:grpFHair1|malcolm1:ctlFHair2.rotateZ"; +createNode animCurveTU -n "DELETE_NODE77_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHairRig|malcolm1:grpHairFront|malcolm1:ctlHairFront|malcolm1:grpFHair1|malcolm1:ctlFHair2.scaleZ"; +createNode animCurveTL -n "DELETE_NODE78_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersLf|malcolm1:grpEyeShaperTpLf|malcolm1:ctlEyeShaperTpLf.translateX"; +createNode animCurveTL -n "DELETE_NODE78_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersLf|malcolm1:grpEyeShaperTpLf|malcolm1:ctlEyeShaperTpLf.translateY"; +createNode animCurveTL -n "DELETE_NODE78_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersLf|malcolm1:grpEyeShaperTpLf|malcolm1:ctlEyeShaperTpLf.translateZ"; +createNode animCurveTU -n "DELETE_NODE78_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersLf|malcolm1:grpEyeShaperTpLf|malcolm1:ctlEyeShaperTpLf.scaleX"; +createNode animCurveTU -n "DELETE_NODE78_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersLf|malcolm1:grpEyeShaperTpLf|malcolm1:ctlEyeShaperTpLf.scaleY"; +createNode animCurveTU -n "DELETE_NODE78_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersLf|malcolm1:grpEyeShaperTpLf|malcolm1:ctlEyeShaperTpLf.scaleZ"; +createNode animCurveTA -n "DELETE_NODE78_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersLf|malcolm1:grpEyeShaperTpLf|malcolm1:ctlEyeShaperTpLf.rotateX"; +createNode animCurveTA -n "DELETE_NODE78_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersLf|malcolm1:grpEyeShaperTpLf|malcolm1:ctlEyeShaperTpLf.rotateY"; +createNode animCurveTA -n "DELETE_NODE78_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersLf|malcolm1:grpEyeShaperTpLf|malcolm1:ctlEyeShaperTpLf.rotateZ"; +createNode animCurveTL -n "DELETE_NODE79_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersLf|malcolm1:grpEyeShaperBtLf|malcolm1:ctlEyeShaperBtLf.translateX"; +createNode animCurveTL -n "DELETE_NODE79_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersLf|malcolm1:grpEyeShaperBtLf|malcolm1:ctlEyeShaperBtLf.translateY"; +createNode animCurveTL -n "DELETE_NODE79_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersLf|malcolm1:grpEyeShaperBtLf|malcolm1:ctlEyeShaperBtLf.translateZ"; +createNode animCurveTU -n "DELETE_NODE79_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersLf|malcolm1:grpEyeShaperBtLf|malcolm1:ctlEyeShaperBtLf.scaleX"; +createNode animCurveTU -n "DELETE_NODE79_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersLf|malcolm1:grpEyeShaperBtLf|malcolm1:ctlEyeShaperBtLf.scaleY"; +createNode animCurveTU -n "DELETE_NODE79_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersLf|malcolm1:grpEyeShaperBtLf|malcolm1:ctlEyeShaperBtLf.scaleZ"; +createNode animCurveTA -n "DELETE_NODE79_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersLf|malcolm1:grpEyeShaperBtLf|malcolm1:ctlEyeShaperBtLf.rotateX"; +createNode animCurveTA -n "DELETE_NODE79_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersLf|malcolm1:grpEyeShaperBtLf|malcolm1:ctlEyeShaperBtLf.rotateY"; +createNode animCurveTA -n "DELETE_NODE79_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersLf|malcolm1:grpEyeShaperBtLf|malcolm1:ctlEyeShaperBtLf.rotateZ"; +createNode animCurveTL -n "DELETE_NODE80_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersRt|malcolm1:grpEyeShaperTpRt|malcolm1:ctlEyeShaperTpRt.translateX"; +createNode animCurveTL -n "DELETE_NODE80_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersRt|malcolm1:grpEyeShaperTpRt|malcolm1:ctlEyeShaperTpRt.translateY"; +createNode animCurveTL -n "DELETE_NODE80_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersRt|malcolm1:grpEyeShaperTpRt|malcolm1:ctlEyeShaperTpRt.translateZ"; +createNode animCurveTU -n "DELETE_NODE80_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersRt|malcolm1:grpEyeShaperTpRt|malcolm1:ctlEyeShaperTpRt.scaleX"; +createNode animCurveTU -n "DELETE_NODE80_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersRt|malcolm1:grpEyeShaperTpRt|malcolm1:ctlEyeShaperTpRt.scaleY"; +createNode animCurveTU -n "DELETE_NODE80_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersRt|malcolm1:grpEyeShaperTpRt|malcolm1:ctlEyeShaperTpRt.scaleZ"; +createNode animCurveTA -n "DELETE_NODE80_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersRt|malcolm1:grpEyeShaperTpRt|malcolm1:ctlEyeShaperTpRt.rotateX"; +createNode animCurveTA -n "DELETE_NODE80_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersRt|malcolm1:grpEyeShaperTpRt|malcolm1:ctlEyeShaperTpRt.rotateY"; +createNode animCurveTA -n "DELETE_NODE80_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersRt|malcolm1:grpEyeShaperTpRt|malcolm1:ctlEyeShaperTpRt.rotateZ"; +createNode animCurveTL -n "DELETE_NODE81_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersRt|malcolm1:grpEyeShaperBtRt|malcolm1:ctlEyeShaperBtRt.translateX"; +createNode animCurveTL -n "DELETE_NODE81_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersRt|malcolm1:grpEyeShaperBtRt|malcolm1:ctlEyeShaperBtRt.translateY"; +createNode animCurveTL -n "DELETE_NODE81_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersRt|malcolm1:grpEyeShaperBtRt|malcolm1:ctlEyeShaperBtRt.translateZ"; +createNode animCurveTU -n "DELETE_NODE81_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersRt|malcolm1:grpEyeShaperBtRt|malcolm1:ctlEyeShaperBtRt.scaleX"; +createNode animCurveTU -n "DELETE_NODE81_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersRt|malcolm1:grpEyeShaperBtRt|malcolm1:ctlEyeShaperBtRt.scaleY"; +createNode animCurveTU -n "DELETE_NODE81_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersRt|malcolm1:grpEyeShaperBtRt|malcolm1:ctlEyeShaperBtRt.scaleZ"; +createNode animCurveTA -n "DELETE_NODE81_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersRt|malcolm1:grpEyeShaperBtRt|malcolm1:ctlEyeShaperBtRt.rotateX"; +createNode animCurveTA -n "DELETE_NODE81_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersRt|malcolm1:grpEyeShaperBtRt|malcolm1:ctlEyeShaperBtRt.rotateY"; +createNode animCurveTA -n "DELETE_NODE81_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersRt|malcolm1:grpEyeShaperBtRt|malcolm1:ctlEyeShaperBtRt.rotateZ"; +createNode animCurveTL -n "DELETE_NODE82_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotLf|malcolm1:earPivotLf|malcolm1:grpEarLf|malcolm1:ctlEarLf|malcolm1:grpEar2Lf|malcolm1:ctlEar2Lf.translateX"; +createNode animCurveTL -n "DELETE_NODE82_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotLf|malcolm1:earPivotLf|malcolm1:grpEarLf|malcolm1:ctlEarLf|malcolm1:grpEar2Lf|malcolm1:ctlEar2Lf.translateY"; +createNode animCurveTL -n "DELETE_NODE82_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotLf|malcolm1:earPivotLf|malcolm1:grpEarLf|malcolm1:ctlEarLf|malcolm1:grpEar2Lf|malcolm1:ctlEar2Lf.translateZ"; +createNode animCurveTU -n "DELETE_NODE82_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotLf|malcolm1:earPivotLf|malcolm1:grpEarLf|malcolm1:ctlEarLf|malcolm1:grpEar2Lf|malcolm1:ctlEar2Lf.scaleX"; +createNode animCurveTU -n "DELETE_NODE82_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotLf|malcolm1:earPivotLf|malcolm1:grpEarLf|malcolm1:ctlEarLf|malcolm1:grpEar2Lf|malcolm1:ctlEar2Lf.scaleY"; +createNode animCurveTU -n "DELETE_NODE82_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotLf|malcolm1:earPivotLf|malcolm1:grpEarLf|malcolm1:ctlEarLf|malcolm1:grpEar2Lf|malcolm1:ctlEar2Lf.scaleZ"; +createNode animCurveTA -n "DELETE_NODE82_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotLf|malcolm1:earPivotLf|malcolm1:grpEarLf|malcolm1:ctlEarLf|malcolm1:grpEar2Lf|malcolm1:ctlEar2Lf.rotateX"; +createNode animCurveTA -n "DELETE_NODE82_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotLf|malcolm1:earPivotLf|malcolm1:grpEarLf|malcolm1:ctlEarLf|malcolm1:grpEar2Lf|malcolm1:ctlEar2Lf.rotateY"; +createNode animCurveTA -n "DELETE_NODE82_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotLf|malcolm1:earPivotLf|malcolm1:grpEarLf|malcolm1:ctlEarLf|malcolm1:grpEar2Lf|malcolm1:ctlEar2Lf.rotateZ"; +createNode animCurveTL -n "DELETE_NODE83_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotLf|malcolm1:earPivotLf|malcolm1:grpEarLf|malcolm1:ctlEarLf.translateX"; +createNode animCurveTL -n "DELETE_NODE83_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotLf|malcolm1:earPivotLf|malcolm1:grpEarLf|malcolm1:ctlEarLf.translateY"; +createNode animCurveTL -n "DELETE_NODE83_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotLf|malcolm1:earPivotLf|malcolm1:grpEarLf|malcolm1:ctlEarLf.translateZ"; +createNode animCurveTU -n "DELETE_NODE83_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotLf|malcolm1:earPivotLf|malcolm1:grpEarLf|malcolm1:ctlEarLf.scaleX"; +createNode animCurveTU -n "DELETE_NODE83_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotLf|malcolm1:earPivotLf|malcolm1:grpEarLf|malcolm1:ctlEarLf.scaleY"; +createNode animCurveTU -n "DELETE_NODE83_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotLf|malcolm1:earPivotLf|malcolm1:grpEarLf|malcolm1:ctlEarLf.scaleZ"; +createNode animCurveTA -n "DELETE_NODE83_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotLf|malcolm1:earPivotLf|malcolm1:grpEarLf|malcolm1:ctlEarLf.rotateX"; +createNode animCurveTA -n "DELETE_NODE83_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotLf|malcolm1:earPivotLf|malcolm1:grpEarLf|malcolm1:ctlEarLf.rotateY"; +createNode animCurveTA -n "DELETE_NODE83_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotLf|malcolm1:earPivotLf|malcolm1:grpEarLf|malcolm1:ctlEarLf.rotateZ"; +createNode animCurveTL -n "DELETE_NODE84_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotRt|malcolm1:earPivotRt|malcolm1:grpEarRt|malcolm1:ctlEarRt|malcolm1:grpEar2Rt|malcolm1:ctlEar2Rt.translateX"; +createNode animCurveTL -n "DELETE_NODE84_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotRt|malcolm1:earPivotRt|malcolm1:grpEarRt|malcolm1:ctlEarRt|malcolm1:grpEar2Rt|malcolm1:ctlEar2Rt.translateY"; +createNode animCurveTL -n "DELETE_NODE84_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotRt|malcolm1:earPivotRt|malcolm1:grpEarRt|malcolm1:ctlEarRt|malcolm1:grpEar2Rt|malcolm1:ctlEar2Rt.translateZ"; +createNode animCurveTU -n "DELETE_NODE84_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotRt|malcolm1:earPivotRt|malcolm1:grpEarRt|malcolm1:ctlEarRt|malcolm1:grpEar2Rt|malcolm1:ctlEar2Rt.scaleX"; +createNode animCurveTU -n "DELETE_NODE84_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotRt|malcolm1:earPivotRt|malcolm1:grpEarRt|malcolm1:ctlEarRt|malcolm1:grpEar2Rt|malcolm1:ctlEar2Rt.scaleY"; +createNode animCurveTU -n "DELETE_NODE84_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotRt|malcolm1:earPivotRt|malcolm1:grpEarRt|malcolm1:ctlEarRt|malcolm1:grpEar2Rt|malcolm1:ctlEar2Rt.scaleZ"; +createNode animCurveTA -n "DELETE_NODE84_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotRt|malcolm1:earPivotRt|malcolm1:grpEarRt|malcolm1:ctlEarRt|malcolm1:grpEar2Rt|malcolm1:ctlEar2Rt.rotateX"; +createNode animCurveTA -n "DELETE_NODE84_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotRt|malcolm1:earPivotRt|malcolm1:grpEarRt|malcolm1:ctlEarRt|malcolm1:grpEar2Rt|malcolm1:ctlEar2Rt.rotateY"; +createNode animCurveTA -n "DELETE_NODE84_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotRt|malcolm1:earPivotRt|malcolm1:grpEarRt|malcolm1:ctlEarRt|malcolm1:grpEar2Rt|malcolm1:ctlEar2Rt.rotateZ"; +createNode animCurveTL -n "DELETE_NODE85_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotRt|malcolm1:earPivotRt|malcolm1:grpEarRt|malcolm1:ctlEarRt.translateX"; +createNode animCurveTL -n "DELETE_NODE85_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotRt|malcolm1:earPivotRt|malcolm1:grpEarRt|malcolm1:ctlEarRt.translateY"; +createNode animCurveTL -n "DELETE_NODE85_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotRt|malcolm1:earPivotRt|malcolm1:grpEarRt|malcolm1:ctlEarRt.translateZ"; +createNode animCurveTU -n "DELETE_NODE85_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotRt|malcolm1:earPivotRt|malcolm1:grpEarRt|malcolm1:ctlEarRt.scaleX"; +createNode animCurveTU -n "DELETE_NODE85_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotRt|malcolm1:earPivotRt|malcolm1:grpEarRt|malcolm1:ctlEarRt.scaleY"; +createNode animCurveTU -n "DELETE_NODE85_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotRt|malcolm1:earPivotRt|malcolm1:grpEarRt|malcolm1:ctlEarRt.scaleZ"; +createNode animCurveTA -n "DELETE_NODE85_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotRt|malcolm1:earPivotRt|malcolm1:grpEarRt|malcolm1:ctlEarRt.rotateX"; +createNode animCurveTA -n "DELETE_NODE85_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotRt|malcolm1:earPivotRt|malcolm1:grpEarRt|malcolm1:ctlEarRt.rotateY"; +createNode animCurveTA -n "DELETE_NODE85_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotRt|malcolm1:earPivotRt|malcolm1:grpEarRt|malcolm1:ctlEarRt.rotateZ"; +createNode animCurveTL -n "DELETE_NODE86_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal.translateX"; +createNode animCurveTL -n "DELETE_NODE86_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal.translateY"; +createNode animCurveTL -n "DELETE_NODE86_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal.translateZ"; +createNode animCurveTU -n "DELETE_NODE86_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal.scaleX"; +createNode animCurveTU -n "DELETE_NODE86_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal.scaleY"; +createNode animCurveTU -n "DELETE_NODE86_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal.scaleZ"; +createNode animCurveTA -n "DELETE_NODE86_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal.rotateX"; +createNode animCurveTA -n "DELETE_NODE86_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal.rotateY"; +createNode animCurveTA -n "DELETE_NODE86_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal.rotateZ"; +createNode animCurveTL -n "DELETE_NODE87_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead.translateX"; +createNode animCurveTL -n "DELETE_NODE87_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead.translateY"; +createNode animCurveTL -n "DELETE_NODE87_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead.translateZ"; +createNode animCurveTU -n "DELETE_NODE87_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead.scaleX"; +createNode animCurveTU -n "DELETE_NODE87_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead.scaleY"; +createNode animCurveTU -n "DELETE_NODE87_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead.scaleZ"; +createNode animCurveTA -n "DELETE_NODE87_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 -4.1213113705648654 10 -4.1213113705648654; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead.rotateX"; +createNode animCurveTA -n "DELETE_NODE87_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 5.5893874365085248 10 5.5893874365085248; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead.rotateY"; +createNode animCurveTA -n "DELETE_NODE87_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 4.4369908596991907 10 4.4369908596991907; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead.rotateZ"; +createNode animCurveTU -n "DELETE_NODE87_orientToPlacement"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 1 6 1 10 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead.orientToPlacement"; +createNode animCurveTL -n "DELETE_NODE88_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpHeadOrient|malcolm1:ctlHeadOrient.translateX"; +createNode animCurveTL -n "DELETE_NODE88_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpHeadOrient|malcolm1:ctlHeadOrient.translateY"; +createNode animCurveTL -n "DELETE_NODE88_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpHeadOrient|malcolm1:ctlHeadOrient.translateZ"; +createNode animCurveTU -n "DELETE_NODE88_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpHeadOrient|malcolm1:ctlHeadOrient.scaleX"; +createNode animCurveTU -n "DELETE_NODE88_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpHeadOrient|malcolm1:ctlHeadOrient.scaleY"; +createNode animCurveTU -n "DELETE_NODE88_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpHeadOrient|malcolm1:ctlHeadOrient.scaleZ"; +createNode animCurveTA -n "DELETE_NODE88_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpHeadOrient|malcolm1:ctlHeadOrient.rotateX"; +createNode animCurveTA -n "DELETE_NODE88_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpHeadOrient|malcolm1:ctlHeadOrient.rotateY"; +createNode animCurveTA -n "DELETE_NODE88_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpHeadOrient|malcolm1:ctlHeadOrient.rotateZ"; +createNode animCurveTU -n "DELETE_NODE89_md"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt.md"; +createNode animCurveTU -n "DELETE_NODE89_funnel"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt.funnel"; +createNode animCurveTL -n "DELETE_NODE89_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt.translateX"; +createNode animCurveTL -n "DELETE_NODE89_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 -0.041725743879269937 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt.translateY"; +createNode animCurveTL -n "DELETE_NODE89_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt.translateZ"; +createNode animCurveTU -n "DELETE_NODE89_thicknessY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt.thicknessY"; +createNode animCurveTU -n "DELETE_NODE89_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt.scaleX"; +createNode animCurveTU -n "DELETE_NODE89_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt.scaleY"; +createNode animCurveTU -n "DELETE_NODE89_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt.scaleZ"; +createNode animCurveTA -n "DELETE_NODE89_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 1.2258616735674603 10 1.2258616735674603; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt.rotateX"; +createNode animCurveTA -n "DELETE_NODE89_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt.rotateY"; +createNode animCurveTA -n "DELETE_NODE89_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt.rotateZ"; +createNode animCurveTU -n "DELETE_NODE89_peak"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt.peak"; +createNode animCurveTU -n "DELETE_NODE89_press"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt.press"; +createNode animCurveTU -n "DELETE_NODE89_puff"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt.puff"; +createNode animCurveTU -n "DELETE_NODE89_thicknessZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt.thicknessZ"; +createNode animCurveTL -n "DELETE_NODE90_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpMentalis|malcolm1:ctlMentalis.translateX"; +createNode animCurveTL -n "DELETE_NODE90_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpMentalis|malcolm1:ctlMentalis.translateY"; +createNode animCurveTL -n "DELETE_NODE90_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpMentalis|malcolm1:ctlMentalis.translateZ"; +createNode animCurveTU -n "DELETE_NODE90_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpMentalis|malcolm1:ctlMentalis.scaleX"; +createNode animCurveTU -n "DELETE_NODE90_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpMentalis|malcolm1:ctlMentalis.scaleY"; +createNode animCurveTU -n "DELETE_NODE90_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpMentalis|malcolm1:ctlMentalis.scaleZ"; +createNode animCurveTA -n "DELETE_NODE90_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpMentalis|malcolm1:ctlMentalis.rotateX"; +createNode animCurveTA -n "DELETE_NODE90_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpMentalis|malcolm1:ctlMentalis.rotateY"; +createNode animCurveTA -n "DELETE_NODE90_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpMentalis|malcolm1:ctlMentalis.rotateZ"; +createNode animCurveTL -n "DELETE_NODE91_translateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grp1Chin1|malcolm1:grpChin1|malcolm1:ctlChin1.translateX"; +createNode animCurveTL -n "DELETE_NODE91_translateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grp1Chin1|malcolm1:grpChin1|malcolm1:ctlChin1.translateY"; +createNode animCurveTL -n "DELETE_NODE91_translateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grp1Chin1|malcolm1:grpChin1|malcolm1:ctlChin1.translateZ"; +createNode animCurveTU -n "DELETE_NODE91_scaleX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grp1Chin1|malcolm1:grpChin1|malcolm1:ctlChin1.scaleX"; +createNode animCurveTU -n "DELETE_NODE91_scaleY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grp1Chin1|malcolm1:grpChin1|malcolm1:ctlChin1.scaleY"; +createNode animCurveTU -n "DELETE_NODE91_scaleZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 2 ".ktv[0:1]" 1 1 6 1; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grp1Chin1|malcolm1:grpChin1|malcolm1:ctlChin1.scaleZ"; +createNode animCurveTA -n "DELETE_NODE91_rotateX"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grp1Chin1|malcolm1:grpChin1|malcolm1:ctlChin1.rotateX"; +createNode animCurveTA -n "DELETE_NODE91_rotateY"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grp1Chin1|malcolm1:grpChin1|malcolm1:ctlChin1.rotateY"; +createNode animCurveTA -n "DELETE_NODE91_rotateZ"; + addAttr -ci true -sn "fullname" -ln "fullname" -dt "string"; + setAttr ".tan" 18; + setAttr ".wgt" no; + setAttr -s 3 ".ktv[0:2]" 1 0 6 0 10 0; + setAttr ".pre" 4; + setAttr ".pst" 4; + setAttr -k on ".fullname" -type "string" "|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grp1Chin1|malcolm1:grpChin1|malcolm1:ctlChin1.rotateZ"; +select -ne :time1; + setAttr ".o" 9; + setAttr ".unw" 9; +select -ne :renderPartition; + setAttr -s 230 ".st"; +select -ne :initialShadingGroup; + setAttr ".ro" yes; +select -ne :initialParticleSE; + setAttr ".ro" yes; +select -ne :defaultShaderList1; + setAttr -s 218 ".s"; +select -ne :postProcessList1; + setAttr -s 2 ".p"; +select -ne :defaultRenderUtilityList1; + setAttr -s 120 ".u"; +select -ne :defaultRenderingList1; + setAttr -s 6 ".r"; +select -ne :renderGlobalsList1; +select -ne :hardwareRenderGlobals; + setAttr ".ctrs" 256; + setAttr ".btrs" 512; +select -ne :defaultHardwareRenderGlobals; + setAttr ".fn" -type "string" "im"; + setAttr ".res" -type "string" "ntsc_4d 646 485 1.333"; +select -ne :characterPartition; +select -ne :ikSystem; + setAttr -s 7 ".sol"; +select -ne :hyperGraphLayout; + setAttr -s 3 ".hyp"; +// End of animation.ma diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_older_version.anim/pose.dict b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_older_version.anim/pose.dict new file mode 100644 index 0000000..fee0538 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_older_version.anim/pose.dict @@ -0,0 +1 @@ +{u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', -4.1213113705648654), u'rotateY': (u'doubleAngle', 5.5893874365085248), u'rotateZ': (u'doubleAngle', 4.4369908596991907), u'orientToPlacement': (u'double', 1.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp1Lf|malcolm1:ctlTeethTp1Lf': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotLf|malcolm1:earPivotLf|malcolm1:grpEarLf|malcolm1:ctlEarLf|malcolm1:grpEar2Lf|malcolm1:ctlEar2Lf': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpHeadOrient|malcolm1:ctlHeadOrient': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpEyeLf|malcolm1:grpEyeLid1Lf|malcolm1:ctlEyeLf|malcolm1:eyeLidDrivenLf|malcolm1:ctlEyeLidLf': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:lipJointsSpacedRt_NeutralPose|malcolm1:lipJointsSpacedRt|malcolm1:grpLipTp2SpacedRt|malcolm1:grp2Driven1LipTp2Rt|malcolm1:grp1Driven1LipTp2Rt|malcolm1:ctlLipTp2Rt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grp1Chin1|malcolm1:grpChin1|malcolm1:ctlChin1': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerRt|malcolm1:ctlCornerRt': {u'nasoCrease': (u'double', 0.0), u'cornerHeight': (u'double', 0.0), u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'cornerPinchIn': (u'double', 0.0), u'pucker': (u'double', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0), u'disableAutoPucker': (u'double', 0.0), u'cornerPinchOt': (u'double', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidCrnInLf|malcolm1:ctlLidCrnInLf': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersLf|malcolm1:grpEyeShaperBtLf|malcolm1:ctlEyeShaperBtLf': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:grpCheek1SpacedRt|malcolm1:ctlCheek1Rt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0), u'puff': (u'double', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp|malcolm1:grpLipTpCtSpaced|malcolm1:grp2Driven1LipTpCt|malcolm1:grp1Driven1LipTpCt|malcolm1:ctlLipTpCt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTpCt|malcolm1:ctlTeethTpCt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowInRt|malcolm1:ctlBrowInRt': {u'translateX': (u'doubleLinear', 8.8817841970009802e-16), u'translateY': (u'doubleLinear', 0.88330452769852763), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidCrnOtLf|malcolm1:ctlLidCrnOtLf': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBtCt|malcolm1:ctlTeethBtCt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBtLower2Rt|malcolm1:ctlTeethBtLower2Rt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grp4LipCornerSkinLf|malcolm1:grp3LipCornerSkinLf|malcolm1:grp2LipCornerSkinLf|malcolm1:ctlLipCornerSkinLf': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipJointsSpacedLf|malcolm1:grpLipCrnSpacedLf|malcolm1:grp2Driven1LipCrnLf|malcolm1:grp1Driven1LipCrnLf|malcolm1:ctlLipCrnLf|malcolm1:grpLipCrnTpSpacedLf|malcolm1:ctlLipCrnTpLf': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotRt|malcolm1:earPivotRt|malcolm1:grpEarRt|malcolm1:ctlEarRt|malcolm1:grpEar2Rt|malcolm1:ctlEar2Rt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidCrnInRt|malcolm1:ctlLidCrnInRt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowMdLf|malcolm1:ctlBrowMdLf': {u'translateX': (u'doubleLinear', 4.4408920985004368e-16), u'translateY': (u'doubleLinear', 0.88330452769852819), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBtLower2Lf|malcolm1:ctlTeethBtLower2Lf': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersLf|malcolm1:grpEyeShaperTpLf|malcolm1:ctlEyeShaperTpLf': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt2Rt|malcolm1:ctlTeethBt2Rt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpHeadShaperRigJawAttachSpaced|malcolm1:grpLipBt2SpacedLf|malcolm1:grp2Driven1LipBt2Lf|malcolm1:grp1Driven1LipBt2Lf|malcolm1:ctlLipBt2Lf': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNose|malcolm1:ctlNose1': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'noseBrowCrunch': (u'double', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt|malcolm1:grpLipBtCtSpaced|malcolm1:grp2Driven1LipBtCt|malcolm1:grp1Driven1LipBtCt|malcolm1:ctlLipBtCt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grp4LipCornerSkinRt|malcolm1:grp3LipCornerSkinRt|malcolm1:grp2LipCornerSkinRt|malcolm1:ctlLipCornerSkinRt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp': {u'md': (u'double', 0.0), u'funnel': (u'double', 0.0), u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'thicknessY': (u'double', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 18.007232567490711), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0), u'peak': (u'double', 0.0), u'press': (u'double', 0.0), u'puff': (u'double', 0.0), u'thicknessZ': (u'double', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipCrnSpacedRt|malcolm1:grp2Driven1LipCrnRt|malcolm1:grp1Driven1LipCrnRt|malcolm1:ctlLipCrnRt|malcolm1:grpLipCrnTpSpacedRt|malcolm1:ctlLipCrnTpRt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTpUpper2Lf|malcolm1:ctlTeethTpUpper2Lf': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2|malcolm1:grpTongue3|malcolm1:ctlTongue3': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grp1CheekTpOtSpacedLf|malcolm1:ctlCheekTpOtLf': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpMentalis|malcolm1:ctlMentalis': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp2Rt|malcolm1:ctlTeethTp2Rt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpHeadShaperRigSpaced|malcolm1:grpCheek1SpacedLf|malcolm1:ctlCheek1Lf': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0), u'puff': (u'double', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipCrnSpacedRt|malcolm1:grp2Driven1LipCrnRt|malcolm1:grp1Driven1LipCrnRt|malcolm1:ctlLipCrnRt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidBtRt|malcolm1:ctlLidBtRt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0), u'lidCheek': (u'double', 1.0), u'squint': (u'double', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpCornerLf|malcolm1:ctlCornerLf': {u'nasoCrease': (u'double', 0.0), u'cornerHeight': (u'double', 0.0), u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'cornerPinchIn': (u'double', 0.0), u'pucker': (u'double', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0), u'disableAutoPucker': (u'double', 0.0), u'cornerPinchOt': (u'double', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHairRig|malcolm1:grpHairFront|malcolm1:ctlHairFront': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersRt|malcolm1:grpEyeShaperBtRt|malcolm1:ctlEyeShaperBtRt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt1Rt|malcolm1:ctlTeethBt1Rt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp1Rt|malcolm1:ctlTeethTp1Rt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipJointsSpacedLf|malcolm1:grpLipCrnSpacedLf|malcolm1:grp2Driven1LipCrnLf|malcolm1:grp1Driven1LipCrnLf|malcolm1:ctlLipCrnLf': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2|malcolm1:grpTongue3|malcolm1:ctlTongue3|malcolm1:grpTongue4|malcolm1:ctlTongue4': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidBtLf|malcolm1:ctlLidBtLf': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0), u'lidCheek': (u'double', 1.0), u'squint': (u'double', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:lipBtDriven|malcolm1:ctlLipBt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt|malcolm1:grpLipBt1SpacedRt|malcolm1:grp2Driven1LipBt1Rt|malcolm1:grp1Driven1LipBt1Rt|malcolm1:ctlLipBt1Rt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt|malcolm1:grpLipBt1SpacedLf|malcolm1:grp2Driven1LipBt1Lf|malcolm1:grp1Driven1LipBt1Lf|malcolm1:ctlLipBt1Lf': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpLidTpLf|malcolm1:ctlLidTpLf': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0), u'squint': (u'double', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpEyeRt|malcolm1:grpEyeLid1Rt|malcolm1:ctlEyeRt|malcolm1:eyeLidDrivenRt|malcolm1:ctlEyeLidRt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipTpSkin1Driven|malcolm1:ctlLipTp': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowOtRt|malcolm1:ctlBrowOtRt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNoseRt|malcolm1:ctlNoseRt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpHeadShaperRigJawAttachSpaced|malcolm1:grpLipBt2SpacedRt|malcolm1:grp2Driven1LipBt2Rt|malcolm1:grp1Driven1LipBt2Rt|malcolm1:ctlLipBt2Rt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpPupilRt|malcolm1:ctlPupilRt': {u'iris': (u'double', 0.0), u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'eyeShaperVis': (u'bool', False), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'aim': (u'double', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0), u'eyeBulge': (u'double', 0.0), u'pupil': (u'double', 0.0), u'lidShaperVis': (u'bool', False), u'rotateX': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipTp2SpacedLf|malcolm1:grp2Driven1LipTp2Lf|malcolm1:grp1Driven1LipTp2Lf|malcolm1:ctlLipTp2Lf': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowInLf|malcolm1:ctlBrowInLf': {u'translateX': (u'doubleLinear', 8.8817841970009752e-16), u'translateY': (u'doubleLinear', 0.88330452769852741), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt1Lf|malcolm1:ctlTeethBt1Lf': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowMdRt|malcolm1:ctlBrowMdRt': {u'translateX': (u'doubleLinear', 4.4408920985004368e-16), u'translateY': (u'doubleLinear', 0.88330452769852785), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:lipJointsSpacedLf|malcolm1:grpLipCrnSpacedLf|malcolm1:grp2Driven1LipCrnLf|malcolm1:grp1Driven1LipCrnLf|malcolm1:ctlLipCrnLf|malcolm1:grpLipCrnBtSpacedLf|malcolm1:ctlLipCrnBtLf': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHairRig|malcolm1:grpHairFront|malcolm1:ctlHairFront|malcolm1:grpFHair1|malcolm1:ctlFHair2': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'visibility': (u'bool', True), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0), u'scaleZ': (u'double', 1.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotRt|malcolm1:earPivotRt|malcolm1:grpEarRt|malcolm1:ctlEarRt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2|malcolm1:grpTongue3|malcolm1:ctlTongue3|malcolm1:grpTongue4|malcolm1:ctlTongue4|malcolm1:grpTongue5|malcolm1:ctlTongue5': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidTpRt|malcolm1:ctlLidTpRt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0), u'squint': (u'double', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp': {u'squetch': (u'double', 0.0), u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTpUpper2Rt|malcolm1:ctlTeethTpUpper2Rt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grpEyeShapers|malcolm1:grpEyeShapersRt|malcolm1:grpEyeShaperTpRt|malcolm1:ctlEyeShaperTpRt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpLidCrnOtRt|malcolm1:ctlLidCrnOtRt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipCrnSpacedRt|malcolm1:grp2Driven1LipCrnRt|malcolm1:grp1Driven1LipCrnRt|malcolm1:ctlLipCrnRt|malcolm1:grpLipCrnBtSpacedRt|malcolm1:ctlLipCrnBtRt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp|malcolm1:grpLipTp1SpacedRt|malcolm1:grp2Driven1LipTp1Rt|malcolm1:grp1Driven1LipTp1Rt|malcolm1:ctlLipTp1Rt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grp1CheekTpOtSpacedRt|malcolm1:ctlCheekTpOtRt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpTeethBt|malcolm1:ctlTeethBt|malcolm1:grpTeethBt2Lf|malcolm1:ctlTeethBt2Lf': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:jntJawRot|malcolm1:grpTongueRig|malcolm1:grpTongue1|malcolm1:ctlTongue1|malcolm1:grpTongue2|malcolm1:ctlTongue2': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpBrowOtLf|malcolm1:ctlBrowOtLf': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpEyeLf|malcolm1:grpEyeLid1Lf|malcolm1:ctlEyeLf': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 0.89602022283079519), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllRt|malcolm1:grpEyeRt|malcolm1:grpEyeLid1Rt|malcolm1:ctlEyeRt': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 0.89602022283079519), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:ctlHeadTp|malcolm1:grp1HeadTp|malcolm1:grpHeadTpParts|malcolm1:grpEyeAllLf|malcolm1:grpPupilLf|malcolm1:ctlPupilLf': {u'iris': (u'double', 0.0), u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'eyeShaperVis': (u'bool', False), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'aim': (u'double', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0), u'eyeBulge': (u'double', 0.0), u'pupil': (u'double', 0.0), u'lidShaperVis': (u'bool', False), u'rotateX': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpLipAllTp|malcolm1:ctlLipAll|malcolm1:grpLipMdTp|malcolm1:ctlLipMdTp|malcolm1:grpLipTp1SpacedLf|malcolm1:grp2Driven1LipTp1Lf|malcolm1:grp1Driven1LipTp1Lf|malcolm1:ctlLipTp1Lf': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:jawTrans1|malcolm1:jawRot1|malcolm1:jawTrans|malcolm1:ctlJawRot|malcolm1:jawRot|malcolm1:grpLipMdBt|malcolm1:ctlLipMdBt': {u'md': (u'double', 0.0), u'funnel': (u'double', 0.0), u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'thicknessY': (u'double', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 1.2258616735674603), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0), u'peak': (u'double', 0.0), u'press': (u'double', 0.0), u'puff': (u'double', 0.0), u'thicknessZ': (u'double', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:ctlHeadBt|malcolm1:grpTeethTp|malcolm1:ctlTeethTp|malcolm1:grpTeethTp2Lf|malcolm1:ctlTeethTp2Lf': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:grpHeadTp|malcolm1:grpEarPivotLf|malcolm1:earPivotLf|malcolm1:grpEarLf|malcolm1:ctlEarLf': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:grpHeadBt|malcolm1:grp1Nose|malcolm1:grpNoseLf|malcolm1:ctlNoseLf': {u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0), u'translateZ': (u'doubleLinear', 0.0), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'rotateX': (u'doubleAngle', 0.0), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0)}, u'|malcolm1:malcolm|malcolm1:ctlPlacement|malcolm1:grpBodyPivot1|malcolm1:ctlBodyPivot1|malcolm1:grpBody|malcolm1:ctlBody|malcolm1:ctlBodyGimbal|malcolm1:grpBodyPivot2|malcolm1:ctlBodyPivot2|malcolm1:transfogroup1|malcolm1:grpSpine1|malcolm1:grpSpine2|malcolm1:ctlSpine1|malcolm1:ctlSpineGimbal1|malcolm1:grpSpine3|malcolm1:ctlSpine2|malcolm1:ctlSpineGimbal2|malcolm1:grpChest1|malcolm1:ctlChest1|malcolm1:ctlChestGimbal1|malcolm1:grpChest2|malcolm1:ctlChest2|malcolm1:ctlChestGimbal2|malcolm1:grpNeck1|malcolm1:ctlNeck1|malcolm1:grpNeck1Twist|malcolm1:ctlNeck1Twist|malcolm1:grpNeck2|malcolm1:ctlNeck2|malcolm1:grp1Head|malcolm1:grpHead|malcolm1:ctlHead|malcolm1:ctlHeadGimbal|malcolm1:grpHeadAll|malcolm1:jawCtrl1|malcolm1:ctlJaw': {u'jawStretch': (u'double', 0.0), u'translateX': (u'doubleLinear', 0.0), u'translateY': (u'doubleLinear', 0.0033959318634735991), u'translateZ': (u'doubleLinear', 0.037225733300033453), u'scaleX': (u'double', 1.0), u'scaleY': (u'double', 1.0), u'scaleZ': (u'double', 1.0), u'lipsSeal': (u'double', 0.0), u'rotateX': (u'doubleAngle', -5.2124021846970194), u'rotateY': (u'doubleAngle', 0.0), u'rotateZ': (u'doubleAngle', 0.0), u'lipSealHeight': (u'double', 0.0)}} \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_older_version.dict b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_older_version.dict new file mode 100644 index 0000000..d3fafbd --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_older_version.dict @@ -0,0 +1,34 @@ +{'srcSphere:sphere': { + 'rotateX': ('doubleAngle', 45.0), + 'testEnum': ('enum', 1), + 'translateX': ('doubleLinear', 0.0), + 'translateY': ('doubleLinear', 8.0), + 'translateZ': ('doubleLinear', -12.0), + 'rotateY': ('doubleAngle', 50.0), + 'testFloat': ('double', 0.66600000000000004), + 'testAnimated': ('double', 0.0), + 'scaleX': ('double', 0.25), + 'scaleY': ('double', 4.6600000000000001), + 'visibility': ('bool', True), + 'testString': ('string', u'Hello world'), + 'testVectorX': ('double', 0.20000000000000001), + 'testVectorY': ('double', 1.3999999999999999), + 'rotateZ': ('doubleAngle', 90.0), + 'testVectorZ': ('double', 2.6000000000000001), + 'scaleZ': ('double', 0.5), + 'testInteger': ('long', 5), + 'testBoolean': ('bool', True), + 'testConnect': ('double', 8.0) +}, +'srcSphere:lockedNode': { + 'translateX': ('doubleLinear', 0.0), + 'translateY': ('doubleLinear', 5.0), + 'translateZ': ('doubleLinear', 0.0), + 'scaleX': ('double', 1.0), + 'scaleY': ('double', 1.0), + 'visibility': ('bool', True), + 'rotateX': ('doubleAngle', 0.0), + 'rotateY': ('doubleAngle', 0.0), + 'rotateZ': ('doubleAngle', 0.0), + 'scaleZ': ('double', 1.0) +}} \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_pose.ma b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_pose.ma new file mode 100644 index 0000000..f57ec86 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_pose.ma @@ -0,0 +1,269 @@ +//Maya ASCII 2012 scene +//Name: test_pose_attributes.ma +//Last modified: Sun, May 11, 2014 11:20:29 AM +//Codeset: 1252 +file -rdi 1 -ns "srcSphere" -rfn "srcSphereRN" "C:/Users/hovel/Dropbox/packages/python/Lib/site-packages/studioLibrary/site-packages/mutils/tests/data/sphere.ma"; +file -rdi 1 -ns "dstSphere" -rfn "dstSphereRN" "C:/Users/hovel/Dropbox/packages/python/Lib/site-packages/studioLibrary/site-packages/mutils/tests/data/sphere.ma"; +file -r -ns "srcSphere" -dr 1 -rfn "srcSphereRN" "C:/Users/hovel/Dropbox/packages/python/Lib/site-packages/studioLibrary/site-packages/mutils/tests/data/sphere.ma"; +file -r -ns "dstSphere" -dr 1 -rfn "dstSphereRN" "C:/Users/hovel/Dropbox/packages/python/Lib/site-packages/studioLibrary/site-packages/mutils/tests/data/sphere.ma"; +requires maya "2011"; +currentUnit -l centimeter -a degree -t film; +fileInfo "application" "maya"; +fileInfo "product" "Maya 2014"; +fileInfo "version" "2014 x64"; +fileInfo "cutIdentifier" "201303010241-864206"; +fileInfo "osv" "Microsoft Windows 7 Ultimate Edition, 64-bit Windows 7 Service Pack 1 (Build 7601)\n"; +createNode transform -s -n "persp"; + setAttr ".v" no; + setAttr ".t" -type "double3" -28.491244113009635 26.169676127690515 68.655966560486604 ; + setAttr ".r" -type "double3" -16.538352729583153 -22.60000000001666 4.306379281917478e-016 ; +createNode camera -s -n "perspShape" -p "persp"; + setAttr -k off ".v" no; + setAttr ".fl" 34.999999999999993; + setAttr ".coi" 76.176692107312178; + setAttr ".imn" -type "string" "persp"; + setAttr ".den" -type "string" "persp_depth"; + setAttr ".man" -type "string" "persp_mask"; + setAttr ".hc" -type "string" "viewSet -p %camera"; +createNode transform -s -n "top"; + setAttr ".v" no; + setAttr ".t" -type "double3" 0 100.1 0 ; + setAttr ".r" -type "double3" -89.999999999999986 0 0 ; +createNode camera -s -n "topShape" -p "top"; + setAttr -k off ".v" no; + setAttr ".rnd" no; + setAttr ".coi" 100.1; + setAttr ".ow" 30; + setAttr ".imn" -type "string" "top"; + setAttr ".den" -type "string" "top_depth"; + setAttr ".man" -type "string" "top_mask"; + setAttr ".hc" -type "string" "viewSet -t %camera"; + setAttr ".o" yes; +createNode transform -s -n "front"; + setAttr ".v" no; + setAttr ".t" -type "double3" 2.0350096678112575 0.39361762628711539 100.1 ; +createNode camera -s -n "frontShape" -p "front"; + setAttr -k off ".v" no; + setAttr ".rnd" no; + setAttr ".coi" 100.1; + setAttr ".ow" 61.766282942468983; + setAttr ".imn" -type "string" "front"; + setAttr ".den" -type "string" "front_depth"; + setAttr ".man" -type "string" "front_mask"; + setAttr ".hc" -type "string" "viewSet -f %camera"; + setAttr ".o" yes; +createNode transform -s -n "side"; + setAttr ".v" no; + setAttr ".t" -type "double3" 100.1 0 0 ; + setAttr ".r" -type "double3" 0 89.999999999999986 0 ; +createNode camera -s -n "sideShape" -p "side"; + setAttr -k off ".v" no; + setAttr ".rnd" no; + setAttr ".coi" 100.1; + setAttr ".ow" 30; + setAttr ".imn" -type "string" "side"; + setAttr ".den" -type "string" "side_depth"; + setAttr ".man" -type "string" "side_mask"; + setAttr ".hc" -type "string" "viewSet -s %camera"; + setAttr ".o" yes; +createNode lightLinker -s -n "lightLinker1"; + setAttr -s 2 ".lnk"; + setAttr -s 2 ".slnk"; +createNode displayLayerManager -n "layerManager"; +createNode displayLayer -n "defaultLayer"; +createNode renderLayerManager -n "renderLayerManager"; +createNode renderLayer -n "defaultRenderLayer"; + setAttr ".g" yes; +createNode script -n "uiConfigurationScriptNode"; + setAttr ".b" -type "string" ( + "// Maya Mel UI Configuration File.\n//\n// This script is machine generated. Edit at your own risk.\n//\n//\n\nglobal string $gMainPane;\nif (`paneLayout -exists $gMainPane`) {\n\n\tglobal int $gUseScenePanelConfig;\n\tint $useSceneConfig = $gUseScenePanelConfig;\n\tint $menusOkayInPanels = `optionVar -q allowMenusInPanels`;\tint $nVisPanes = `paneLayout -q -nvp $gMainPane`;\n\tint $nPanes = 0;\n\tstring $editorName;\n\tstring $panelName;\n\tstring $itemFilterName;\n\tstring $panelConfig;\n\n\t//\n\t// get current state of the UI\n\t//\n\tsceneUIReplacement -update $gMainPane;\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"modelPanel\" (localizedPanelLabel(\"Top View\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `modelPanel -unParent -l (localizedPanelLabel(\"Top View\")) -mbv $menusOkayInPanels `;\n\t\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"top\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"wireframe\" \n" + + " -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 1\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 8192\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -maxConstantTransparency 1\n -rendererName \"base_OpenGL_Renderer\" \n" + + " -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n" + + " -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tmodelPanel -edit -l (localizedPanelLabel(\"Top View\")) -mbv $menusOkayInPanels $panelName;\n" + + "\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"top\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"wireframe\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 1\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 8192\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -maxConstantTransparency 1\n" + + " -rendererName \"base_OpenGL_Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n" + + " -ikHandles 1\n -deformers 1\n -dynamics 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"modelPanel\" (localizedPanelLabel(\"Side View\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `modelPanel -unParent -l (localizedPanelLabel(\"Side View\")) -mbv $menusOkayInPanels `;\n" + + "\t\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"side\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"wireframe\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 1\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 8192\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n" + + " -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -maxConstantTransparency 1\n -rendererName \"base_OpenGL_Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n" + + " -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n" + + " $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tmodelPanel -edit -l (localizedPanelLabel(\"Side View\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"side\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"wireframe\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 1\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 8192\n -fogging 0\n -fogSource \"fragment\" \n" + + " -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -maxConstantTransparency 1\n -rendererName \"base_OpenGL_Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n" + + " -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"modelPanel\" (localizedPanelLabel(\"Front View\")) `;\n" + + "\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `modelPanel -unParent -l (localizedPanelLabel(\"Front View\")) -mbv $menusOkayInPanels `;\n\t\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"front\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"wireframe\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 1\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n" + + " -textureMaxSize 8192\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -maxConstantTransparency 1\n -rendererName \"base_OpenGL_Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n" + + " -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n" + + " -shadows 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tmodelPanel -edit -l (localizedPanelLabel(\"Front View\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"front\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"wireframe\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 1\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n" + + " -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 8192\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -maxConstantTransparency 1\n -rendererName \"base_OpenGL_Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n" + + " -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n" + + " modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"modelPanel\" (localizedPanelLabel(\"Persp View\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `modelPanel -unParent -l (localizedPanelLabel(\"Persp View\")) -mbv $menusOkayInPanels `;\n\t\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"persp\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"wireframe\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 1\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n" + + " -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 8192\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -maxConstantTransparency 1\n -rendererName \"base_OpenGL_Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n" + + " -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 0\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -fluids 0\n -hairSystems 0\n -follicles 0\n -nCloths 0\n -nParticles 0\n -nRigids 0\n -dynamicConstraints 0\n -locators 1\n -manipulators 1\n -pluginShapes 1\n" + + " -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 0\n -greasePencils 1\n -shadows 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tmodelPanel -edit -l (localizedPanelLabel(\"Persp View\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"persp\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"wireframe\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n" + + " -twoSidedLighting 1\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 8192\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -maxConstantTransparency 1\n -rendererName \"base_OpenGL_Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n" + + " -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 0\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -fluids 0\n -hairSystems 0\n -follicles 0\n -nCloths 0\n -nParticles 0\n -nRigids 0\n -dynamicConstraints 0\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n" + + " -strokes 1\n -motionTrails 1\n -clipGhosts 0\n -greasePencils 1\n -shadows 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"outlinerPanel\" (localizedPanelLabel(\"Outliner\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `outlinerPanel -unParent -l (localizedPanelLabel(\"Outliner\")) -mbv $menusOkayInPanels `;\n\t\t\t$editorName = $panelName;\n outlinerEditor -e \n -docTag \"isolOutln_fromSeln\" \n -showShapes 1\n -showReferenceNodes 1\n -showReferenceMembers 0\n -showAttributes 0\n -showConnected 0\n -showAnimCurvesOnly 0\n -showMuteInfo 0\n -organizeByLayer 1\n -showAnimLayerWeight 1\n" + + " -autoExpandLayers 1\n -autoExpand 0\n -showDagOnly 1\n -showAssets 1\n -showContainedOnly 1\n -showPublishedAsConnected 0\n -showContainerContents 1\n -ignoreDagHierarchy 0\n -expandConnections 0\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 1\n -showLeafs 1\n -showNumericAttrsOnly 0\n -highlightActive 1\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"defaultSetFilter\" \n -showSetMembers 1\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n" + + " -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 0\n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\toutlinerPanel -edit -l (localizedPanelLabel(\"Outliner\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n outlinerEditor -e \n -docTag \"isolOutln_fromSeln\" \n -showShapes 1\n -showReferenceNodes 1\n -showReferenceMembers 0\n -showAttributes 0\n -showConnected 0\n -showAnimCurvesOnly 0\n -showMuteInfo 0\n -organizeByLayer 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n" + + " -autoExpand 0\n -showDagOnly 1\n -showAssets 1\n -showContainedOnly 1\n -showPublishedAsConnected 0\n -showContainerContents 1\n -ignoreDagHierarchy 0\n -expandConnections 0\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 1\n -showLeafs 1\n -showNumericAttrsOnly 0\n -highlightActive 1\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"defaultSetFilter\" \n -showSetMembers 1\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n" + + " -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 0\n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\tif ($useSceneConfig) {\n\t\toutlinerPanel -e -to $panelName;\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"graphEditor\" (localizedPanelLabel(\"Graph Editor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"graphEditor\" -l (localizedPanelLabel(\"Graph Editor\")) -mbv $menusOkayInPanels `;\n\n\t\t\t$editorName = ($panelName+\"OutlineEd\");\n outlinerEditor -e \n -showShapes 1\n -showReferenceNodes 0\n -showReferenceMembers 1\n -showAttributes 1\n -showConnected 1\n -showAnimCurvesOnly 1\n -showMuteInfo 1\n" + + " -organizeByLayer 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 1\n -showDagOnly 0\n -showAssets 1\n -showContainedOnly 0\n -showPublishedAsConnected 0\n -showContainerContents 0\n -ignoreDagHierarchy 0\n -expandConnections 1\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 0\n -showLeafs 1\n -showNumericAttrsOnly 1\n -highlightActive 0\n -autoSelectNewObjects 1\n -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 1\n -setFilter \"0\" \n -showSetMembers 0\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n" + + " -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 1\n -mapMotionTrails 1\n $editorName;\n\n\t\t\t$editorName = ($panelName+\"GraphEd\");\n animCurveEditor -e \n -displayKeys 1\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 1\n -displayInfinities 0\n -autoFit 0\n -snapTime \"integer\" \n -snapValue \"none\" \n -showResults \"off\" \n -showBufferCurves \"off\" \n -smoothness \"fine\" \n -resultSamples 1\n" + + " -resultScreenSamples 0\n -resultUpdate \"delayed\" \n -showUpstreamCurves 1\n -stackedCurves 0\n -stackedCurvesMin -1\n -stackedCurvesMax 1\n -stackedCurvesSpace 0.2\n -displayNormalized 0\n -preSelectionHighlight 0\n -constrainDrag 0\n -classicMode 1\n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Graph Editor\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = ($panelName+\"OutlineEd\");\n outlinerEditor -e \n -showShapes 1\n -showReferenceNodes 0\n -showReferenceMembers 1\n -showAttributes 1\n -showConnected 1\n -showAnimCurvesOnly 1\n -showMuteInfo 1\n -organizeByLayer 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 1\n" + + " -showDagOnly 0\n -showAssets 1\n -showContainedOnly 0\n -showPublishedAsConnected 0\n -showContainerContents 0\n -ignoreDagHierarchy 0\n -expandConnections 1\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 0\n -showLeafs 1\n -showNumericAttrsOnly 1\n -highlightActive 0\n -autoSelectNewObjects 1\n -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 1\n -setFilter \"0\" \n -showSetMembers 0\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n" + + " -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 1\n -mapMotionTrails 1\n $editorName;\n\n\t\t\t$editorName = ($panelName+\"GraphEd\");\n animCurveEditor -e \n -displayKeys 1\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 1\n -displayInfinities 0\n -autoFit 0\n -snapTime \"integer\" \n -snapValue \"none\" \n -showResults \"off\" \n -showBufferCurves \"off\" \n -smoothness \"fine\" \n -resultSamples 1\n -resultScreenSamples 0\n -resultUpdate \"delayed\" \n -showUpstreamCurves 1\n -stackedCurves 0\n" + + " -stackedCurvesMin -1\n -stackedCurvesMax 1\n -stackedCurvesSpace 0.2\n -displayNormalized 0\n -preSelectionHighlight 0\n -constrainDrag 0\n -classicMode 1\n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"dopeSheetPanel\" (localizedPanelLabel(\"Dope Sheet\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"dopeSheetPanel\" -l (localizedPanelLabel(\"Dope Sheet\")) -mbv $menusOkayInPanels `;\n\n\t\t\t$editorName = ($panelName+\"OutlineEd\");\n outlinerEditor -e \n -showShapes 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 1\n -showConnected 1\n -showAnimCurvesOnly 1\n -showMuteInfo 0\n -organizeByLayer 1\n -showAnimLayerWeight 1\n" + + " -autoExpandLayers 1\n -autoExpand 0\n -showDagOnly 0\n -showAssets 1\n -showContainedOnly 0\n -showPublishedAsConnected 0\n -showContainerContents 0\n -ignoreDagHierarchy 0\n -expandConnections 1\n -showUpstreamCurves 1\n -showUnitlessCurves 0\n -showCompounds 1\n -showLeafs 1\n -showNumericAttrsOnly 1\n -highlightActive 0\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 1\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"0\" \n -showSetMembers 0\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n" + + " -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 1\n $editorName;\n\n\t\t\t$editorName = ($panelName+\"DopeSheetEd\");\n dopeSheetEditor -e \n -displayKeys 1\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 0\n -displayInfinities 0\n -autoFit 0\n -snapTime \"integer\" \n -snapValue \"none\" \n -outliner \"dopeSheetPanel1OutlineEd\" \n -showSummary 1\n -showScene 0\n -hierarchyBelow 0\n -showTicks 0\n -selectionWindow 0 0 0 0 \n" + + " $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Dope Sheet\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = ($panelName+\"OutlineEd\");\n outlinerEditor -e \n -showShapes 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 1\n -showConnected 1\n -showAnimCurvesOnly 1\n -showMuteInfo 0\n -organizeByLayer 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 0\n -showDagOnly 0\n -showAssets 1\n -showContainedOnly 0\n -showPublishedAsConnected 0\n -showContainerContents 0\n -ignoreDagHierarchy 0\n -expandConnections 1\n -showUpstreamCurves 1\n -showUnitlessCurves 0\n -showCompounds 1\n -showLeafs 1\n" + + " -showNumericAttrsOnly 1\n -highlightActive 0\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 1\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"0\" \n -showSetMembers 0\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 1\n $editorName;\n" + + "\t\t\t$editorName = ($panelName+\"DopeSheetEd\");\n dopeSheetEditor -e \n -displayKeys 1\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 0\n -displayInfinities 0\n -autoFit 0\n -snapTime \"integer\" \n -snapValue \"none\" \n -outliner \"dopeSheetPanel1OutlineEd\" \n -showSummary 1\n -showScene 0\n -hierarchyBelow 0\n -showTicks 0\n -selectionWindow 0 0 0 0 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"clipEditorPanel\" (localizedPanelLabel(\"Trax Editor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"clipEditorPanel\" -l (localizedPanelLabel(\"Trax Editor\")) -mbv $menusOkayInPanels `;\n\n\t\t\t$editorName = clipEditorNameFromPanel($panelName);\n" + + " clipEditor -e \n -displayKeys 0\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 0\n -displayInfinities 0\n -autoFit 0\n -snapTime \"none\" \n -snapValue \"integer\" \n -manageSequencer 0 \n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Trax Editor\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = clipEditorNameFromPanel($panelName);\n clipEditor -e \n -displayKeys 0\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 0\n -displayInfinities 0\n -autoFit 0\n -snapTime \"none\" \n -snapValue \"integer\" \n -manageSequencer 0 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n" + + "\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"sequenceEditorPanel\" (localizedPanelLabel(\"Camera Sequencer\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"sequenceEditorPanel\" -l (localizedPanelLabel(\"Camera Sequencer\")) -mbv $menusOkayInPanels `;\n\n\t\t\t$editorName = sequenceEditorNameFromPanel($panelName);\n clipEditor -e \n -displayKeys 0\n -displayTangents 0\n -displayActiveKeys 0\n -displayActiveKeyTangents 0\n -displayInfinities 0\n -autoFit 0\n -snapTime \"none\" \n -snapValue \"none\" \n -manageSequencer 1 \n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Camera Sequencer\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = sequenceEditorNameFromPanel($panelName);\n clipEditor -e \n -displayKeys 0\n -displayTangents 0\n" + + " -displayActiveKeys 0\n -displayActiveKeyTangents 0\n -displayInfinities 0\n -autoFit 0\n -snapTime \"none\" \n -snapValue \"none\" \n -manageSequencer 1 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"hyperGraphPanel\" (localizedPanelLabel(\"Hypergraph Hierarchy\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"hyperGraphPanel\" -l (localizedPanelLabel(\"Hypergraph Hierarchy\")) -mbv $menusOkayInPanels `;\n\n\t\t\t$editorName = ($panelName+\"HyperGraphEd\");\n hyperGraph -e \n -graphLayoutStyle \"hierarchicalLayout\" \n -orientation \"horiz\" \n -mergeConnections 1\n -zoom 1\n -animateTransition 0\n -showRelationships 1\n -showShapes 0\n -showDeformers 0\n" + + " -showExpressions 0\n -showConstraints 0\n -showConnectionFromSelected 0\n -showConnectionToSelected 0\n -showUnderworld 0\n -showInvisible 0\n -transitionFrames 1\n -opaqueContainers 0\n -freeform 0\n -imagePosition 0 0 \n -imageScale 1\n -imageEnabled 0\n -graphType \"DAG\" \n -heatMapDisplay 0\n -updateSelection 1\n -updateNodeAdded 1\n -useDrawOverrideColor 0\n -limitGraphTraversal -1\n -range 0 0 \n -iconSize \"smallIcons\" \n -showCachedConnections 0\n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Hypergraph Hierarchy\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = ($panelName+\"HyperGraphEd\");\n hyperGraph -e \n -graphLayoutStyle \"hierarchicalLayout\" \n" + + " -orientation \"horiz\" \n -mergeConnections 1\n -zoom 1\n -animateTransition 0\n -showRelationships 1\n -showShapes 0\n -showDeformers 0\n -showExpressions 0\n -showConstraints 0\n -showConnectionFromSelected 0\n -showConnectionToSelected 0\n -showUnderworld 0\n -showInvisible 0\n -transitionFrames 1\n -opaqueContainers 0\n -freeform 0\n -imagePosition 0 0 \n -imageScale 1\n -imageEnabled 0\n -graphType \"DAG\" \n -heatMapDisplay 0\n -updateSelection 1\n -updateNodeAdded 1\n -useDrawOverrideColor 0\n -limitGraphTraversal -1\n -range 0 0 \n -iconSize \"smallIcons\" \n -showCachedConnections 0\n $editorName;\n\t\tif (!$useSceneConfig) {\n" + + "\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"hyperShadePanel\" (localizedPanelLabel(\"Hypershade\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"hyperShadePanel\" -l (localizedPanelLabel(\"Hypershade\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Hypershade\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"visorPanel\" (localizedPanelLabel(\"Visor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"visorPanel\" -l (localizedPanelLabel(\"Visor\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Visor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n" + + "\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"nodeEditorPanel\" (localizedPanelLabel(\"Node Editor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"nodeEditorPanel\" -l (localizedPanelLabel(\"Node Editor\")) -mbv $menusOkayInPanels `;\n\n\t\t\t$editorName = ($panelName+\"NodeEditorEd\");\n nodeEditor -e \n -allAttributes 0\n -allNodes 0\n -autoSizeNodes 1\n -createNodeCommand \"nodeEdCreateNodeCommand\" \n -defaultPinnedState 0\n -ignoreAssets 1\n -additiveGraphingMode 0\n -settingsChangedCallback \"nodeEdSyncControls\" \n -traversalDepthLimit -1\n -keyPressCommand \"nodeEdKeyPressCommand\" \n -keyReleaseCommand \"nodeEdKeyReleaseCommand\" \n -nodeTitleMode \"name\" \n -gridSnap 0\n -gridVisibility 1\n -popupMenuScript \"nodeEdBuildPanelMenus\" \n" + + " -island 0\n -showNamespace 1\n -showShapes 1\n -showSGShapes 0\n -showTransforms 1\n -syncedSelection 1\n -extendToShapes 1\n $editorName;;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Node Editor\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = ($panelName+\"NodeEditorEd\");\n nodeEditor -e \n -allAttributes 0\n -allNodes 0\n -autoSizeNodes 1\n -createNodeCommand \"nodeEdCreateNodeCommand\" \n -defaultPinnedState 0\n -ignoreAssets 1\n -additiveGraphingMode 0\n -settingsChangedCallback \"nodeEdSyncControls\" \n -traversalDepthLimit -1\n -keyPressCommand \"nodeEdKeyPressCommand\" \n -keyReleaseCommand \"nodeEdKeyReleaseCommand\" \n -nodeTitleMode \"name\" \n -gridSnap 0\n" + + " -gridVisibility 1\n -popupMenuScript \"nodeEdBuildPanelMenus\" \n -island 0\n -showNamespace 1\n -showShapes 1\n -showSGShapes 0\n -showTransforms 1\n -syncedSelection 1\n -extendToShapes 1\n $editorName;;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"createNodePanel\" (localizedPanelLabel(\"Create Node\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"createNodePanel\" -l (localizedPanelLabel(\"Create Node\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Create Node\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"polyTexturePlacementPanel\" (localizedPanelLabel(\"UV Texture Editor\")) `;\n" + + "\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"polyTexturePlacementPanel\" -l (localizedPanelLabel(\"UV Texture Editor\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"UV Texture Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"renderWindowPanel\" (localizedPanelLabel(\"Render View\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"renderWindowPanel\" -l (localizedPanelLabel(\"Render View\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Render View\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"blendShapePanel\" (localizedPanelLabel(\"Blend Shape\")) `;\n" + + "\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\tblendShapePanel -unParent -l (localizedPanelLabel(\"Blend Shape\")) -mbv $menusOkayInPanels ;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tblendShapePanel -edit -l (localizedPanelLabel(\"Blend Shape\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"dynRelEdPanel\" (localizedPanelLabel(\"Dynamic Relationships\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"dynRelEdPanel\" -l (localizedPanelLabel(\"Dynamic Relationships\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Dynamic Relationships\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"relationshipPanel\" (localizedPanelLabel(\"Relationship Editor\")) `;\n" + + "\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"relationshipPanel\" -l (localizedPanelLabel(\"Relationship Editor\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Relationship Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"referenceEditorPanel\" (localizedPanelLabel(\"Reference Editor\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"referenceEditorPanel\" -l (localizedPanelLabel(\"Reference Editor\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Reference Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"componentEditorPanel\" (localizedPanelLabel(\"Component Editor\")) `;\n" + + "\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"componentEditorPanel\" -l (localizedPanelLabel(\"Component Editor\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Component Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"dynPaintScriptedPanelType\" (localizedPanelLabel(\"Paint Effects\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"dynPaintScriptedPanelType\" -l (localizedPanelLabel(\"Paint Effects\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Paint Effects\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"scriptEditorPanel\" (localizedPanelLabel(\"Script Editor\")) `;\n" + + "\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"scriptEditorPanel\" -l (localizedPanelLabel(\"Script Editor\")) -mbv $menusOkayInPanels `;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Script Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\tif ($useSceneConfig) {\n\t\tscriptedPanel -e -to $panelName;\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"Stereo\" (localizedPanelLabel(\"Stereo\")) `;\n\tif (\"\" == $panelName) {\n\t\tif ($useSceneConfig) {\n\t\t\t$panelName = `scriptedPanel -unParent -type \"Stereo\" -l (localizedPanelLabel(\"Stereo\")) -mbv $menusOkayInPanels `;\nstring $editorName = ($panelName+\"Editor\");\n stereoCameraView -e \n -camera \"persp\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"wireframe\" \n -activeOnly 0\n -ignorePanZoom 0\n" + + " -wireframeOnShaded 0\n -headsUpDisplay 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 1\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 8192\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -maxConstantTransparency 1\n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 4 4 \n -bumpResolution 4 4 \n" + + " -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 0\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n" + + " -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n -displayMode \"centerEye\" \n -viewColor 0 0 0 1 \n -useCustomBackground 1\n $editorName;\n stereoCameraView -e -viewSelected 0 $editorName;\n stereoCameraView -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\t}\n\t} else {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Stereo\")) -mbv $menusOkayInPanels $panelName;\n" + + "string $editorName = ($panelName+\"Editor\");\n stereoCameraView -e \n -camera \"persp\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"wireframe\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 1\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 8192\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n" + + " -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -maxConstantTransparency 1\n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 4 4 \n -bumpResolution 4 4 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 0\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n" + + " -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -greasePencils 1\n -shadows 0\n -displayMode \"centerEye\" \n -viewColor 0 0 0 1 \n -useCustomBackground 1\n $editorName;\n stereoCameraView -e -viewSelected 0 $editorName;\n" + + " stereoCameraView -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\tif ($useSceneConfig) {\n string $configName = `getPanel -cwl (localizedPanelLabel(\"Current Layout\"))`;\n if (\"\" != $configName) {\n\t\t\tpanelConfiguration -edit -label (localizedPanelLabel(\"Current Layout\")) \n\t\t\t\t-defaultImage \"vacantCell.xpm\"\n\t\t\t\t-image \"\"\n\t\t\t\t-sc false\n\t\t\t\t-configString \"global string $gMainPane; paneLayout -e -cn \\\"single\\\" -ps 1 100 100 $gMainPane;\"\n\t\t\t\t-removeAllPanels\n\t\t\t\t-ap false\n\t\t\t\t\t(localizedPanelLabel(\"Persp View\")) \n\t\t\t\t\t\"modelPanel\"\n" + + "\t\t\t\t\t\"$panelName = `modelPanel -unParent -l (localizedPanelLabel(\\\"Persp View\\\")) -mbv $menusOkayInPanels `;\\n$editorName = $panelName;\\nmodelEditor -e \\n -cam `findStartUpCamera persp` \\n -useInteractiveMode 0\\n -displayLights \\\"default\\\" \\n -displayAppearance \\\"wireframe\\\" \\n -activeOnly 0\\n -ignorePanZoom 0\\n -wireframeOnShaded 0\\n -headsUpDisplay 1\\n -selectionHiliteDisplay 1\\n -useDefaultMaterial 0\\n -bufferMode \\\"double\\\" \\n -twoSidedLighting 1\\n -backfaceCulling 0\\n -xray 0\\n -jointXray 0\\n -activeComponentsXray 0\\n -displayTextures 0\\n -smoothWireframe 0\\n -lineWidth 1\\n -textureAnisotropic 0\\n -textureHilight 1\\n -textureSampling 2\\n -textureDisplay \\\"modulate\\\" \\n -textureMaxSize 8192\\n -fogging 0\\n -fogSource \\\"fragment\\\" \\n -fogMode \\\"linear\\\" \\n -fogStart 0\\n -fogEnd 100\\n -fogDensity 0.1\\n -fogColor 0.5 0.5 0.5 1 \\n -maxConstantTransparency 1\\n -rendererName \\\"base_OpenGL_Renderer\\\" \\n -objectFilterShowInHUD 1\\n -isFiltered 0\\n -colorResolution 256 256 \\n -bumpResolution 512 512 \\n -textureCompression 0\\n -transparencyAlgorithm \\\"frontAndBackCull\\\" \\n -transpInShadows 0\\n -cullingOverride \\\"none\\\" \\n -lowQualityLighting 0\\n -maximumNumHardwareLights 1\\n -occlusionCulling 0\\n -shadingModel 0\\n -useBaseRenderer 0\\n -useReducedRenderer 0\\n -smallObjectCulling 0\\n -smallObjectThreshold -1 \\n -interactiveDisableShadows 0\\n -interactiveBackFaceCull 0\\n -sortTransparent 1\\n -nurbsCurves 1\\n -nurbsSurfaces 1\\n -polymeshes 1\\n -subdivSurfaces 1\\n -planes 1\\n -lights 1\\n -cameras 1\\n -controlVertices 1\\n -hulls 1\\n -grid 1\\n -imagePlane 0\\n -joints 1\\n -ikHandles 1\\n -deformers 1\\n -dynamics 1\\n -fluids 0\\n -hairSystems 0\\n -follicles 0\\n -nCloths 0\\n -nParticles 0\\n -nRigids 0\\n -dynamicConstraints 0\\n -locators 1\\n -manipulators 1\\n -pluginShapes 1\\n -dimensions 1\\n -handles 1\\n -pivots 1\\n -textures 1\\n -strokes 1\\n -motionTrails 1\\n -clipGhosts 0\\n -greasePencils 1\\n -shadows 0\\n $editorName;\\nmodelEditor -e -viewSelected 0 $editorName;\\nmodelEditor -e \\n -pluginObjects \\\"gpuCacheDisplayFilter\\\" 1 \\n $editorName\"\n" + + "\t\t\t\t\t\"modelPanel -edit -l (localizedPanelLabel(\\\"Persp View\\\")) -mbv $menusOkayInPanels $panelName;\\n$editorName = $panelName;\\nmodelEditor -e \\n -cam `findStartUpCamera persp` \\n -useInteractiveMode 0\\n -displayLights \\\"default\\\" \\n -displayAppearance \\\"wireframe\\\" \\n -activeOnly 0\\n -ignorePanZoom 0\\n -wireframeOnShaded 0\\n -headsUpDisplay 1\\n -selectionHiliteDisplay 1\\n -useDefaultMaterial 0\\n -bufferMode \\\"double\\\" \\n -twoSidedLighting 1\\n -backfaceCulling 0\\n -xray 0\\n -jointXray 0\\n -activeComponentsXray 0\\n -displayTextures 0\\n -smoothWireframe 0\\n -lineWidth 1\\n -textureAnisotropic 0\\n -textureHilight 1\\n -textureSampling 2\\n -textureDisplay \\\"modulate\\\" \\n -textureMaxSize 8192\\n -fogging 0\\n -fogSource \\\"fragment\\\" \\n -fogMode \\\"linear\\\" \\n -fogStart 0\\n -fogEnd 100\\n -fogDensity 0.1\\n -fogColor 0.5 0.5 0.5 1 \\n -maxConstantTransparency 1\\n -rendererName \\\"base_OpenGL_Renderer\\\" \\n -objectFilterShowInHUD 1\\n -isFiltered 0\\n -colorResolution 256 256 \\n -bumpResolution 512 512 \\n -textureCompression 0\\n -transparencyAlgorithm \\\"frontAndBackCull\\\" \\n -transpInShadows 0\\n -cullingOverride \\\"none\\\" \\n -lowQualityLighting 0\\n -maximumNumHardwareLights 1\\n -occlusionCulling 0\\n -shadingModel 0\\n -useBaseRenderer 0\\n -useReducedRenderer 0\\n -smallObjectCulling 0\\n -smallObjectThreshold -1 \\n -interactiveDisableShadows 0\\n -interactiveBackFaceCull 0\\n -sortTransparent 1\\n -nurbsCurves 1\\n -nurbsSurfaces 1\\n -polymeshes 1\\n -subdivSurfaces 1\\n -planes 1\\n -lights 1\\n -cameras 1\\n -controlVertices 1\\n -hulls 1\\n -grid 1\\n -imagePlane 0\\n -joints 1\\n -ikHandles 1\\n -deformers 1\\n -dynamics 1\\n -fluids 0\\n -hairSystems 0\\n -follicles 0\\n -nCloths 0\\n -nParticles 0\\n -nRigids 0\\n -dynamicConstraints 0\\n -locators 1\\n -manipulators 1\\n -pluginShapes 1\\n -dimensions 1\\n -handles 1\\n -pivots 1\\n -textures 1\\n -strokes 1\\n -motionTrails 1\\n -clipGhosts 0\\n -greasePencils 1\\n -shadows 0\\n $editorName;\\nmodelEditor -e -viewSelected 0 $editorName;\\nmodelEditor -e \\n -pluginObjects \\\"gpuCacheDisplayFilter\\\" 1 \\n $editorName\"\n" + + "\t\t\t\t$configName;\n\n setNamedPanelLayout (localizedPanelLabel(\"Current Layout\"));\n }\n\n panelHistory -e -clear mainPanelHistory;\n setFocus `paneLayout -q -p1 $gMainPane`;\n sceneUIReplacement -deleteRemaining;\n sceneUIReplacement -clear;\n\t}\n\n\ngrid -spacing 5 -size 12 -divisions 5 -displayAxes yes -displayGridLines yes -displayDivisionLines yes -displayPerspectiveLabels no -displayOrthographicLabels no -displayAxesBold yes -perspectiveLabelPosition axis -orthographicLabelPosition edge;\nviewManip -drawCompass 1 -compassAngle 0 -frontParameters \"\" -homeParameters \"\" -selectionLockParameters \"\";\n}\n"); + setAttr ".st" 3; +createNode script -n "sceneConfigurationScriptNode"; + setAttr ".b" -type "string" "playbackOptions -min 1 -max 24 -ast 1 -aet 48 "; + setAttr ".st" 6; +createNode reference -n "srcSphereRN"; + setAttr ".ed" -type "dataReferenceEdits" + "srcSphereRN" + "srcSphereRN" 0 + "srcSphereRN" 14 + 2 "|srcSphere:group|srcSphere:sphere" "translate" " -type \"double3\" 0 8 -12" + + 2 "|srcSphere:group|srcSphere:sphere" "rotate" " -type \"double3\" 45 25 90" + + 2 "|srcSphere:group|srcSphere:sphere" "scale" " -type \"double3\" 0.25 1.5 0.5" + + 2 "|srcSphere:group|srcSphere:sphere" "testVector" " -k 1 -type \"double3\" 0.2 1.4 2.6" + + 2 "|srcSphere:group|srcSphere:sphere" "testVector" " -k 1" + 2 "|srcSphere:group|srcSphere:sphere" "testVectorX" " -k 1" + 2 "|srcSphere:group|srcSphere:sphere" "testVectorY" " -k 1" + 2 "|srcSphere:group|srcSphere:sphere" "testVectorZ" " -k 1" + 2 "|srcSphere:group|srcSphere:sphere" "testColor" " -type \"float3\" 0.18 0.6 0.18" + + 2 "|srcSphere:group|srcSphere:sphere" "testString" " -k 1 -type \"string\" \"Hello world\"" + + 2 "|srcSphere:group|srcSphere:sphere" "testEnum" " -k 1 1" + 2 "|srcSphere:group|srcSphere:sphere" "testFloat" " -k 1 0.666" + 2 "|srcSphere:group|srcSphere:sphere" "testBoolean" " -k 1 1" + 2 "|srcSphere:group|srcSphere:sphere" "testInteger" " -k 1 5"; + setAttr ".ptag" -type "string" ""; +lockNode -l 1 ; +createNode reference -n "dstSphereRN"; + setAttr ".ed" -type "dataReferenceEdits" + "dstSphereRN" + "dstSphereRN" 0 + "dstSphereRN" 13 + 2 "|dstSphere:group|dstSphere:sphere" "visibility" " 1" + 2 "|dstSphere:group|dstSphere:sphere" "translate" " -type \"double3\" 0 0 0" + + 2 "|dstSphere:group|dstSphere:sphere" "rotate" " -type \"double3\" 0 0 0" + + 2 "|dstSphere:group|dstSphere:sphere" "scale" " -type \"double3\" 1 1 1" + 2 "|dstSphere:group|dstSphere:sphere" "testVector" " -k 1 -type \"double3\" 0 0 0" + + 2 "|dstSphere:group|dstSphere:sphere" "testVector" " -k 1" + 2 "|dstSphere:group|dstSphere:sphere" "testVectorX" " -k 1" + 2 "|dstSphere:group|dstSphere:sphere" "testVectorY" " -k 1" + 2 "|dstSphere:group|dstSphere:sphere" "testVectorZ" " -k 1" + 2 "|dstSphere:group|dstSphere:sphere" "testEnum" " -k 1 2" + 2 "|dstSphere:group|dstSphere:sphere" "testFloat" " -k 1 0" + 2 "|dstSphere:group|dstSphere:sphere" "testBoolean" " -k 1 0" + 2 "|dstSphere:group|dstSphere:sphere" "testInteger" " -k 1 0"; + setAttr ".ptag" -type "string" ""; +lockNode -l 1 ; +select -ne :time1; + setAttr -k on ".cch"; + setAttr -k on ".nds"; + setAttr ".o" 1; + setAttr ".unw" 1; +select -ne :renderPartition; + setAttr -k on ".cch"; + setAttr -k on ".nds"; + setAttr -s 2 ".st"; +select -ne :initialShadingGroup; + setAttr -k on ".cch"; + setAttr -k on ".nds"; + setAttr -s 2 ".dsm"; + setAttr -k on ".mwc"; + setAttr ".ro" yes; +select -ne :initialParticleSE; + setAttr -k on ".cch"; + setAttr -k on ".nds"; + setAttr -k on ".mwc"; + setAttr ".ro" yes; +select -ne :defaultShaderList1; + setAttr -k on ".cch"; + setAttr -k on ".nds"; + setAttr -s 2 ".s"; +select -ne :postProcessList1; + setAttr -k on ".cch"; + setAttr -k on ".nds"; + setAttr -s 2 ".p"; +select -ne :defaultRenderingList1; + setAttr -s 3 ".r"; +select -ne :renderGlobalsList1; + setAttr -k on ".cch"; + setAttr -k on ".nds"; +select -ne :defaultResolution; + setAttr -k on ".cch"; + setAttr -k on ".nds"; + setAttr -av ".w"; + setAttr -av ".h"; + setAttr -k on ".pa" 1; + setAttr -k on ".al"; + setAttr -av ".dar"; + setAttr -k on ".ldar"; + setAttr -k on ".off"; + setAttr -k on ".fld"; + setAttr -k on ".zsl"; +select -ne :defaultLightSet; + setAttr -k on ".cch"; + setAttr -k on ".nds"; + setAttr -k on ".mwc"; + setAttr ".ro" yes; +select -ne :hardwareRenderGlobals; + setAttr -k on ".cch"; + setAttr -k on ".nds"; + setAttr ".ctrs" 256; + setAttr ".btrs" 512; +select -ne :hardwareRenderingGlobals; + setAttr ".otfna" -type "stringArray" 18 "NURBS Curves" "NURBS Surfaces" "Polygons" "Subdiv Surfaces" "Particles" "Fluids" "Image Planes" "UI:" "Lights" "Cameras" "Locators" "Joints" "IK Handles" "Deformers" "Motion Trails" "Components" "Misc. UI" "Ornaments" ; + setAttr ".otfva" -type "Int32Array" 18 0 1 1 1 1 1 + 1 0 0 0 0 0 0 0 0 0 0 0 ; +select -ne :defaultHardwareRenderGlobals; + setAttr -k on ".cch"; + setAttr -k on ".nds"; + setAttr ".fn" -type "string" "im"; + setAttr ".res" -type "string" "ntsc_4d 646 485 1.333"; +relationship "link" ":lightLinker1" ":initialShadingGroup.message" ":defaultLightSet.message"; +relationship "link" ":lightLinker1" ":initialParticleSE.message" ":defaultLightSet.message"; +relationship "shadowLink" ":lightLinker1" ":initialShadingGroup.message" ":defaultLightSet.message"; +relationship "shadowLink" ":lightLinker1" ":initialParticleSE.message" ":defaultLightSet.message"; +connectAttr "layerManager.dli[0]" "defaultLayer.id"; +connectAttr "renderLayerManager.rlmi[0]" "defaultRenderLayer.rlid"; +connectAttr "defaultRenderLayer.msg" ":defaultRenderingList1.r" -na; +// End of test_pose_attributes.ma diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_pose.pose b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_pose.pose new file mode 100644 index 0000000..e11829e --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_pose.pose @@ -0,0 +1,151 @@ +{ + "metadata": { + "mayaSceneFile": "C:/Users/hovel/Dropbox/git/site-packages/studiolibrary/packages/mutils/tests/data/test_pose.ma", + "version": "1.0.0", + "user": "Hovel", + "mayaVersion": "2017", + "ctime": "1518341544" + } +, + "objects": { + "srcSphere:offset": { + "attrs": {} + }, + "srcSphere:sphere": { + "attrs": { + "testInteger": { + "type": "long", + "value": 5 + }, + "testProxy": { + "type": "double", + "value": 1.0 + }, + "scaleY": { + "type": "double", + "value": 1.5 + }, + "testLimit": { + "type": "double", + "value": 10.0 + }, + "testConnect": { + "type": "double", + "value": 8.0 + }, + "testEnum": { + "type": "enum", + "value": 1 + }, + "scaleX": { + "type": "double", + "value": 0.25 + }, + "testString": { + "type": "string", + "value": "Hello world" + }, + "scaleZ": { + "type": "double", + "value": 0.5 + }, + "rotateX": { + "type": "doubleAngle", + "value": 45.0 + }, + "rotateY": { + "type": "doubleAngle", + "value": 25.0 + }, + "rotateZ": { + "type": "doubleAngle", + "value": 90.0 + }, + "translateX": { + "type": "doubleLinear", + "value": 0.0 + }, + "translateY": { + "type": "doubleLinear", + "value": 8.0 + }, + "translateZ": { + "type": "doubleLinear", + "value": -12.0 + }, + "visibility": { + "type": "bool", + "value": true + }, + "testFloat": { + "type": "double", + "value": 0.666 + }, + "testAnimated": { + "type": "double", + "value": 0.0 + }, + "testVectorX": { + "type": "double", + "value": 0.2 + }, + "testVectorY": { + "type": "double", + "value": 1.4 + }, + "testVectorZ": { + "type": "double", + "value": 2.6 + }, + "testBoolean": { + "type": "bool", + "value": true + } + } + }, + "srcSphere:lockedNode": { + "attrs": { + "translateX": { + "type": "doubleLinear", + "value": 0.0 + }, + "translateY": { + "type": "doubleLinear", + "value": 0.0 + }, + "translateZ": { + "type": "doubleLinear", + "value": 0.0 + }, + "scaleX": { + "type": "double", + "value": 1.0 + }, + "scaleY": { + "type": "double", + "value": 1.0 + }, + "visibility": { + "type": "bool", + "value": true + }, + "rotateX": { + "type": "doubleAngle", + "value": 0.0 + }, + "rotateY": { + "type": "doubleAngle", + "value": 0.0 + }, + "rotateZ": { + "type": "doubleAngle", + "value": 0.0 + }, + "scaleZ": { + "type": "double", + "value": 1.0 + } + } + } + } +} \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_poseplugin.pose/.studiolibrary/record.dict b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_poseplugin.pose/.studiolibrary/record.dict new file mode 100644 index 0000000..709c5a9 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/data/test_poseplugin.pose/.studiolibrary/record.dict @@ -0,0 +1 @@ +{'owner': 'hovel', 'ctime': '1437148163', 'mtime': '1437148163'} \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/run.py b/2023/scripts/animation_tools/studiolibrary/mutils/tests/run.py new file mode 100644 index 0000000..71cf724 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/run.py @@ -0,0 +1,75 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . +""" +# Example: +# RUN TEST SUITE +import mutils.tests +reload(mutils.tests) +mutils.tests.run() +""" +import unittest + +import logging + + +logging.basicConfig( + filemode='w', + level=logging.DEBUG, + format='%(levelname)s: %(funcName)s: %(message)s', +) + + +def testSuite(): + """ + Return a test suite containing all the tests. + + :rtype: unittest.TestSuite + """ + import test_pose + import test_anim + import test_match + import test_utils + import test_attribute + import test_mirrortable + + suite = unittest.TestSuite() + + s = unittest.makeSuite(test_pose.TestPose, 'test') + suite.addTest(s) + + s = unittest.makeSuite(test_anim.TestAnim, 'test') + suite.addTest(s) + + s = unittest.makeSuite(test_utils.TestUtils, 'test') + suite.addTest(s) + + s = unittest.makeSuite(test_match.TestMatch, 'test') + suite.addTest(s) + + s = unittest.makeSuite(test_attribute.TestAttribute, 'test') + suite.addTest(s) + + s = unittest.makeSuite(test_mirrortable.TestMirrorTable, 'test') + suite.addTest(s) + + return suite + + +def run(): + """ + Call from within Maya to run all valid tests. + """ + import mutils.animation + mutils.animation.FIX_SAVE_ANIM_REFERENCE_LOCKED_ERROR = True + + tests = unittest.TextTestRunner() + tests.run(testSuite()) diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/test_anim.py b/2023/scripts/animation_tools/studiolibrary/mutils/tests/test_anim.py new file mode 100644 index 0000000..0d6f54a --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/test_anim.py @@ -0,0 +1,125 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +import unittest + +import mutils + +import test_base + + +class TestAnim(test_base.TestBase): + + def setUp(self): + """ + """ + + def save(self, bakeConnected=False): + """ + Test saving the animation to disc. + """ + self.open() + anim = mutils.Animation.fromObjects(self.srcObjects) + anim.save(self.dstPath, bakeConnected=bakeConnected) + + # def test_older_version(self): + # """ + # Test animation parser for an older animation format + # """ + # srcPath = self.dataPath("test_older_version.anim") + # a = mutils.Animation.fromPath(srcPath) + + def test_load_replace_completely(self): + """ + Test loading the animation with replace completely option. + """ + self.srcPath = self.dataPath("test_anim.ma") + self.dstPath = self.dataPath("test_load_replace_completely.anim") + self.save() + + anim = mutils.Animation.fromPath(self.dstPath) + anim.load(self.dstObjects) + + self.assertEqualAnimation() + + def test_bake_connected(self): + """ + Test saving animation with the option bake connected. + """ + srcPath = self.dataPath("test_bake_connected.ma") + dstPath = self.dataPath("test_bake_connected.anim") + + srcObjects = [ + "srcSphere:group", + "srcSphere:lockedNode", + "srcSphere:offset", + "srcSphere:sphere" + ] + + dstObjects = [ + "dstSphere:group", + "dstSphere:lockedNode", + "dstSphere:offset", + "dstSphere:sphere" + ] + + self.open(path=srcPath) + + anim = mutils.Animation.fromObjects(srcObjects) + anim.save(dstPath, bakeConnected=True) + + anim = mutils.Animation.fromPath(dstPath) + anim.load(dstObjects) + + self.assertEqualAnimation() + + def test_load_replace(self): + """ + Test loading the animation with the option Replace. + """ + self.srcPath = self.dataPath("test_anim.ma") + self.dstPath = self.dataPath("test_load_replace.anim") + self.save() + + anim = mutils.Animation.fromPath(self.dstPath) + anim.load(self.dstObjects, option=mutils.PasteOption.Replace, startFrame=5) + + def test_load_insert(self): + """ + Test loading the animation with the option Insert. + """ + self.srcPath = self.dataPath("test_anim.ma") + self.dstPath = self.dataPath("test_load_insert.anim") + self.save() + + anim = mutils.Animation.fromPath(self.dstPath) + anim.load(self.dstObjects, option=mutils.PasteOption.Insert, startFrame=5) + + +def testSuite(): + """ + Return the test suite for the test case. + + :rtype: unittest.TestSuite + """ + suite = unittest.TestSuite() + s = unittest.makeSuite(TestAnim, 'test') + suite.addTest(s) + return suite + + +def run(): + """ + Call from within Maya to run all valid tests. + """ + tests = unittest.TextTestRunner() + tests.run(testSuite()) diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/test_attribute.py b/2023/scripts/animation_tools/studiolibrary/mutils/tests/test_attribute.py new file mode 100644 index 0000000..be3090d --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/test_attribute.py @@ -0,0 +1,168 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . +""" +# Example: +import mutils.tests.test_attribute +reload(mutils.tests.test_attribute) +mutils.tests.test_attribute.run() +""" +import os +import unittest + +import maya.cmds + +import mutils + + +class TestAttribute(unittest.TestCase): + + def setUp(self): + """ + Open an existing maya test scene for testing. + """ + dirname = os.path.dirname(mutils.__file__) + dirname = os.path.join(dirname, "tests", "data") + path = os.path.join(dirname, "sphere.ma") + + maya.cmds.file( + path, + open=True, + force=True, + ignoreVersion=True, + executeScriptNodes=False, + ) + + def test_attribute_limit(self): + """ + Test the attribute limit when setting the attribute value. + """ + range_ = (-100, 100) + maya.cmds.cutKey("sphere", cl=True, time=range_, f=range_, at="testLimit") + + attr = mutils.Attribute("sphere", "testLimit") + attr.set(200) + + value = maya.cmds.getAttr("sphere.testLimit") + assert value == 10, "Maximum attibute limit was ignored when setting the attribute value" + + def test_attribute_limit2(self): + """ + Test the maximum attribute limit when setting a keyframe. + """ + attr = mutils.Attribute("sphere", "testLimit") + attr.setKeyframe(200) + + value = maya.cmds.keyframe("sphere.testLimit", query=True, eval=True)[0] + assert value == 10, "Maximum attibute limit was ignored when setting animation keyframe" + + def test_attribute_limit3(self): + """ + Test the minimum attribute limit when setting a keyframe. + """ + attr = mutils.Attribute("sphere", "testLimit") + attr.setKeyframe(-200) + + value = maya.cmds.keyframe("sphere.testLimit", query=True, eval=True)[0] + assert value == -10, "Minimum attibute limit was ignored when setting animation keyframe" + + def test_non_keyable(self): + """ + Test if non-keyable attributes can be keyed. + """ + range_ = (-100, 100) + maya.cmds.cutKey("sphere", cl=True, time=range_, f=range_, at="testNonKeyable") + + attr = mutils.Attribute("sphere", "testNonKeyable") + attr.setKeyframe(200) + + value = maya.cmds.keyframe("sphere.testNonKeyable", query=True, eval=True) + assert value is None, "Non keyable attribute was keyed" + + def test_anim_curve(self): + """ + Test if get anim curve returns the right value. + """ + msg = "Incorrect anim curve was returned when using attr.animCurve " + + attr = mutils.Attribute("sphere", "testFloat") + curve = attr.animCurve() + assert curve is None, msg + "1" + + attr = mutils.Attribute("sphere", "testConnected") + curve = attr.animCurve() + assert curve is None, msg + "2" + + attr = mutils.Attribute("sphere", "testAnimated") + curve = attr.animCurve() + assert curve == "sphere_testAnimated", msg + "3" + + def test_set_anim_curve(self): + """ + Test if set anim curve + """ + msg = "No anim curve was set" + + attr = mutils.Attribute("sphere", "testAnimated") + srcCurve = attr.animCurve() + + attr = mutils.Attribute("sphere", "testFloat") + attr.setAnimCurve(srcCurve, time=(1, 15), option="replace") + curve = attr.animCurve() + assert curve is not None, msg + + attr = mutils.Attribute("sphere", "testFloat") + attr.setAnimCurve(srcCurve, time=(15, 15), option="replaceCompletely") + curve = attr.animCurve() + assert curve is not None, msg + + def test_set_static_keyframe(self): + """ + Test set static keyframes + """ + msg = "The inserted static keys have different values" + + attr = mutils.Attribute("sphere", "testAnimated", cache=False) + attr.setStaticKeyframe(value=2, time=(4, 6), option="replace") + + maya.cmds.currentTime(4) + value1 = attr.value() + + maya.cmds.currentTime(6) + value2 = attr.value() + + assert value1 == value2, msg + + +def testSuite(): + """ + Return the test suite for the TestAttribute. + + :rtype: unittest.TestSuite + """ + suite = unittest.TestSuite() + s = unittest.makeSuite(TestAttribute, 'test') + suite.addTest(s) + return suite + + +def run(): + """ + Call from within Maya to run all valid tests. + + Example: + + import mutils.tests.test_attribute + reload(mutils.tests.test_attribute) + mutils.tests.test_attribute.run() + """ + tests = unittest.TextTestRunner() + tests.run(testSuite()) diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/test_base.py b/2023/scripts/animation_tools/studiolibrary/mutils/tests/test_base.py new file mode 100644 index 0000000..e807d2d --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/test_base.py @@ -0,0 +1,143 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +import os +import unittest + +import maya.cmds + +import mutils + + +TEST_DATA_DIR = os.path.join(os.path.dirname(mutils.__file__), "tests", "data") + + +class TestBase(unittest.TestCase): + + def __init__(self, *args): + """ + :type args: list + """ + unittest.TestCase.__init__(self, *args) + + self.srcPath = os.path.join(TEST_DATA_DIR, "test_pose.ma") + self.dstPath = os.path.join(TEST_DATA_DIR, "test_pose.pose") + + self.srcObjects = [ + "srcSphere:lockedNode", + "srcSphere:offset", + "srcSphere:sphere", + ] + + self.dstObjects = [ + "dstSphere:lockedNode", + "dstSphere:offset", + "dstSphere:sphere", + ] + + self.srcNamespaces = ["srcSphere"] + self.dstNamespaces = ["dstSphere"] + + def dataDir(self): + """ + Return the location on disc to the test data. + + :rtype: str + """ + return os.path.join(os.path.dirname(mutils.__file__), "tests", "data") + + def dataPath(self, fileName): + """ + Return data location with the given fileName. + + :rtype: str + """ + return os.path.join(self.dataDir(), fileName) + + def open(self, path=None): + """ + Open the specified file in Maya. + + :type path: str | None + """ + if path is None: + path = self.srcPath + + maya.cmds.file( + path, + open=True, + force=True, + ignoreVersion=True, + executeScriptNodes=False, + ) + + def listAttr(self, srcObjects=None, dstObjects=None): + """ + Return the source & destination attributes for the given objects. + + :rtype: list[(mutils.Attribute, mutils.Attribute)] + """ + attrs = [] + srcObjects = srcObjects or self.srcObjects + dstObjects = dstObjects or self.dstObjects + + for i, srcObj in enumerate(srcObjects): + srcObj = srcObjects[i] + dstObj = dstObjects[i] + + srcAttrs = maya.cmds.listAttr(srcObj, keyable=True, unlocked=True, scalar=True) or [] + + for srcAttr in srcAttrs: + srcAttribute = mutils.Attribute(srcObj, srcAttr) + dstAttribute = mutils.Attribute(dstObj, srcAttr) + attrs.append((srcAttribute, dstAttribute)) + + return attrs + + def assertEqualAnimation( + self, + srcObjects=None, + dstObjects=None, + ): + """ + Test that the animation for the given objects is equal. + + If the animation curves do not compare equal, the test will fail. + + :type srcObjects: list[str] | None + :type dstObjects: list[str] | None + """ + for frame in [1, 10, 24]: + maya.cmds.currentTime(frame) + self.assertEqualAttributeValues(srcObjects, dstObjects) + + def assertEqualAttributeValues( + self, + srcObjects=None, + dstObjects=None, + ): + """ + Test that the attribute values for the given objects are equal. + + If the values do not compare equal, the test will fail. + + :type srcObjects: list[str] | None + :type dstObjects: list[str] | None + """ + for srcAttribute, dstAttribute in self.listAttr(srcObjects, dstObjects): + + if not dstAttribute.exists(): + continue + + msg = "Attribute value is not equal! {0} != {1}" + msg = msg.format(srcAttribute.fullname(), dstAttribute.fullname()) + self.assertEqual(srcAttribute.value(), dstAttribute.value(), msg) diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/test_match.py b/2023/scripts/animation_tools/studiolibrary/mutils/tests/test_match.py new file mode 100644 index 0000000..1405071 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/test_match.py @@ -0,0 +1,230 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +import mutils +import test_base + + +class TestMatch(test_base.TestBase): + + def setUp(self): + """ + """ + pass + + def matchNames(self, expectedResult, srcObjects=None, dstObjects=None, dstNamespaces=None): + """ + """ + result = [] + for srcNode, dstNode in mutils.matchNames(srcObjects, dstObjects=dstObjects, dstNamespaces=dstNamespaces): + result.append((srcNode.name(), dstNode.name())) + + if result != expectedResult: + raise Exception("Result does not match the expected result: %s != %s" % (str(result), expectedResult)) + + def test_match0(self): + """ + Test no matches + """ + srcObjects = ["control2", "control1", "control3"] + dstObjects = ["control4", "control5", "control6"] + expectedResult = [] + self.matchNames(expectedResult, srcObjects=srcObjects, dstObjects=dstObjects) + + def test_match1(self): + """ + Test simple match + """ + srcObjects = ["control2", "control1", "control3"] + dstObjects = ["control1", "control2", "control3"] + expectedResult = [("control2", "control2"), + ("control1", "control1"), + ("control3", "control3")] + self.matchNames(expectedResult, srcObjects=srcObjects, dstObjects=dstObjects) + + def test_match2(self): + """ + """ + srcObjects = ["control1"] + dstObjects = ["character1:control1", "character2:control1"] + expectedResult = [("control1", "character1:control1"), + ("control1", "character2:control1")] + self.matchNames(expectedResult, srcObjects=srcObjects, dstObjects=dstObjects) + + def test_match3(self): + """ + """ + srcObjects = ["control1"] + dstNamespaces = ["character1", "character2"] + expectedResult = [("control1", "character1:control1"), + ("control1", "character2:control1")] + self.matchNames(expectedResult, srcObjects=srcObjects, dstNamespaces=dstNamespaces) + + def test_match4(self): + """ + """ + srcObjects = ["character1:control1"] + dstNamespaces = [""] + expectedResult = [("character1:control1", "control1")] + self.matchNames(expectedResult, srcObjects=srcObjects, dstNamespaces=dstNamespaces) + + def test_match5(self): + """ + Test namespace + Test short name + Test multiple namespaces in source objects + """ + srcObjects = ["character1:control1", "character1:control2"] + dstNamespaces = ["character2"] + expectedResult = [("character1:control1", "character2:control1"), + ("character1:control2", "character2:control2")] + self.matchNames(expectedResult, srcObjects=srcObjects, dstNamespaces=dstNamespaces) + + def test_match6(self): + """ + Test namespace + Test long name + Test namespace in source objects + Test namespace that is not in source objects + """ + srcObjects = ["character1:group1|character1:control1", "character1:group2|character1:control1"] + dstNamespaces = ["character2"] + expectedResult = [("character1:group1|character1:control1", "character2:group1|character2:control1"), + ("character1:group2|character1:control1", "character2:group2|character2:control1")] + self.matchNames(expectedResult, srcObjects=srcObjects, dstNamespaces=dstNamespaces) + + def test_match7(self): + """ + Test namespace + Test multiple namespaces in source objects + Test only one destination namespace + """ + srcObjects = ["character1:control1", "character2:control1"] + dstNamespaces = ["character2"] + expectedResult = [("character2:control1", "character2:control1")] + self.matchNames(expectedResult, srcObjects=srcObjects, dstNamespaces=dstNamespaces) + + def test_match8(self): + """ + Test multiple namespaces in source objects + Test namespace that is not in source objects + """ + srcObjects = ["character1:control1", "character2:control1"] + dstNamespaces = ["character3"] + expectedResult = [("character1:control1", "character3:control1")] + self.matchNames(expectedResult, srcObjects=srcObjects, dstNamespaces=dstNamespaces) + + def test_match9(self): + """ + """ + srcObjects = ["character1:group1|character1:control1", + "character1:group1|character1:control2"] + dstObjects = ["group1|control1", + "group1|control2"] + expectedResult = [("character1:group1|character1:control1", "group1|control1"), + ("character1:group1|character1:control2", "group1|control2")] + self.matchNames(expectedResult, srcObjects=srcObjects, dstObjects=dstObjects) + + def test_match10(self): + """ + WARNING: The expected result is a little strange. + It will always match source objects without a namespace first. + expectedResult = [("group1|control1", "character2:group1|character2:control1")] + NOT + expectedResult = [("character1:group1|character1:control1", "character2:group1|character2:control1")] + """ + srcObjects = ["character1:group1|character1:control1", + "group1|control1"] + dstNamespaces = ["character2"] + expectedResult = [("group1|control1", "character2:group1|character2:control1")] + self.matchNames(expectedResult, srcObjects=srcObjects, dstNamespaces=dstNamespaces) + + def test_match11(self): + """ + Match long name to short name. + """ + srcObjects = ["|grpEyeAllLf|grpLidTpLf|ctlLidTpLf"] + dstObjects = ["ctlLidTpLf"] + + expectedResult = [("|grpEyeAllLf|grpLidTpLf|ctlLidTpLf", "ctlLidTpLf")] + self.matchNames(expectedResult, srcObjects=srcObjects, dstObjects=dstObjects) + + def test_match12(self): + """ + Match short name to long name. + """ + srcObjects = ["ctlLidTpLf"] + dstObjects = ["|grpEyeAllLf|grpLidTpLf|ctlLidTpLf"] + + expectedResult = [("ctlLidTpLf", "|grpEyeAllLf|grpLidTpLf|ctlLidTpLf")] + self.matchNames(expectedResult, srcObjects=srcObjects, dstObjects=dstObjects) + + def test_match13(self): + """ + Match short name to long name with namespace. + """ + srcObjects = ["ctlLidTpLf"] + dstObjects = ["|malcolm:grpEyeAllLf|malcolm:grpLidTpLf|malcolm:ctlLidTpLf"] + + expectedResult = [("ctlLidTpLf", "|malcolm:grpEyeAllLf|malcolm:grpLidTpLf|malcolm:ctlLidTpLf")] + self.matchNames(expectedResult, srcObjects=srcObjects, dstObjects=dstObjects) + + def test_match14(self): + """ + Match long name to short name with namespace. + """ + srcObjects = ["|malcolm:grpEyeAllLf|malcolm:grpLidTpLf|malcolm:ctlLidTpLf"] + dstObjects = ["ctlLidTpLf"] + + expectedResult = [("|malcolm:grpEyeAllLf|malcolm:grpLidTpLf|malcolm:ctlLidTpLf", "ctlLidTpLf")] + self.matchNames(expectedResult, srcObjects=srcObjects, dstObjects=dstObjects) + + def test_match15(self): + """ + Testing multiple source namespace to only one destination namespace. They should not merge. + """ + srcObjects = ["character1:group1|character1:control1", + "character2:group1|character2:control2"] + dstObjects = ["group1|control1", + "group1|control2"] + expectedResult = [("character1:group1|character1:control1", "group1|control1")] + self.matchNames(expectedResult, srcObjects=srcObjects, dstObjects=dstObjects) + + def test_match16(self): + """ + Testing multiple source namespace and destination namespaces + """ + srcObjects = ["character1:group1|character1:control1", + "character2:group1|character2:control1", + "character3:group1|character3:control1"] + dstObjects = ["character3:group1|character3:control1", + "character1:group1|character1:control1", + "character2:group1|character2:control1"] + expectedResult = [('character1:group1|character1:control1', 'character1:group1|character1:control1'), + ('character3:group1|character3:control1', 'character3:group1|character3:control1'), + ('character2:group1|character2:control1', 'character2:group1|character2:control1')] + self.matchNames(expectedResult, srcObjects=srcObjects, dstObjects=dstObjects) + + def test_match17(self): + """ + Testing multiple source namespace and destination namespaces. + """ + srcObjects = ["character1:group1|character1:control1", + "group1|control1", + "character3:group1|character3:control1"] + dstObjects = ["character3:group1|character3:control1", + "character1:group1|character1:control1", + "group1|control1"] + expectedResult = [('group1|control1', 'group1|control1'), + ('character1:group1|character1:control1', 'character1:group1|character1:control1'), + ('character3:group1|character3:control1', 'character3:group1|character3:control1')] + self.matchNames(expectedResult, srcObjects=srcObjects, dstObjects=dstObjects) \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/test_mirrortable.py b/2023/scripts/animation_tools/studiolibrary/mutils/tests/test_mirrortable.py new file mode 100644 index 0000000..f7ab2fd --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/test_mirrortable.py @@ -0,0 +1,238 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +import unittest + +from mutils.mirrortable import MirrorTable + + +class TestMirrorTable(unittest.TestCase): + + def test_find_left_side(self): + """ + Test the clamp range command + """ + msg = "Cannot find the left side from the given objects" + + objects = ["Character3_Ctrl_LeftForeArm"] + assert "Left" == MirrorTable.findLeftSide(objects), msg + + objects = ["r_cool_ik", "l_arm_cool_l"] + assert "l_*" == MirrorTable.findLeftSide(objects), msg + + objects = ["r_cool_ik", "Character:l_arm_cool_ik"] + assert "l_*" == MirrorTable.findLeftSide(objects), msg + + objects = ["r_cool_ik", "Group|l_arm_cool_ik"] + assert "l_*" == MirrorTable.findLeftSide(objects), msg + + objects = ["r_cool_ik", "Group|arm_cool_l"] + assert "*_l" == MirrorTable.findLeftSide(objects), msg + + objects = ["leftArm1_ArmCon"] + assert "left*" == MirrorTable.findLeftSide(objects), msg + + objects = ["LLegCON", "LhandCON"] + assert "L*" == MirrorTable.findLeftSide(objects), msg + + objects = ["r_cool_ik", "Group|left_arm_cool_ik"] + assert "left*" == MirrorTable.findLeftSide(objects), msg + + objects = ["r_cool_ik", "Group|ctlHandLf"] + assert "*Lf" == MirrorTable.findLeftSide(objects), msg + + objects = ["r_cool_ik", "malcolm:ctlArmIkLf"] + assert "*Lf" == MirrorTable.findLeftSide(objects), msg + + objects = ["r_cool_ik", "IKExtraLegFront_L|IKLegFront_L"] + assert "*_L" == MirrorTable.findLeftSide(objects), msg + + def test_find_right_side(self): + """ + Test the clamp range command + """ + msg = "Cannot find the right side from the given objects" + + objects = ["Character3_Ctrl_RightForeArm"] + assert "Right" == MirrorTable.findRightSide(objects), msg + + objects = ["l_car_ik", "r_arm_car_r"] + assert "r_*" == MirrorTable.findRightSide(objects), msg + + objects = ["l_car_ik", "Character:r_arm_car_r"] + assert "r_*" == MirrorTable.findRightSide(objects), msg + + objects = ["l_car_ik", "Group|r_arm_car_r"] + assert "r_*" == MirrorTable.findRightSide(objects), msg + + objects = ["l_car_ik", "arm_car_r"] + assert "*_r" == MirrorTable.findRightSide(objects), msg + + objects = ["l_car_ik", "Group|right_arm_car_ik"] + assert "right*" == MirrorTable.findRightSide(objects), msg + + objects = ["CHR1:RIG:RLegCON", "CHR1:RIG:RhandCON"] + assert "R*" == MirrorTable.findRightSide(objects), msg + + objects = ["RLegCON", "RhandCON"] + assert "R*" == MirrorTable.findRightSide(objects), msg + + objects = ["l_car_ik", "Group|ctlHandRt"] + assert "*Rt" == MirrorTable.findRightSide(objects), msg + + objects = ["l_car_ik", "malcolm:ctlArmIkRt"] + assert "*Rt" == MirrorTable.findRightSide(objects), msg + + objects = ["l_car_ik", "IKExtraLegFront_R|IKLegFront_R"] + assert "*_R" == MirrorTable.findRightSide(objects), msg + + objects = ["Rig_v01_ref:Rig_v01:leftArm1_UpperArmControl"] + assert "" == MirrorTable.findRightSide(objects), msg + + def test_match_side(self): + + msg = "Incorrect result from match side" + + result = MirrorTable.matchSide("ctlArmIkRt", "*Rt") + assert result is True, msg + + result = MirrorTable.matchSide("ctlArmIkRt", "Rt") + assert result is True, msg + + result = MirrorTable.matchSide("CHR1:RIG:LRollCON", "L*") + assert result is True, msg + + # This is no longer supported! + # result = MirrorTable.matchSide("CHR1:RIG:LRollCON", "RIG:L*") + # assert result is True, msg + + result = MirrorTable.matchSide("Group|right_arm_car_ik", "right*") + assert result is True, msg + + result = MirrorTable.matchSide("Group|IKLegFront_R", "*_R") + assert result is True, msg + + def test_mirror_object(self): + + msg = "Incorrect mirror name for object" + + result = MirrorTable._mirrorObject("malcolm:ctlArmIkRt", "Rt", "Lf") + assert "malcolm:ctlArmIkLf" == result, msg + + result = MirrorTable._mirrorObject("malcolm:ctlArmIkRt", "*Rt", "*Lf") + assert "malcolm:ctlArmIkLf" == result, msg + + result = MirrorTable._mirrorObject("IKLegFront_R", "*_R", "*_L") + assert "IKLegFront_L" == result, msg + + result = MirrorTable._mirrorObject("CHR1:RIG:RLegCON", "R*", "L*") + assert "CHR1:RIG:LLegCON" == result, msg + + result = MirrorTable._mirrorObject("CHR1:RIG:RRollCON", "R*", "L*") + assert "CHR1:RIG:LRollCON" == result, msg + + result = MirrorTable._mirrorObject("leftArm1_ArmCon", "left*", "right*") + assert "rightArm1_ArmCon" == result, msg + + result = MirrorTable._mirrorObject("Rig:RArm1_UpperArmControl", "R*", "L*") + assert "Rig:LArm1_UpperArmControl" == result, msg + + result = MirrorTable._mirrorObject("Group|Ch1:RIG:Offset|Ch1:RIG:RRoll", "R*", "L*") + assert "Group|Ch1:RIG:Offset|Ch1:RIG:LRoll" == result, msg + + # This is no longer supported! + # result = MirrorTable._mirrorObject("Group|Ch1:RIG:RExtra|Ch1:RIG:RRoll", "RIG:R", "RIG:L") + # assert "Group|Ch1:RIG:LExtra|Ch1:RIG:LRoll" == result, msg + + result = MirrorTable._mirrorObject("Group|Ch1:RIG:RExtra|Ch1:RIG:RRoll", "R*", "L*") + assert "Group|Ch1:RIG:LExtra|Ch1:RIG:LRoll" == result, msg + + result = MirrorTable._mirrorObject("hand_R0_ctl", "_R", "_L") + assert "hand_L0_ctl" == result, msg + + result = MirrorTable._mirrorObject("Lyle_R001:hand_R0_ctl", "_R", "_L") + assert "Lyle_R001:hand_L0_ctl" == result, msg + + result = MirrorTable._mirrorObject("Lyle_R001:other_R0_ctl|Lyle_R001:hand_R0_ctl", "_R", "_L") + assert "Lyle_R001:other_L0_ctl|Lyle_R001:hand_L0_ctl" == result, msg + + result = MirrorTable._mirrorObject("Character1:LfootRoll", "L*", "R*") + assert "Character1:RfootRoll" == result, msg + + result = MirrorTable._mirrorObject("Group|LyleCharacter1:LfootRollExtra|LyleCharacter1:LfootRoll", "R*", "L*") + assert "Group|LyleCharacter1:RfootRollExtra|LyleCharacter1:RfootRoll" == result, msg + + result = MirrorTable._mirrorObject("Character3_Ctrl_RightForeArm", "Right", "Left") + assert "Character3_Ctrl_LeftForeArm" == result, msg + + result = MirrorTable._mirrorObject("r_arm_car_r", "r_*", "l_*") + assert "l_arm_car_r" == result, msg + + result = MirrorTable._mirrorObject("Character:r_arm_car_r", "r_*", "l_*") + assert "Character:l_arm_car_r" == result, msg + + result = MirrorTable._mirrorObject("Group|r_arm_car_r", "r_*", "l_*") + assert "Group|l_arm_car_r" == result, msg + + result = MirrorTable._mirrorObject("arm_car_r", "*_r", "*_l") + assert "arm_car_l" == result, msg + + result = MirrorTable._mirrorObject("Group|right_arm_car_ik", "right*", "left*") + assert "Group|left_arm_car_ik" == result, msg + + result = MirrorTable._mirrorObject("CHR1:RIG:RLegCON", "R*", "L*") + assert "CHR1:RIG:LLegCON" == result, msg + + result = MirrorTable._mirrorObject("RhandCON", "R*", "L*") + assert "LhandCON" == result, msg + + result = MirrorTable._mirrorObject("Group|ctlHandRt", "*Rt", "*Lt") + assert "Group|ctlHandLt" == result, msg + + result = MirrorTable._mirrorObject("malcolm:ctlArmIkRt", "*Rt", "*Lt") + assert "malcolm:ctlArmIkLt" == result, msg + + result = MirrorTable._mirrorObject("IKExtraLegFront_R|IKLegFront_R", "*_R", "*_L") + assert "IKExtraLegFront_L|IKLegFront_L" == result, msg + + result = MirrorTable._mirrorObject("Rig_v01_ref:Rig_v01:leftArm1_UpperArmControl", "_R", "_L") + assert None == result, msg + + +def testSuite(): + """ + Return the test suite for this module. + + :rtype: unittest.TestSuite + """ + suite = unittest.TestSuite() + s = unittest.makeSuite(TestMirrorTable, 'test') + suite.addTest(s) + return suite + + +def run(): + """ + Call from within Maya to run all valid tests. + + Example: + + import mutils.tests.test_attribute + reload(mutils.tests.test_attribute) + mutils.tests.test_attribute.run() + """ + tests = unittest.TextTestRunner() + tests.run(testSuite()) + + +if __name__ == "__main__": + run() diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/test_pose.py b/2023/scripts/animation_tools/studiolibrary/mutils/tests/test_pose.py new file mode 100644 index 0000000..3919b76 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/test_pose.py @@ -0,0 +1,157 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . +""" +# Example: +import mutils.tests.test_pose +reload(mutils.tests.test_pose) +mutils.tests.test_pose.run() +""" +import unittest + +import maya.cmds + +import mutils +import test_base + + +class TestPose(test_base.TestBase): + + def setUp(self): + """ + """ + self.srcPath = self.dataPath("test_pose.ma") + self.dstPath = self.dataPath("test_pose.pose") + + def test_save(self): + """ + Test saving a pose to disc. + """ + self.open() + pose = mutils.Pose.fromObjects(self.srcObjects) + pose.save(self.dstPath) + + def test_load(self): + """ + Test load the pose from disc. + """ + self.open() + pose = mutils.Pose.fromPath(self.dstPath) + pose.load(self.dstObjects) + self.assertEqualAttributeValues() + + def test_older_version(self): + """ + Test parsing an older pose format + """ + srcPath = self.dataPath("test_older_version.dict") + + pose = mutils.Pose.fromPath(srcPath) + print(pose.objects()) + + def test_non_unique_names(self): + """ + Test loading a pose to objects that do not have unique names. + """ + srcPath = self.dataPath("test_non_unique_names.ma") + dstPath = self.dataPath("test_non_unique_names.pose") + + srcObjects = [ + "srcSphere:offset", + "srcSphere:lockedNode", + "srcSphere:sphere", + ] + + dstObjects = [ + 'group|offset', + 'group|offset|lockedNode', + 'group|offset|lockedNode|sphere', + ] + + self.open(path=srcPath) + + pose = mutils.Pose.fromObjects(srcObjects) + pose.save(dstPath) + + pose = mutils.Pose.fromPath(dstPath) + pose.load(dstObjects) + + self.assertEqualAttributeValues(srcObjects, dstObjects) + + def test_blend(self): + """ + Test pose blending for float values when loading a pose. + """ + self.open() + + for blend in [10, 30, 70, 90]: + dstObjects = {} + for srcAttribute, dstAttribute in self.listAttr(): + if srcAttribute.type == "float": + values = (srcAttribute.value(), dstAttribute.value()) + dstObjects[dstAttribute.fullname()] = values + + pose = mutils.Pose.fromPath(self.dstPath) + pose.load(self.dstObjects, blend=blend) + + for dstFullname in dstObjects.keys(): + srcValue, dstValue = dstObjects[dstFullname] + + value = (srcValue - dstValue) * (blend/100.00) + value = dstValue + value + + dstValue = maya.cmds.getAttr(dstFullname) + + msg = 'Incorrect value for {0} {1} != {2}' + msg = msg.format(dstFullname, value, dstValue) + self.assertEqual(value, maya.cmds.getAttr(dstFullname), msg) + + def test_select(self): + """ + Test selecting the controls from the pose. + """ + self.open() + + pose = mutils.Pose.fromPath(self.dstPath) + pose.select(namespaces=self.dstNamespaces) + + selection = maya.cmds.ls(selection=True) + for dstName in self.dstObjects: + msg = "Did not select {0}".format(dstName) + self.assertIn(dstName, selection, msg) + + def test_count(self): + """ + Test the object count within in pose. + """ + self.open() + pose = mutils.Pose.fromPath(self.dstPath) + self.assertEqual(pose.objectCount(), len(self.srcObjects)) + + +def testSuite(): + """ + Return the test suite for the test case. + + :rtype: unittest.TestSuite + """ + suite = unittest.TestSuite() + s = unittest.makeSuite(TestPose, 'test') + suite.addTest(s) + return suite + + +def run(): + """ + Call from within Maya to run all valid tests. + """ + tests = unittest.TextTestRunner() + tests.run(testSuite()) diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/tests/test_utils.py b/2023/scripts/animation_tools/studiolibrary/mutils/tests/test_utils.py new file mode 100644 index 0000000..2498c7c --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/mutils/tests/test_utils.py @@ -0,0 +1,72 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +import unittest + +import mutils.animation + + +class TestUtils(unittest.TestCase): + + def test_clamp_range(self): + """ + Test the clamp range command + """ + msg = "Incorrect clamp range" + + # Test clamp range on both min and max + clampRange = mutils.animation.clampRange((15, 35), (20, 30)) + assert (20, 30) == clampRange, msg + + # Test clamp range on min time + clampRange = mutils.animation.clampRange((10, 25), (20, 30)) + assert (20, 25) == clampRange, msg + + # Test clamp range on man time + clampRange = mutils.animation.clampRange((25, 40), (20, 30)) + assert (25, 30) == clampRange, msg + + # Test min out of bounds error + def test_exception(): + clampRange = mutils.animation.clampRange((5, 15), (20, 30)) + self.assertRaises(mutils.animation.OutOfBoundsError, test_exception) + + # Test max out of bounds error + def test_exception(): + clampRange = mutils.animation.clampRange((65, 95), (20, 30)) + self.assertRaises(mutils.animation.OutOfBoundsError, test_exception) + + +def testSuite(): + """ + Return the test suite for this module. + + :rtype: unittest.TestSuite + """ + suite = unittest.TestSuite() + s = unittest.makeSuite(TestUtils, 'test') + suite.addTest(s) + return suite + + +def run(): + """ + Call from within Maya to run all valid tests. + + Example: + + import mutils.tests.test_attribute + reload(mutils.tests.test_attribute) + mutils.tests.test_attribute.run() + """ + tests = unittest.TextTestRunner() + tests.run(testSuite()) diff --git a/2023/scripts/animation_tools/studiolibrary/mutils/transferobject.py b/2023/scripts/animation_tools/studiolibrary/mutils/transferobject.py new file mode 100644 index 0000000..a849340 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/mutils/transferobject.py @@ -0,0 +1,403 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . +""" +Base object for saving poses, animation, selection sets and mirror tables. + +Example: + import mutils + + t = mutils.TransferObject.fromPath("/tmp/pose.json") + t = mutils.TransferObject.fromObjects(["object1", "object2"]) + + t.load(selection=True) + t.load(objects=["obj1", "obj2"]) + t.load(namespaces=["namespace1", "namespace2"]) + + t.save("/tmp/pose.json") + t.read("/tmp/pose.json") +""" +import os +import abc +import json +import time +import locale +import getpass +import logging + +from studiovendor import six + +import mutils + +try: + import maya.cmds +except Exception: + import traceback + traceback.print_exc() + + +logger = logging.getLogger(__name__) + + +class TransferObject(object): + + @classmethod + def fromPath(cls, path): + """ + Return a new transfer instance for the given path. + + :type path: str + :rtype: TransferObject + """ + t = cls() + t.setPath(path) + t.read() + return t + + @classmethod + def fromObjects(cls, objects, **kwargs): + """ + Return a new transfer instance for the given objects. + + :type objects: list[str] + :rtype: TransferObject + """ + t = cls(**kwargs) + for obj in objects: + t.add(obj) + return t + + @staticmethod + def readJson(path): + """ + Read the given json path + + :type path: str + :rtype: dict + """ + with open(path, "r") as f: + data = f.read() or "{}" + + data = json.loads(data) + + return data + + @staticmethod + def readList(path): + """ + Legacy method for reading older .list file type. + + :rtype: dict + """ + with open(path, "r") as f: + data = f.read() + + data = eval(data, {}) + result = {} + for obj in data: + result.setdefault(obj, {}) + + return {"objects": result} + + @staticmethod + def readDict(path): + """ + Legacy method for reading older .dict file type. + + :rtype: dict + """ + with open(path, "r") as f: + data = f.read() + + data = eval(data, {}) + result = {} + for obj in data: + result.setdefault(obj, {"attrs": {}}) + for attr in data[obj]: + typ, val = data[obj][attr] + result[obj]["attrs"][attr] = {"type": typ, "value": val} + + return {"objects": result} + + def __init__(self): + self._path = None + self._namespaces = None + self._data = {"metadata": {}, "objects": {}} + + def path(self): + """ + Return the disc location for the transfer object. + + :rtype: str + """ + return self._path + + def setPath(self, path): + """ + Set the disc location for loading and saving the transfer object. + + :type path: str + """ + dictPath = path.replace(".json", ".dict") + listPath = path.replace(".json", ".list") + + if not os.path.exists(path): + + if os.path.exists(dictPath): + path = dictPath + + elif os.path.exists(listPath): + path = listPath + + self._path = path + + def validate(self, **kwargs): + """ + Validate the given kwargs for the current IO object. + + :type kwargs: dict + """ + namespaces = kwargs.get("namespaces") + if namespaces is not None: + sceneNamespaces = mutils.namespace.getAll() + [":"] + for namespace in namespaces: + if namespace and namespace not in sceneNamespaces: + msg = 'The namespace "{0}" does not exist in the scene! ' \ + "Please choose a namespace which exists." + msg = msg.format(namespace) + raise ValueError(msg) + + def mtime(self): + """ + Return the modification datetime of self.path(). + + :rtype: float + """ + return os.path.getmtime(self.path()) + + def ctime(self): + """ + Return the creation datetime of self.path(). + + :rtype: float + """ + return os.path.getctime(self.path()) + + def data(self): + """ + Return all the data for the transfer object. + + :rtype: dict + """ + return self._data + + def setData(self, data): + """ + Set the data for the transfer object. + + :type data: + """ + self._data = data + + def owner(self): + """ + Return the user who created this item. + + :rtype: str + """ + return self.metadata().get("user", "") + + def description(self): + """ + Return the user description for this item. + + :rtype: str + """ + return self.metadata().get("description", "") + + def objects(self): + """ + Return all the object data. + + :rtype: dict + """ + return self.data().get("objects", {}) + + def object(self, name): + """ + Return the data for the given object name. + + :type name: str + :rtype: dict + """ + return self.objects().get(name, {}) + + def createObjectData(self, name): + """ + Create the object data for the given object name. + + :type name: str + :rtype: dict + """ + return {} + + def namespaces(self): + """ + Return the namespaces contained in the transfer object + + :rtype: list[str] + """ + if self._namespaces is None: + group = mutils.groupObjects(self.objects()) + self._namespaces = group.keys() + + return self._namespaces + + def objectCount(self): + """ + Return the number of objects in the transfer object. + + :rtype: int + """ + return len(self.objects() or []) + + def add(self, objects): + """ + Add the given objects to the transfer object. + + :type objects: str | list[str] + """ + if isinstance(objects, six.string_types): + objects = [objects] + + for name in objects: + self.objects()[name] = self.createObjectData(name) + + def remove(self, objects): + """ + Remove the given objects to the transfer object. + + :type objects: str | list[str] + """ + if isinstance(objects, six.string_types): + objects = [objects] + + for obj in objects: + del self.objects()[obj] + + def setMetadata(self, key, value): + """ + Set the given key and value in the metadata. + + :type key: str + :type value: int | str | float | dict + """ + self.data()["metadata"][key] = value + + def updateMetadata(self, metadata): + """ + Update the given key and value in the metadata. + + :type metadata: dict + """ + self.data()["metadata"].update(metadata) + + def metadata(self): + """ + Return the current metadata for the transfer object. + + Example: print(self.metadata()) + Result # { + "User": "", + "Scene": "", + "Reference": {"filename": "", "namespace": ""}, + "Description": "", + } + + :rtype: dict + """ + return self.data().get("metadata", {}) + + def read(self, path=""): + """ + Return the data from the path set on the Transfer object. + + :type path: str + :rtype: dict + """ + path = path or self.path() + + if path.endswith(".dict"): + data = self.readDict(path) + + elif path.endswith(".list"): + data = self.readList(path) + + else: + data = self.readJson(path) + + self.setData(data) + + @abc.abstractmethod + def load(self, *args, **kwargs): + pass + + @mutils.showWaitCursor + def save(self, path): + """ + Save the current metadata and object data to the given path. + + :type path: str + :rtype: None + """ + logger.info("Saving pose: %s" % path) + + user = getpass.getuser() + if user: + user = six.text_type(user) + + ctime = str(time.time()).split(".")[0] + references = mutils.getReferenceData(self.objects()) + + self.setMetadata("user", user) + self.setMetadata("ctime", ctime) + self.setMetadata("version", "1.0.0") + self.setMetadata("references", references) + self.setMetadata("mayaVersion", maya.cmds.about(v=True)) + self.setMetadata("mayaSceneFile", maya.cmds.file(q=True, sn=True)) + + # Move the metadata information to the top of the file + metadata = {"metadata": self.metadata()} + data = self.dump(metadata)[:-1] + "," + + # Move the objects information to after the metadata + objects = {"objects": self.objects()} + data += self.dump(objects)[1:] + + # Create the given directory if it doesn't exist + dirname = os.path.dirname(path) + if not os.path.exists(dirname): + os.makedirs(dirname) + + with open(path, "w") as f: + f.write(str(data)) + + logger.info("Saved pose: %s" % path) + + def dump(self, data=None): + """ + :type data: str | dict + :rtype: str + """ + if data is None: + data = self.data() + + return json.dumps(data, indent=2) diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/__init__.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/__init__.py new file mode 100644 index 0000000..2aa2d37 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/__init__.py @@ -0,0 +1,30 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +__version__ = "2.20.2" + + +def version(): + """ + Return the current version of the Studio Library + + :rtype: str + """ + return __version__ + + +from studiolibrary import config +from studiolibrary import resource +from studiolibrary.utils import * +from studiolibrary.library import Library +from studiolibrary.libraryitem import LibraryItem +from studiolibrary.main import main diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/config.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/config.py new file mode 100644 index 0000000..40dc872 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/config.py @@ -0,0 +1,94 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +import os +import json + + +_config = None + + +def get(*args): + """ + Get values from the config. + + :rtype: str + """ + global _config + + if not _config: + _config = read(paths()) + + return _config.get(*args) + + +def set(key, value): + + global _config + + if not _config: + _config = read(paths()) + + _config[key] = value + + +def paths(): + """ + Return all possible config paths. + + :rtype: list[str] + """ + cwd = os.path.dirname(__file__) + paths_ = [os.path.join(cwd, "config", "default.json")] + + path = os.environ.get("STUDIO_LIBRARY_CONFIG_PATH") + path = path or os.path.join(cwd, "config", "config.json") + + if not os.path.exists(path): + cwd = os.path.dirname(os.path.dirname(cwd)) + path = os.path.join(cwd, "config", "config.json") + + if os.path.exists(path): + paths_.append(path) + + return paths_ + + +def read(paths): + """ + Read all paths and overwrite the keys with each successive file. + + A custom config parser for passing JSON files. + + We use this instead of the standard ConfigParser as the JSON format + can support list and dict types. + + This parser can also support comments using the following style "//" + + :type paths: list[str] + :rtype: dict + """ + conf = {} + + for path in paths: + lines = [] + + with open(path) as f: + for line in f.readlines(): + if not line.strip().startswith('//'): + lines.append(line) + + data = '\n'.join(lines) + if data: + conf.update(json.loads(data)) + + return conf diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/config/default.json b/2023/scripts/animation_tools/studiolibrary/studiolibrary/config/default.json new file mode 100644 index 0000000..1d02168 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/config/default.json @@ -0,0 +1,61 @@ +// This is the default config file and should NOT be changed. +// +// There are two ways to create a custom config. +// +// 1. You can create a "config.json" at repo/config/config.json. +// This file will override any keys in this default.json file +// and will be ignored by git. +// +// 2. The other way is to create an environment variable with the name +// STUDIO_LIBRARY_CONFIG_PATH. The value of this variable should be the +// full path to your config.json file. +// +// 3. Or you could use code to modify the config before loading the window. +// import studiolibrary +// studiolibrary.config.set("recursiveSearchDepth", 6) +// studiolibrary.main() + +{ + // The database path is used for caching the library items. + // You can use environment variables within the path. eg: {HOME} + "databasePath": "{root}/.studiolibrary/database.json", + + // The temp location used for saving out items and thumbnails + "tempPath": "{temp}/StudioLibrary/{user}", + + // The metadata path used for each item. Used for tags, item color etc + // eg: /library/data/animation/nemo/.metadata + "metadataPath": "{path}/.studiolibrary/metadata.json", + + // Used for saving persistent user data + "settingsPath": "{local}/StudioLibrary/LibraryWidget.json", + + // The maximum walking depth from the root directory + "recursiveSearchDepth": 5, + + // A list of paths to ignore when walking the root directory + "ignorePaths": ["/."], + + // The command used to show a path in the file explorer + //"showInFolderCmd": "konqueror \"{path}\"&", + + // Enables the scale factor option in the setting dialog + // This might be useful when using high-DPI devices like a 4k monitor + "scaleFactorEnabled": true, + + // Check if there are any new versions available on start up + "checkForUpdatesEnabled": true, + + // A list of the default item plugins + "itemRegistry": [ + // This is an example item for development + // "studiolibrarymaya.exampleitem.ExampleItem", + // The maya file item is in development + // "studiolibrarymaya.mayafileitem.MayaFileItem", + "studiolibrarymaya.poseitem.PoseItem", + "studiolibrarymaya.animitem.AnimItem", + "studiolibrarymaya.mirroritem.MirrorItem", + "studiolibrarymaya.setsitem.SetsItem", + "studiolibrary.folderitem.FolderItem" + ] +} \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/folderitem.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/folderitem.py new file mode 100644 index 0000000..4956f37 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/folderitem.py @@ -0,0 +1,367 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +import os +from datetime import datetime + +from studiovendor.Qt import QtGui +from studiovendor.Qt import QtCore +from studiovendor.Qt import QtWidgets + +import studioqt +import studiolibrary +import studiolibrary.widgets + + +class FolderItem(studiolibrary.LibraryItem): + + NAME = "Folder" + TYPE = "Folder" + + MENU_ORDER = 0 # Show at the top of the menu + SYNC_ORDER = 100 # Last item to run when syncing + + LOAD_WIDGET_CLASS = studiolibrary.widgets.PreviewWidget + ENABLE_NESTED_ITEMS = True + + ICON_PATH = studiolibrary.resource.get("icons", "folder.svg") + TYPE_ICON_PATH = "" # Don't show a type icon for the folder item + THUMBNAIL_PATH = studiolibrary.resource.get("icons", "folder_item.png") + + DEFAULT_ICON_COLOR = "rgba(150,150,150,100)" + + DEFAULT_ICON_COLORS = [ + "rgb(239, 112, 99)", + "rgb(239, 207, 103)", + "rgb(136, 200, 101)", + "rgb(111, 183, 239)", + "rgb(199, 142, 220)", + DEFAULT_ICON_COLOR, + ] + + DEFAULT_ICONS = [ + "folder.svg", + "user.svg", + "character.svg", + "users.svg", + "inbox.svg", + "favorite.svg", + "shot.svg", + "asset.svg", + "assets.svg", + "cloud.svg", + "book.svg", + "archive.svg", + "circle.svg", + "share.svg", + "tree.svg", + "environment.svg", + "vehicle.svg", + "trash.svg", + "layers.svg", + "database.svg", + "video.svg", + "face.svg", + "hand.svg", + "globe.svg", + ] + + _THUMBNAIL_ICON_CACHE = {} + + @classmethod + def match(cls, path): + """ + Return True if the given path is supported by the item. + + :type path: str + :rtype: bool + """ + if os.path.isdir(path): + return True + + def itemData(self): + """ + Reimplementing this method to set a trash folder icon. + + :rtype: dict + """ + data = super(FolderItem, self).itemData() + + if self.path().endswith("Trash") and not data.get("icon"): + data["icon"] = "trash.svg" + + return data + + def updatePermissionsEnabled(self): + return True + + def updateMetadata(self, metadata): + """ + Overriding this method to support updating the library widget directly. + + :type metadata: dict + """ + super(FolderItem, self).updateMetadata(metadata) + + if self.libraryWindow(): + self.libraryWindow().setFolderData(self.path(), self.itemData()) + self.updateIcon() + + def doubleClicked(self): + """Overriding this method to show the items contained in the folder.""" + self.libraryWindow().selectFolderPath(self.path()) + + def createOverwriteMenu(self, menu): + """ + Overwriting this method to ignore/hide the overwrite menu action. + + :type menu: QtWidgets.QMenu + """ + pass + + def _showPreviewFromMenu(self): + + self.libraryWindow().itemsWidget().clearSelection() + self.showPreviewWidget(self.libraryWindow()) + + def contextEditMenu(self, menu, items=None): + """ + Called when creating the context menu for the item. + + :type menu: QtWidgets.QMenu + :type items: list[FolderItem] or None + """ + super(FolderItem, self).contextEditMenu(menu, items=items) + + action = QtWidgets.QAction("Show in Preview", menu) + + action.triggered.connect(self._showPreviewFromMenu) + menu.addAction(action) + menu.addSeparator() + + action = studiolibrary.widgets.colorpicker.ColorPickerAction(menu) + action.picker().setColors(self.DEFAULT_ICON_COLORS) + action.picker().colorChanged.connect(self.setIconColor) + action.picker().setCurrentColor(self.iconColor()) + action.picker().menuButton().hide() + menu.addAction(action) + + iconName = self.itemData().get("icon", "") + + action = studiolibrary.widgets.iconpicker.IconPickerAction(menu) + action.picker().setIcons(self.DEFAULT_ICONS) + action.picker().setCurrentIcon(iconName) + action.picker().iconChanged.connect(self.setCustomIcon) + action.picker().menuButton().hide() + + menu.addAction(action) + + def iconColor(self): + """ + Get the icon color for the folder item. + + :rtype: str + """ + return self.itemData().get("color", "") + + def setIconColor(self, color): + """ + Set the icon color for the folder item. + + :type color: str + """ + if color == self.DEFAULT_ICON_COLOR: + color = "" + + self.updateMetadata({"color": color}) + + def customIconPath(self): + """ + Get the icon for the folder item. + + :rtype: str + """ + return self.itemData().get("icon", "") + + def setCustomIcon(self, name): + """ + Set the icon for the folder item. + + :type name: str + """ + if name == "folder.svg": + name = "" + + self.updateMetadata({"icon": name}) + + def thumbnailIcon(self): + """ + Overriding this method add support for dynamic icon colors. + + :rtype: QtGui.QIcon + """ + customPath = self.customIconPath() + + if customPath and "/" not in customPath and "\\" not in customPath: + customPath = studiolibrary.resource.get("icons", customPath) + + color = self.iconColor() + if not color: + color = self.DEFAULT_ICON_COLOR + + key = customPath + color + icon = self._THUMBNAIL_ICON_CACHE.get(key) + + if not icon: + color1 = studioqt.Color.fromString(color) + pixmap1 = studioqt.Pixmap(self.THUMBNAIL_PATH) + pixmap1.setColor(color1) + pixmap1 = pixmap1.scaled( + 128, + 128, + QtCore.Qt.KeepAspectRatio, + QtCore.Qt.SmoothTransformation + ) + + color2 = studioqt.Color.fromString("rgba(255,255,255,150)") + pixmap2 = studioqt.Pixmap(customPath) + pixmap2.setColor(color2) + pixmap2 = pixmap2.scaled( + 64, + 64, + QtCore.Qt.KeepAspectRatio, + QtCore.Qt.SmoothTransformation + ) + + x = (128 - pixmap2.width()) / 2 + y = (128 - pixmap2.height()) / 2 + + painter = QtGui.QPainter(pixmap1) + painter.drawPixmap(x, y+5, pixmap2) + painter.end() + + icon = studioqt.Icon(pixmap1) + + self._THUMBNAIL_ICON_CACHE[key] = icon + + return self._THUMBNAIL_ICON_CACHE.get(key) + + def loadValidator(self, **kwargs): + """ + The validator used for validating the load arguments. + + :type kwargs: dict + """ + if kwargs.get("fieldChanged") == "color": + self.setIconColor(kwargs.get("color")) + + if kwargs.get("fieldChanged") == "icon": + self.setCustomIcon(kwargs.get("icon")) + + def loadSchema(self): + """ + Get the info to display to user. + + :rtype: list[dict] + """ + created = os.stat(self.path()).st_ctime + created = datetime.fromtimestamp(created).strftime("%Y-%m-%d %H:%M %p") + + modified = os.stat(self.path()).st_mtime + modified = datetime.fromtimestamp(modified).strftime("%Y-%m-%d %H:%M %p") + + iconName = self.itemData().get("icon", "") + + return [ + { + "name": "infoGroup", + "title": "Info", + "value": True, + "type": "group", + "persistent": True, + "persistentKey": "BaseItem", + }, + { + "name": "name", + "value": self.name() + }, + { + "name": "path", + "value": self.path() + }, + { + "name": "created", + "value": created, + }, + { + "name": "modified", + "value": modified, + }, + { + "name": "optionsGroup", + "title": "Options", + "type": "group", + }, + + { + "name": "color", + "type": "color", + "value": self.iconColor(), + "layout": "vertical", + "label": {"visible": False}, + "colors": self.DEFAULT_ICON_COLORS, + }, + + { + "name": "icon", + "type": "iconPicker", + "value": iconName, + "layout": "vertical", + "label": {"visible": False}, + "items": self.DEFAULT_ICONS, + } + ] + + @classmethod + def showSaveWidget(cls, libraryWindow): + """ + Show the dialog for creating a new folder. + + :rtype: None + """ + path = libraryWindow.selectedFolderPath() or libraryWindow.path() + + name, button = studiolibrary.widgets.MessageBox.input( + libraryWindow, + "Create folder", + "Create a new folder with the name:", + buttons=[ + ("Create", QtWidgets.QDialogButtonBox.AcceptRole), + ("Cancel", QtWidgets.QDialogButtonBox.RejectRole) + ] + ) + + name = name.strip() + + if name and button == "Create": + path = os.path.join(path, name) + + item = cls(path, libraryWindow=libraryWindow) + item.safeSave() + + if libraryWindow: + libraryWindow.refresh() + libraryWindow.selectFolderPath(path) + + def save(self, *args, **kwargs): + """Adding this method to avoid NotImpementedError.""" + pass diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/library.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/library.py new file mode 100644 index 0000000..28a4160 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/library.py @@ -0,0 +1,1081 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . +import fnmatch +import os +import copy +import re +import time +import logging +import collections + +from studiovendor import six +from studiovendor.Qt import QtCore + +import studiolibrary + + +__all__ = [ + "Library", +] + +logger = logging.getLogger(__name__) + + +class Library(QtCore.QObject): + + Fields = [ + { + "name": "icon", + "sortable": False, + "groupable": False, + }, + { + "name": "name", + "sortable": True, + "groupable": False, + }, + { + "name": "path", + "sortable": True, + "groupable": False, + }, + { + "name": "type", + "sortable": True, + "groupable": True, + }, + { + "name": "folder", + "sortable": True, + "groupable": False, + }, + { + "name": "category", + "sortable": True, + "groupable": True, + }, + { + "name": "modified", + "sortable": True, + "groupable": False, + }, + { + "name": "Custom Order", + "sortable": True, + "groupable": False, + }, + ] + + dataChanged = QtCore.Signal() + searchStarted = QtCore.Signal() + searchFinished = QtCore.Signal() + searchTimeFinished = QtCore.Signal() + + def __init__(self, path=None, libraryWindow=None, *args): + QtCore.QObject.__init__(self, *args) + + self._path = path + self._mtime = None + self._data = {} + self._items = [] + self._fields = [] + self._sortBy = [] + self._groupBy = [] + self._results = [] + self._queries = {} + self._globalQueries = {} + self._groupedResults = {} + self._searchTime = 0 + self._searchEnabled = True + self._registeredItems = None + self._libraryWindow = libraryWindow + + self.setPath(path) + self.setDirty(True) + + def sortBy(self): + """ + Get the list of fields to sort by. + + :rtype: list[str] + """ + return self._sortBy + + def setSortBy(self, fields): + """ + Set the list of fields to group by. + + Example: + library.setSortBy(["name:asc", "type:asc"]) + + :type fields: list[str] + """ + self._sortBy = fields + + def groupBy(self): + """ + Get the list of fields to group by. + + :rtype: list[str] + """ + return self._groupBy + + def setGroupBy(self, fields): + """ + Set the list of fields to group by. + + Example: + library.setGroupBy(["name:asc", "type:asc"]) + + :type fields: list[str] + """ + self._groupBy = fields + + def settings(self): + """ + Get the settings for the dataset. + + :rtype: dict + """ + return { + "sortBy": self.sortBy(), + "groupBy": self.groupBy() + } + + def setSettings(self, settings): + """ + Set the settings for the dataset object. + + :type settings: dict + """ + value = settings.get('sortBy') + if value is not None: + self.setSortBy(value) + + value = settings.get('groupBy') + if value is not None: + self.setGroupBy(value) + + def setSearchEnabled(self, enabled): + """Enable or disable the search the for the library.""" + self._searchEnabled = enabled + + def isSearchEnabled(self): + """Check if search is enabled for the library.""" + return self._searchEnabled + + def recursiveDepth(self): + """ + Return the recursive search depth. + + :rtype: int + """ + return studiolibrary.config.get('recursiveSearchDepth') + + def fields(self): + """ + Get all the fields for the library. + + :rtype: list[dict] + """ + return self.Fields + + def fieldNames(self): + """ + Get all the field names for the library. + + :rtype: list[str] + """ + return [field["name"] for field in self.fields()] + + def path(self): + """ + Return the disc location of the db. + + :rtype: str + """ + return self._path + + def setPath(self, path): + """ + Set the disc location of the db. + + :type path: str + """ + self._path = path + + def databasePath(self): + """ + Return the path to the database. + + :rtype: str + """ + formatString = studiolibrary.config.get('databasePath') + return studiolibrary.formatPath(formatString, path=self.path()) + + def distinct(self, field, queries=None, sortBy="name"): + """ + Get all the values for the given field. + + :type field: str + :type queries None or list[dict] + :type sortBy: str + :rtype: list + """ + results = {} + queries = queries or [] + queries.extend(self._globalQueries.values()) + + items = self.createItems() + for item in items: + value = item.itemData().get(field) + if value: + results.setdefault(value, {'count': 0, 'name': value}) + match = self.match(item.itemData(), queries) + if match: + results[value]['count'] += 1 + + def sortKey(facet): + return facet.get(sortBy) + + return sorted(results.values(), key=sortKey) + + def mtime(self): + """ + Return when the database was last modified. + + :rtype: float or None + """ + path = self.databasePath() + mtime = None + + if os.path.exists(path): + mtime = os.path.getmtime(path) + + return mtime + + def setDirty(self, value): + """ + Update the model object with the current database timestamp. + + :type: bool + """ + if value: + self._mtime = None + else: + self._mtime = self.mtime() + + def isDirty(self): + """ + Return True if the database has changed on disc. + + :rtype: bool + """ + return not self._items or self._mtime != self.mtime() + + def read(self): + """ + Read the database from disc and return a dict object. + + :rtype: dict + """ + if self.path(): + if self.isDirty(): + self._data = studiolibrary.readJson(self.databasePath()) + self.setDirty(False) + else: + logger.info('No path set for reading the data from disc.') + + return self._data + + def save(self, data): + """ + Write the given dict object to the database on disc. + + :type data: dict + :rtype: None + """ + if self.path(): + studiolibrary.saveJson(self.databasePath(), data) + self.setDirty(True) + self.updatePermissions(self.databasePath()) + else: + logger.info('No path set for saving the data to disc.') + + def clear(self): + """Clear all the item data.""" + self._items = [] + self._results = [] + self._groupedResults = {} + self._registeredItems = None + self.dataChanged.emit() + + def registeredItems(self): + """ + Get registered items for the library. + + :rtype: list[LibraryItem.__class__] + """ + return studiolibrary.registeredItems() + + def isValidPath(self, path): + """ + Check if the given item path should be ignored. + + :type path: str + :rtype: bool + """ + patterns = studiolibrary.config.get('ignorePaths', []) + patterns.append("*/.*") + patterns.append("*.python") + patterns.append("*.playblast") + patterns.append("*.playblast_settings") + + for pattern in patterns: + if fnmatch.fnmatch(path, pattern): + return False + return True + + def walker(self, path): + """ + Walk the given root path for valid items and return the item data. + + :type path: str + + :rtype: collections.Iterable[dict] + """ + path = studiolibrary.normPath(path) + maxDepth = self.recursiveDepth() + startDepth = path.count(os.path.sep) + + for root, dirs, files in os.walk(path, followlinks=True): + + files.extend(dirs) + + for filename in files: + + # Normalise the path for consistent matching + path = studiolibrary.normPath(os.path.join(root, filename)) + + # Ignore any paths that have been specified in the config + remove = False + if not self.isValidPath(path): + remove = True + else: + # Match the path with a registered item + item = self.itemFromPath(path) + if item: + + # Yield the item data that matches the current path + yield item.createItemData() + + # Stop walking if the item doesn't support nested items + if not item.ENABLE_NESTED_ITEMS: + remove = True + + if remove and filename in dirs: + dirs.remove(filename) + + if maxDepth == 1: + break + + # Stop walking the directory if the maximum depth has been reached + currentDepth = root.count(os.path.sep) + if (currentDepth - startDepth) >= maxDepth: + del dirs[:] + + def sync(self, progressCallback=None): + """ + Sync the file system with the database. + + :type progressCallback: None or func + """ + if not self.path(): + logger.info('No path set for syncing data') + return + + if progressCallback: + progressCallback("Syncing") + + new = {} + old = self.read() + items = list(self.walker(self.path())) + count = len(items) + + for i, item in enumerate(items): + percent = (float(i+1)/float(count)) + if progressCallback: + percent *= 100 + label = "{0:.0f}%".format(percent) + progressCallback(label, percent) + + path = item.get("path") + new[path] = old.get(path, {}) + new[path].update(item) + + if progressCallback: + progressCallback("Post Callbacks") + + self.postSync(new) + + if progressCallback: + progressCallback("Saving Cache") + + self.save(new) + + self.dataChanged.emit() + + def postSync(self, data): + """ + Use this function to execute code on the data after sync, but before save and dataChanged.emit + + :type data: dict + :rtype: None + """ + pass + + def createItems(self): + """ + Create all the items for the model. + + :rtype: list[studiolibrary.LibraryItem] + """ + # Check if the cache has changed since the last read call + if self.isDirty(): + + logger.debug("Creating items") + + self._items = [] + + data = self.read() + + modules = [] + for itemData in data.values(): + if '__class__' in itemData: + modules.append(itemData.get("__class__")) + modules = set(modules) + + classes = {} + for module in modules: + classes[module] = studiolibrary.resolveModule(module) + + for path in data.keys(): + module = data[path].get("__class__") + cls = classes.get(module) + if cls: + item = cls(path, library=self, libraryWindow=self._libraryWindow) + item.setItemData(data[path]) + self._items.append(item) + else: + # This is to support the older database data before v2.6. + # Will remove in a later version. + item = self.itemFromPath(path, library=self, libraryWindow=self._libraryWindow) + if item: + item.setItemData(data[path]) + self._items.append(item) + + return self._items + + def itemFromPath(self, path, **kwargs): + """ + Return a new item instance for the given path. + + :type path: str + :rtype: studiolibrary.LibraryItem or None + """ + path = studiolibrary.normPath(path) + + for cls in self.registeredItems(): + if cls.match(path): + return cls(path, **kwargs) + + def itemsFromPaths(self, paths, **kwargs): + """ + Return new item instances for the given paths. + + :type paths: list[str]: + :rtype: collections.Iterable[studiolibrary.LibraryItem] + """ + for path in paths: + item = self.itemFromPath(path, **kwargs) + if item: + yield item + + def itemsFromUrls(self, urls, **kwargs): + """ + Return new item instances for the given QUrl objects. + + :type urls: list[QtGui.QUrl] + :rtype: list[studiolibrary.LibraryItem] + """ + items = [] + for path in studiolibrary.pathsFromUrls(urls): + + item = self.itemFromPath(path, **kwargs) + + if item: + data = item.createItemData() + item.setItemData(data) + + items.append(item) + else: + msg = 'Cannot find the item for path "{0}"' + msg = msg.format(path) + logger.warning(msg) + + return items + + def findItems(self, queries): + """ + Get the items that match the given queries. + + Examples: + + queries = [ + { + 'operator': 'or', + 'filters': [ + ('folder', 'is' '/library/proj/test'), + ('folder', 'startswith', '/library/proj/test'), + ] + }, + { + 'operator': 'and', + 'filters': [ + ('path', 'contains' 'test'), + ('path', 'contains', 'run'), + ] + } + ] + + print(library.find(queries)) + + :type queries: list[dict] + :rtype: list[studiolibrary.LibraryItem] + """ + fields = [] + results = [] + + queries = copy.copy(queries) + queries.extend(self._globalQueries.values()) + + logger.debug("Search queries:") + for query in queries: + logger.debug('Query: %s', query) + + items = self.createItems() + for item in items: + match = self.match(item.itemData(), queries) + if match: + results.append(item) + fields.extend(item.itemData().keys()) + + self._fields = list(set(fields)) + + if self.sortBy(): + results = self.sorted(results, self.sortBy()) + + return results + + def queries(self, exclude=None): + """ + Get all the queries for the dataset excluding the given ones. + + :type exclude: list[str] or None + + :rtype: list[dict] + """ + queries = [] + exclude = exclude or [] + + for query in self._queries.values(): + if query.get('name') not in exclude: + queries.append(query) + + return queries + + def addGlobalQuery(self, query): + """ + Add a global query to library. + + :type query: dict + """ + self._globalQueries[query["name"]] = query + + def addQuery(self, query): + """ + Add a search query to the library. + + Examples: + addQuery({ + 'name': 'My Query', + 'operator': 'or', + 'filters': [ + ('folder', 'is' '/library/proj/test'), + ('folder', 'startswith', '/library/proj/test'), + ] + }) + + :type query: dict + """ + self._queries[query["name"]] = query + + def removeQuery(self, name): + """ + Remove the query with the given name. + + :type name: str + """ + if name in self._queries: + del self._queries[name] + + def queryExists(self, name): + """ + Check if the given query name exists. + + :type name: str + :rtype: bool + """ + return name in self._queries + + def search(self): + """Run a search using the queries added to this dataset.""" + if not self.isSearchEnabled(): + logger.debug('Search is disabled') + return + + t = time.time() + + logger.debug("Searching items") + + self.searchStarted.emit() + + self._results = self.findItems(self.queries()) + + self._groupedResults = self.groupItems(self._results, self.groupBy()) + + self.searchFinished.emit() + + self._searchTime = time.time() - t + + self.searchTimeFinished.emit() + + logger.debug('Search time: %s', self._searchTime) + + def results(self): + """ + Return the items found after a search is ran. + + :rtype: list[Item] + """ + return self._results + + def groupedResults(self): + """ + Get the results grouped after a search is ran. + + :rtype: dict + """ + return self._groupedResults + + def searchTime(self): + """ + Return the time taken to run a search. + + :rtype: float + """ + return self._searchTime + + def addItem(self, item): + """ + Add the given item to the database. + + :type item: studiolibrary.LibraryItem + :rtype: None + """ + self.saveItemData([item]) + + def addItems(self, items): + """ + Add the given items to the database. + + :type items: list[studiolibrary.LibraryItem] + """ + self.saveItemData(items) + + def saveItemData(self, items, emitDataChanged=True): + """ + Add the given items to the database. + + :type items: list[studiolibrary.LibraryItem] + :type emitDataChanged: bool + """ + logger.debug("Save item data %s", items) + + data_ = self.read() + + for item in items: + path = item.path() + data = item.itemData() + data_.setdefault(path, {}) + data_[path].update(data) + + self.save(data_) + + if emitDataChanged: + self.search() + self.dataChanged.emit() + + def addPaths(self, paths, data=None): + """ + Add the given path and the given data to the database. + + :type paths: list[str] + :type data: dict or None + :rtype: None + """ + data = data or {} + self.updatePaths(paths, data) + + def updatePaths(self, paths, data): + """ + Update the given paths with the given data in the database. + + :type paths: list[str] + :type data: dict + :rtype: None + """ + data_ = self.read() + paths = studiolibrary.normPaths(paths) + + for path in paths: + if path in data_: + data_[path].update(data) + else: + data_[path] = data + + self.save(data_) + + def copyPath(self, src, dst): + """ + Copy the given source path to the given destination path. + + :type src: str + :type dst: str + :rtype: str + """ + self.addPaths([dst]) + return dst + + def renamePath(self, src, dst): + """ + Rename the source path to the given name. + + :type src: str + :type dst: str + :rtype: str + """ + studiolibrary.renamePathInFile(self.databasePath(), src, dst) + self.setDirty(True) + self.updatePermissions(self.databasePath()) + return dst + + def updatePermissions(self, dst): + """ + Update the permissions and ownership of the destination path to match the + root library path if running on a Linux system. + + This helps with permission issues for shared libraries when using a default + umask of 022. + + :type dst: str + :rtype: None + """ + if not studiolibrary.isLinux(): + return + + stat = os.stat(self.path()) + + try: + os.chmod(dst, stat.st_mode) + except OSError as e: + logger.warning("Error changing permissions: %s", e) + + try: + os.chown(dst, -1, stat.st_gid) + except OSError as e: + logger.warning("Error changing group ownership: %s", e) + + def removePath(self, path): + """ + Remove the given path from the database. + + :type path: str + :rtype: None + """ + self.removePaths([path]) + + def removePaths(self, paths): + """ + Remove the given paths from the database. + + :type paths: list[str] + :rtype: None + """ + data = self.read() + + paths = studiolibrary.normPaths(paths) + + for path in paths: + if path in data: + del data[path] + + self.save(data) + + @staticmethod + def match(data, queries): + """ + Match the given data with the given queries. + + Examples: + + queries = [ + { + 'operator': 'or', + 'filters': [ + ('folder', 'is' '/library/proj/test'), + ('folder', 'startswith', '/library/proj/test'), + ] + }, + { + 'operator': 'and', + 'filters': [ + ('path', 'contains' 'test'), + ('path', 'contains', 'run'), + ] + } + ] + + print(library.find(queries)) + """ + matches = [] + + for query in queries: + + filters = query.get('filters') + operator = query.get('operator', 'and') + + if not filters: + continue + + match = False + + for key, cond, value in filters: + + if key == '*': + itemValue = six.text_type(data) + else: + itemValue = data.get(key) + + if isinstance(value, six.string_types): + value = value.lower() + + if isinstance(itemValue, six.string_types): + itemValue = itemValue.lower() + + if not itemValue: + match = False + + elif cond == 'contains': + match = value in itemValue + + elif cond == 'not_contains': + match = value not in itemValue + + elif cond == 'is': + match = value == itemValue + + elif cond == 'not': + match = value != itemValue + + elif cond == 'startswith': + match = itemValue.startswith(value) + + if operator == 'or' and match: + break + + if operator == 'and' and not match: + break + + matches.append(match) + + return all(matches) + + @staticmethod + def sorted(items, sortBy): + """ + Return the given data sorted using the sortBy argument. + + Example: + data = [ + {'name':'red', 'index':1}, + {'name':'green', 'index':2}, + {'name':'blue', 'index':3}, + ] + + sortBy = ['index:asc', 'name'] + # sortBy = ['index:dsc', 'name'] + + print(sortedData(data, sortBy)) + + :type items: list[Item] + :type sortBy: list[str] + :rtype: list[Item] + """ + logger.debug('Sort by: %s', sortBy) + + t = time.time() + + for field in reversed(sortBy): + + tokens = field.split(':') + + reverse = False + if len(tokens) > 1: + field = tokens[0] + reverse = tokens[1] != 'asc' + + def sortKey(item): + + default = False if reverse else '' + + return item.itemData().get(field, default) + + items = sorted(items, key=sortKey, reverse=reverse) + + logger.debug("Sort items took %s", time.time() - t) + + return items + + @staticmethod + def groupItems(items, fields): + """ + Group the given items by the given field. + + :type items: list[Item] + :type fields: list[str] + :rtype: dict + """ + logger.debug('Group by: %s', fields) + + # Only support for top level grouping at the moment. + if fields: + field = fields[0] + else: + return {'None': items} + + t = time.time() + + results_ = {} + tokens = field.split(':') + + reverse = False + if len(tokens) > 1: + field = tokens[0] + reverse = tokens[1] != 'asc' + + for item in items: + value = item.itemData().get(field) + if value: + results_.setdefault(value, []) + results_[value].append(item) + + groups = sorted(results_.keys(), reverse=reverse) + + results = collections.OrderedDict() + for group in groups: + results[group] = results_[group] + + logger.debug("Group Items Took %s", time.time() - t) + + return results + + +def testsuite(): + + data = [ + {'name': 'blue', 'index': 3}, + {'name': 'red', 'index': 1}, + {'name': 'green', 'index': 2}, + ] + + sortBy = ['index:asc', 'name'] + data2 = (Library.sortedData(data, sortBy)) + + assert(data2[0].get('index') == 1) + assert(data2[1].get('index') == 2) + assert(data2[2].get('index') == 3) + + sortBy = ['index:dsc', 'name'] + data3 = (Library.sortedData(data, sortBy)) + + assert(data3[0].get('index') == 3) + assert(data3[1].get('index') == 2) + assert(data3[2].get('index') == 1) + + data = {'name': 'blue', 'index': 3} + queries = [{'filters': [('name', 'is', 'blue')]}] + assert Library.match(data, queries) + + data = {'name': 'red', 'index': 3} + queries = [{'filters': [('name', 'is', 'blue')]}] + assert not Library.match(data, queries) + + data = {'name': 'red', 'index': 3} + queries = [{'filters': [('name', 'startswith', 're')]}] + assert Library.match(data, queries) + + data = {'name': 'red', 'index': 3} + queries = [{'filters': [('name', 'startswith', 'ed')]}] + assert not Library.match(data, queries) + + data = {'name': 'red', 'index': 3} + queries = [{ + 'operator': 'or', + 'filters': [('name', 'is', 'pink'), ('name', 'is', 'red')] + }] + assert Library.match(data, queries) + + data = {'name': 'red', 'index': 3} + queries = [{ + 'operator': 'and', + 'filters': [('name', 'is', 'pink'), ('name', 'is', 'red')] + }] + assert not Library.match(data, queries) + + data = {'name': 'red', 'index': 3} + queries = [{ + 'operator': 'and', + 'filters': [('name', 'is', 'red'), ('index', 'is', 3)] + }] + assert Library.match(data, queries) + + data = {'name': 'red', 'index': 3} + queries = [{ + 'operator': 'and', + 'filters': [('name', 'is', 'red'), ('index', 'is', '3')] + }] + assert not Library.match(data, queries) + + +if __name__ == "__main__": + testsuite() diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/libraryitem.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/libraryitem.py new file mode 100644 index 0000000..94dd429 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/libraryitem.py @@ -0,0 +1,913 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +import os +import shutil +import logging +from functools import partial + +from studiovendor.Qt import QtGui +from studiovendor.Qt import QtCore +from studiovendor.Qt import QtWidgets + +import studiolibrary +import studiolibrary.widgets +import studiolibrary.librarywindow + +import studioqt + + +logger = logging.getLogger(__name__) + + +class ItemError(Exception): + """""" + + +class ItemSaveError(ItemError): + """""" + + +class ItemLoadError(ItemError): + """""" + + +class LibraryItemSignals(QtCore.QObject): + """""" + saved = QtCore.Signal(object) + saving = QtCore.Signal(object) + loaded = QtCore.Signal(object) + copied = QtCore.Signal(object, object, object) + deleted = QtCore.Signal(object) + renamed = QtCore.Signal(object, object, object) + dataChanged = QtCore.Signal(object) + +# Note: We will be changing the base class in the near future +class LibraryItem(studiolibrary.widgets.Item): + + NAME = "" + TYPE = "" + THUMBNAIL_PATH = studiolibrary.resource.get("icons", "thumbnail.png") + + EXTENSION = "" + EXTENSIONS = [] + + ENABLE_DELETE = False + ENABLE_NESTED_ITEMS = False + + SYNC_ORDER = 10 + MENU_ORDER = 10 + + SAVE_WIDGET_CLASS = None + LOAD_WIDGET_CLASS = None + + _libraryItemSignals = LibraryItemSignals() + + saved = _libraryItemSignals.saved + saving = _libraryItemSignals.saving + loaded = _libraryItemSignals.loaded + copied = _libraryItemSignals.renamed + renamed = _libraryItemSignals.renamed + deleted = _libraryItemSignals.deleted + dataChanged = _libraryItemSignals.dataChanged + + def createItemData(self): + """ + Called when syncing the given path with the library cache. + + :rtype: dict + """ + import studiolibrary.library + + path = self.path() + path = studiolibrary.latestVersionPath(path) or path + + if studiolibrary.isVersionPath(path): + dirname = os.path.dirname(path) + name = os.path.basename(dirname) + dirname, basename, extension = studiolibrary.splitPath(dirname) + else: + dirname, basename, extension = studiolibrary.splitPath(path) + name = os.path.basename(path) + + category = os.path.basename(dirname) or dirname + modified = "" + + if os.path.exists(path): + modified = os.path.getmtime(path) + + itemData = dict(self.readMetadata()) + + itemData.update({ + "name": name, + "path": path, + "type": self.TYPE or extension, + "folder": dirname, + "category": category, + "modified": modified, + "__class__": self.__class__.__module__ + "." + self.__class__.__name__ + }) + + return itemData + + @classmethod + def createAction(cls, menu, libraryWindow): + """ + Return the action to be displayed when the user + ks the "plus" icon. + + :type menu: QtWidgets.QMenu + :type libraryWindow: studiolibrary.LibraryWindow + :rtype: QtCore.QAction + """ + if cls.NAME: + + icon = QtGui.QIcon(cls.ICON_PATH) + callback = partial(cls.showSaveWidget, libraryWindow) + + action = QtWidgets.QAction(icon, cls.NAME, menu) + action.triggered.connect(callback) + + return action + + @classmethod + def showSaveWidget(cls, libraryWindow, item=None): + """ + Show the create widget for creating a new item. + + :type libraryWindow: studiolibrary.LibraryWindow + :type item: studiolibrary.LibraryItem or None + """ + item = item or cls() + widget = cls.SAVE_WIDGET_CLASS(item=item) + libraryWindow.setCreateWidget(widget) + + @classmethod + def isValidPath(cls, path): + """ + This method has been deprecated. + + Please use LibraryItem.match(cls, path) + + :type path: str + :rtype: bool + """ + return cls.match(path) + + @classmethod + def match(cls, path): + """ + Return True if the given path location is supported by the item. + + :type path: str + :rtype: bool + """ + extensions = cls.EXTENSIONS + if not extensions and cls.EXTENSION: + extensions = [cls.EXTENSION] + + for ext in extensions: + if path.endswith(ext): + return True + + return False + + def __init__( + self, + path="", + library=None, + libraryWindow=None, + ): + """ + The LibraryItem class provides an item for use with the LibraryWindow. + + :type path: str + :type library: studiolibrary.Library or None + :type libraryWindow: studiolibrary.LibraryWindow or None + """ + super(LibraryItem, self).__init__() + + self._path = path + self._modal = None + self._library = None + self._metadata = None + self._libraryWindow = None + + self._readOnly = False + self._ignoreExistsDialog = False + + if libraryWindow: + self.setLibraryWindow(libraryWindow) + + if library: + self.setLibrary(library) + + # if path: + # self.setPath(path) + + def updatePermissionsEnabled(self): + return False + + def setReadOnly(self, readOnly): + """ + Set the item to read only. + + :type readOnly: bool + """ + self._readOnly = readOnly + + def isReadOnly(self): + """ + Check if the item is read only. + + :rtype: bool + """ + if self.isLocked(): + return True + + return self._readOnly + + def isLocked(self): + """ + Check if the item has been locked by the window. + + :rtype: bool + """ + locked = False + if self.libraryWindow(): + locked = self.libraryWindow().isLocked() + return locked + + def isDeletable(self): + """ + Check if the item is deletable. + + :rtype: bool + """ + if self.isLocked(): + return False + + return self.ENABLE_DELETE + + def overwrite(self): + """ + Show the save widget with the input fields populated. + """ + self._ignoreExistsDialog = True + widget = self.showSaveWidget(self.libraryWindow(), item=self) + + def loadSchema(self): + """ + Get the options used to load the item. + + :rtype: list[dict] + """ + return [] + + def loadValidator(self, **kwargs): + """ + Validate the current load options. + + :type kwargs: dict + :rtype: list[dict] + """ + return [] + + def load(self, *args, **kwargs): + """ + Reimplement this method for loading item data. + + :type args: list + :type kwargs: dict + """ + raise NotImplementedError("The load method has not been implemented!") + + def id(self): + """ + Return the unique id for the item. + + :rtype: str + """ + return self.path() + + def showToastMessage(self, text): + """ + A convenience method for showing the toast widget with the given text. + + :type text: str + """ + if self.libraryWindow(): + self.libraryWindow().showToastMessage(text) + + def showErrorDialog(self, title, text): + """ + Convenience method for showing an error dialog to the user. + + :type title: str + :type text: str + :rtype: QMessageBox.StandardButton or None + """ + if self.libraryWindow(): + self.libraryWindow().showErrorMessage(text) + + button = None + + if not self._modal: + self._modal = True + + try: + button = studiolibrary.widgets.MessageBox.critical(self.libraryWindow(), title, text) + finally: + self._modal = False + + return button + + def showExceptionDialog(self, title, error): + """ + Convenience method for showing a question dialog to the user. + + :type title: str + :type error: Exception + :rtype: QMessageBox.StandardButton + """ + logger.exception(error) + return self.showErrorDialog(title, error) + + def showQuestionDialog(self, title, text): + """ + Convenience method for showing a question dialog to the user. + + :type title: str + :type text: str + :rtype: QMessageBox.StandardButton + """ + return studiolibrary.widgets.MessageBox.question(self.libraryWindow(), title, text) + + def thumbnailPath(self): + """ + Return the thumbnail location on disc for this item. + + :rtype: str + """ + thumbnailPath = self.path() + "/thumbnail.jpg" + if os.path.exists(thumbnailPath): + return thumbnailPath + + thumbnailPath = thumbnailPath.replace(".jpg", ".png") + if os.path.exists(thumbnailPath): + return thumbnailPath + + return self.THUMBNAIL_PATH + + def isTHUMBNAIL_PATH(self): + """ + Check if the thumbnail path is the default path. + + :rtype: bool + """ + return self.thumbnailPath() == self.THUMBNAIL_PATH + + def showPreviewWidget(self, libraryWindow): + """ + Show the preview Widget for the item instance. + + :type libraryWindow: studiolibrary.LibraryWindow + """ + widget = self.previewWidget(libraryWindow) + libraryWindow.setPreviewWidget(widget) + + def previewWidget(self, libraryWindow): + """ + Return the widget to be shown when the user clicks on the item. + + :type libraryWindow: studiolibrary.LibraryWindow + :rtype: QtWidgets.QWidget or None + """ + widget = None + + if self.LOAD_WIDGET_CLASS: + widget = self.LOAD_WIDGET_CLASS(item=self) + + return widget + + def isVersionPath(self): + return studiolibrary.isVersionPath(self.path()) + + def contextEditMenu(self, menu, items=None): + """ + Called when the user would like to edit the item from the menu. + + The given menu is shown as a submenu of the main context menu. + + :type menu: QtWidgets.QMenu + :type items: list[LibraryItem] or None + """ + # Adding a blank icon fixes the text alignment issue when using Qt 5.12.+ + icon = studiolibrary.resource.icon("blank") + enabled = not self.isVersionPath() + + action = QtWidgets.QAction("Rename", menu) + action.setEnabled(enabled) + action.setIcon(icon) + action.triggered.connect(self.showRenameDialog) + menu.addAction(action) + + action = QtWidgets.QAction("Move to", menu) + action.setEnabled(enabled) + action.triggered.connect(self.showMoveDialog) + menu.addAction(action) + + action = QtWidgets.QAction("Copy Path", menu) + action.triggered.connect(self.copyPathToClipboard) + action.setEnabled(enabled) + menu.addAction(action) + + if self.libraryWindow(): + action = QtWidgets.QAction("Select Folder", menu) + action.triggered.connect(self.selectFolder) + menu.addAction(action) + + action = QtWidgets.QAction("Show in Folder", menu) + action.triggered.connect(self.showInFolder) + menu.addAction(action) + + if self.isDeletable(): + menu.addSeparator() + action = QtWidgets.QAction("Delete", menu) + action.setEnabled(enabled) + action.triggered.connect(self.showDeleteDialog) + menu.addAction(action) + + self.createOverwriteMenu(menu) + + def createOverwriteMenu(self, menu): + """ + Create a menu or action to trigger the overwrite method. + + :type menu: QtWidgets.QMenu + """ + if not self.isReadOnly(): + enabled = not self.isVersionPath() + menu.addSeparator() + action = QtWidgets.QAction("Overwrite", menu) + action.setEnabled(enabled) + action.triggered.connect(self.overwrite) + menu.addAction(action) + + def copyPathToClipboard(self): + """Copy the item path to the system clipboard.""" + cb = QtWidgets.QApplication.clipboard() + cb.clear(mode=cb.Clipboard) + cb.setText(self.path(), mode=cb.Clipboard) + + def contextMenu(self, menu, items=None): + """ + Called when the user right clicks on the item. + + :type menu: QtWidgets.QMenu + :type items: list[LibraryItem] + :rtype: None + """ + pass + + def showInFolder(self): + """Open the file explorer at the given path location.""" + path = self.path() + studiolibrary.showInFolder(path) + + def selectFolder(self): + """select the folder in the library widget""" + if self.libraryWindow(): + path = '/'.join(studiolibrary.normPath(self.path()).split('/')[:-1]) + self.libraryWindow().selectFolderPath(path) + + def url(self): + """Used by the mime data when dragging/dropping the item.""" + return QtCore.QUrl("file:///" + self.path()) + + def setLibraryWindow(self, libraryWindow): + """ + Set the library widget containing the item. + + :rtype: studiolibrary.LibraryWindow or None + """ + self._libraryWindow = libraryWindow + + def libraryWindow(self): + """ + Return the library widget containing the item. + + :rtype: studiolibrary.LibraryWindow or None + """ + return self._libraryWindow + + def setLibrary(self, library): + """ + Set the library model for the item. + + :type library: studiolibrary.Library + """ + self._library = library + + def library(self): + """ + Return the library model for the item. + + :rtype: studiolibrary.Library or None + """ + if not self._library and self.libraryWindow(): + return self.libraryWindow().library() + + return self._library + + def setIconPath(self, path): + """ + Set the icon path for the current item. + + :type path: str + :rtype: None + """ + self._iconPath = path + + def iconPath(self): + """ + Return the icon path for the current item. + + :rtype: None + """ + return self._iconPath + + def mimeText(self): + """ + :rtype: str + """ + return self.path() + + def path(self): + """ + Get the path for the item. + + :rtype: str + """ + return self._path + + def setPath(self, path): + """ + Set the path for the item. + + :rtype: str + """ + self._path = studiolibrary.normPath(path) + + def setMetadata(self, metadata): + """ + Set the given metadata for the item. + + :type metadata: dict + """ + self._metadata = metadata + + def metadata(self): + """ + Get the metadata for the item from disc. + + :rtype: dict + """ + return self._metadata + + def updateMetadata(self, metadata): + """ + Update the current metadata from disc with the given metadata. + + :type metadata: dict + """ + metadata_ = self.readMetadata() + metadata_.update(metadata) + self.saveMetadata(metadata_) + + def saveMetadata(self, metadata): + """ + Save the given metadata to disc. + + :type metadata: dict + """ + formatString = studiolibrary.config.get('metadataPath') + path = studiolibrary.formatPath(formatString, self.path()) + studiolibrary.saveJson(path, metadata) + + if self.updatePermissionsEnabled(): + self.library().updatePermissions(path) + + self.setMetadata(metadata) + self.syncItemData(emitDataChanged=False) + self.dataChanged.emit(self) + + def readMetadata(self): + """ + Read the metadata for the item from disc. + + :rtype: dict + """ + if self._metadata is None: + formatString = studiolibrary.config.get('metadataPath') + path = studiolibrary.formatPath(formatString, self.path()) + + if os.path.exists(path): + self._metadata = studiolibrary.readJson(path) + else: + self._metadata = {} + + return self._metadata + + def syncItemData(self, emitDataChanged=True): + """Sync the item data to the database.""" + data = self.createItemData() + self.setItemData(data) + + if self.library(): + self.library().saveItemData([self], emitDataChanged=emitDataChanged) + + def saveSchema(self): + """ + Get the schema used for saving the item. + + :rtype: list[dict] + """ + return [] + + def saveValidator(self, **fields): + """ + Validate the given save fields. + + :type fields: dict + :rtype: list[dict] + """ + return [] + + @studioqt.showWaitCursor + def safeSave(self, *args, **kwargs): + """ + Safe save the item. + """ + dst = self.path() + + if dst and not dst.endswith(self.EXTENSION): + dst += self.EXTENSION + + self.setPath(dst) + + logger.debug(u'Item Saving: {0}'.format(dst)) + self.saving.emit(self) + + if os.path.exists(dst): + if studiolibrary.latestVersionPath(self.path()): + raise NameError("You can only save items that were " + "created using Studio Library version 2!") + elif self._ignoreExistsDialog: + self._moveToTrash() + else: + self.showAlreadyExistsDialog() + + tmp = studiolibrary.createTempPath(self.__class__.__name__) + + self.setPath(tmp) + + self.save(*args, **kwargs) + + shutil.move(tmp, dst) + self.setPath(dst) + + if self.updatePermissionsEnabled(): + self.library().updatePermissions(dst) + + self.syncItemData() + + if self.libraryWindow(): + self.libraryWindow().selectItems([self]) + + self.saved.emit(self) + logger.debug(u'Item Saved: {0}'.format(dst)) + + def save(self, *args, **kwargs): + """ + Save the item io data to the given path. + + :type args: list + :type kwargs: dict + """ + raise NotImplementedError("The save method has not been implemented!") + + # ----------------------------------------------------------------- + # Support for copy and rename + # ----------------------------------------------------------------- + + def delete(self): + """ + Delete the item from disc and the library model. + + :rtype: None + """ + studiolibrary.removePath(self.path()) + + if self.library(): + self.library().removePath(self.path()) + + self.deleted.emit(self) + + def copy(self, dst): + """ + Make a copy/duplicate the current item to the given destination. + + :type dst: str + :rtype: None + """ + src = self.path() + dst = studiolibrary.copyPath(src, dst) + + if self.library(): + self.library().copyPath(src, dst) + + self.copied.emit(self, src, dst) + + if self.libraryWindow(): + self.libraryWindow().refresh() + + def move(self, dst): + """ + Move the current item to the given destination. + + :type dst: str + :rtype: None + """ + self.rename(dst) + + def rename(self, dst, extension=None): + """ + Rename the current path to the given destination path. + + :type dst: str + :type extension: bool or None + :rtype: None + """ + extension = extension or self.EXTENSION + if dst and extension not in dst: + dst += extension + + src = self.path() + + # Rename the path on the filesystem + dst = studiolibrary.renamePath(src, dst) + + # Rename the path inside the library database + if self.library(): + self.library().renamePath(src, dst) + + self._path = dst + + self.syncItemData() + + self.renamed.emit(self, src, dst) + + def showRenameDialog(self, parent=None): + """ + Show the rename dialog. + + :type parent: QtWidgets.QWidget + """ + if self.isVersionPath(): + raise NameError("You can only rename items that were " + "created using Studio Library version 2!") + + select = False + + if self.libraryWindow(): + parent = parent or self.libraryWindow() + select = self.libraryWindow().selectedFolderPath() == self.path() + + name, button = studiolibrary.widgets.MessageBox.input( + parent, + "Rename item", + "Rename the current item to:", + inputText=self.name(), + buttons=[ + ("Rename", QtWidgets.QDialogButtonBox.AcceptRole), + ("Cancel", QtWidgets.QDialogButtonBox.RejectRole) + ] + ) + + if button == "Rename": + try: + self.rename(name) + + if select: + self.libraryWindow().selectFolderPath(self.path()) + + except Exception as error: + self.showExceptionDialog("Rename Error", error) + raise + + return button + + def showMoveDialog(self, parent=None): + """ + Show the move to browser dialog. + + :type parent: QtWidgets.QWidget + """ + if self.isVersionPath(): + raise NameError("You can only move items that were " + "created using Studio Library version 2!") + + title = "Move To..." + path = os.path.dirname(os.path.dirname(self.path())) + + dst = QtWidgets.QFileDialog.getExistingDirectory(None, title, path) + + if dst: + dst = "{}/{}".format(dst, os.path.basename(self.path())) + try: + self.move(dst) + except Exception as error: + self.showExceptionDialog("Move Error", error) + raise + + def showDeleteDialog(self): + """ + Show the delete item dialog. + + :rtype: None + """ + if self.isVersionPath(): + raise NameError("You can only delete items that were " + "created using Studio Library version 2!") + + text = 'Are you sure you want to delete this item?' + + button = self.showQuestionDialog("Delete Item", text) + + if button == QtWidgets.QDialogButtonBox.Yes: + try: + self.delete() + except Exception as error: + self.showExceptionDialog("Delete Error", error) + raise + + def showAlreadyExistsDialog(self): + """ + Show a warning dialog if the item already exists on save. + + :rtype: None + """ + if self.isVersionPath(): + raise NameError("You can only override items that were " + "created using Studio Library version 2!") + + if not self.libraryWindow(): + raise ItemSaveError("Item already exists!") + + title = "Item already exists" + text = 'Would you like to move the existing item "{}" to the trash?' + text = text.format(os.path.basename(self.path())) + + buttons = [ + QtWidgets.QDialogButtonBox.Yes, + QtWidgets.QDialogButtonBox.Cancel + ] + + try: + QtWidgets.QApplication.setOverrideCursor(QtCore.Qt.ArrowCursor) + button = self.libraryWindow().showQuestionDialog(title, text, buttons) + finally: + QtWidgets.QApplication.restoreOverrideCursor() + + if button == QtWidgets.QDialogButtonBox.Yes: + self._moveToTrash() + else: + raise ItemSaveError("You cannot save over an existing item.") + + return button + + # ----------------------------------------------------------------- + # Support for painting the type icon + # ----------------------------------------------------------------- + + def _moveToTrash(self): + """ + Move the current item to the trash. + + This method should only be used when saving. + """ + path = self.path() + library = self.library() + item = studiolibrary.LibraryItem(path, library=library) + self.libraryWindow().moveItemsToTrash([item]) + # self.setPath(path) diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/librarywindow.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/librarywindow.py new file mode 100644 index 0000000..ef3f41d --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/librarywindow.py @@ -0,0 +1,2787 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +import re +import os +import time +import copy +import logging +import webbrowser +from functools import partial + +from studiovendor.Qt import QtGui +from studiovendor.Qt import QtCore +from studiovendor.Qt import QtWidgets + +import studioqt +import studiolibrary +import studiolibrary.widgets + + +__all__ = ["LibraryWindow"] + + +logger = logging.getLogger(__name__) + + +class PreviewFrame(QtWidgets.QFrame): + pass + + +class SidebarFrame(QtWidgets.QFrame): + pass + + +class GlobalSignal(QtCore.QObject): + """ + Triggered for all library instance. + """ + folderSelectionChanged = QtCore.Signal(object, object) + + +class CheckForUpdate(QtCore.QThread): + + finished = QtCore.Signal(object) + + def __init__(self, url): + super(CheckForUpdate, self).__init__() + self.url = url + + def run(self): + info = studiolibrary.checkForUpdates() + self.finished.emit(info) + + +class LibraryWindow(QtWidgets.QWidget): + + _instances = {} + + DEFAULT_NAME = "Default" + DEFAULT_SETTINGS = { + "library": { + "sortBy": ["name:asc"], + "groupBy": ["category:asc"] + }, + "paneSizes": [130, 280, 180], + "geometry": [-1, -1, 820, 780], + "trashFolderVisible": False, + "sidebarWidgetVisible": True, + "previewWidgetVisible": True, + "menuBarWidgetVisible": True, + "statusBarWidgetVisible": True, + "recursiveSearchEnabled": True, + "itemsWidget": { + "spacing": 2, + "padding": 6, + "zoomAmount": 80, + "textVisible": True, + }, + "searchWidget": { + "text": "", + }, + "filterByMenu": { + "Folder": False + }, + "theme": { + "accentColor": "rgb(60, 160, 210)", + "backgroundColor": "rgb(50, 50, 60)", + } + } + + TRASH_ENABLED = True + TEMP_PATH_MENU_ENABLED = False + + DPI_ENABLED = studiolibrary.config.get("scaleFactorEnabled", False) + + ICON_COLOR = QtGui.QColor(255, 255, 255, 200) + ICON_BADGE_COLOR = QtGui.QColor(230, 230, 0) + + # Customize widget classes + SORTBY_MENU_CLASS = studiolibrary.widgets.SortByMenu + GROUPBY_MENU_CLASS = studiolibrary.widgets.GroupByMenu + FILTERBY_MENU_CLASS = studiolibrary.widgets.FilterByMenu + + ITEMS_WIDGET_CLASS = studiolibrary.widgets.ItemsWidget + SEARCH_WIDGET_CLASS = studiolibrary.widgets.SearchWidget + STATUS_WIDGET_CLASS = studiolibrary.widgets.StatusWidget + MENUBAR_WIDGET_CLASS = studiolibrary.widgets.MenuBarWidget + SIDEBAR_WIDGET_CLASS = studiolibrary.widgets.SidebarWidget + + # Customize library classe + LIBRARY_CLASS = studiolibrary.Library + + globalSignal = GlobalSignal() + + # Local signal + loaded = QtCore.Signal() + lockChanged = QtCore.Signal(object) + + itemRenamed = QtCore.Signal(str, str) + itemSelectionChanged = QtCore.Signal(object) + + folderRenamed = QtCore.Signal(str, str) + folderSelectionChanged = QtCore.Signal(object) + + @staticmethod + def instances(): + """ + Return all the LibraryWindow instances that have been initialised. + + :rtype: list[LibraryWindow] + """ + return LibraryWindow._instances.values() + + @staticmethod + def destroyInstances(): + """Delete all library widget instances.""" + for widget in LibraryWindow.instances(): + widget.destroy() + + LibraryWindow._instances = {} + + @classmethod + def instance( + cls, + name="", + path="", + show=True, + lock=False, + superusers=None, + lockRegExp=None, + unlockRegExp=None, + **kwargs + ): + """ + Return the library widget for the given name. + + :type name: str + :type path: str + :type show: bool + :type lock: bool + :type superusers: list[str] + :type lockRegExp: str + :type unlockRegExp: str + + :rtype: LibraryWindow + """ + name = name or studiolibrary.defaultLibrary() + + libraryWindow = LibraryWindow._instances.get(name) + + if not libraryWindow: + studioqt.installFonts(studiolibrary.resource.get("fonts")) + libraryWindow = cls(name=name) + LibraryWindow._instances[name] = libraryWindow + + kwargs_ = { + "lock": lock, + "show": show, + "superusers": superusers, + "lockRegExp": lockRegExp, + "unlockRegExp": unlockRegExp + } + + libraryWindow.setKwargs(kwargs_) + libraryWindow.setLocked(lock) + libraryWindow.setSuperusers(superusers) + libraryWindow.setLockRegExp(lockRegExp) + libraryWindow.setUnlockRegExp(unlockRegExp) + + if path: + libraryWindow.setPath(path) + + if show: + libraryWindow.show(**kwargs) + + return libraryWindow + + def __init__(self, parent=None, name="", path=""): + """ + Create a new instance of the Library Widget. + + :type parent: QtWidgets.QWidget or None + :type name: str + :type path: str + """ + QtWidgets.QWidget.__init__(self, parent) + + self.setObjectName("studiolibrary") + + version = studiolibrary.version() + + self.setWindowIcon(studiolibrary.resource.icon("icon_black")) + + self._dpi = 1.0 + self._path = "" + self._items = [] + self._name = name or self.DEFAULT_NAME + self._theme = None + self._kwargs = {} + self._isDebug = False + self._isLocked = False + self._isLoaded = False + self._previewWidget = None + self._currentItem = None + self._library = None + self._lightbox = None + self._refreshEnabled = False + self._progressBar = None + self._superusers = None + self._lockRegExp = None + self._unlockRegExp = None + self._settingsWidget = None + + self._updateInfo = {} + self._checkForUpdateThread = CheckForUpdate(self) + self._checkForUpdateThread.finished.connect(self.checkForUpdateFinished) + self._checkForUpdateEnabled = True + + self._trashEnabled = self.TRASH_ENABLED + + self._itemsHiddenCount = 0 + self._itemsVisibleCount = 0 + + self._isTrashFolderVisible = False + self._sidebarWidgetVisible = True + self._previewWidgetVisible = True + self._statusBarWidgetVisible = True + + # -------------------------------------------------------------------- + # Create Widgets + # -------------------------------------------------------------------- + + library = self.LIBRARY_CLASS(libraryWindow=self) + library.dataChanged.connect(self.refresh) + library.searchTimeFinished.connect(self._searchFinished) + + self._sidebarFrame = SidebarFrame(self) + self._previewFrame = PreviewFrame(self) + + self._itemsWidget = self.ITEMS_WIDGET_CLASS(self) + self._itemsWidget.installEventFilter(self) + self._itemsWidget.keyPressed.connect(self._keyPressed) + + tip = "Search all current items." + self._searchWidget = self.SEARCH_WIDGET_CLASS(self) + self._searchWidget.setToolTip(tip) + self._searchWidget.setStatusTip(tip) + + self._filterByMenu = self.FILTERBY_MENU_CLASS(self) + self._statusWidget = self.STATUS_WIDGET_CLASS(self) + + # Add the update available button to the status widget + self._updateAvailableButton = QtWidgets.QPushButton(self._statusWidget) + self._updateAvailableButton.setObjectName("updateAvailableButton") + self._updateAvailableButton.setText("Update Available") + self._updateAvailableButton.setCursor(QtCore.Qt.PointingHandCursor) + self._updateAvailableButton.hide() + self._updateAvailableButton.clicked.connect(self.openReleasesUrl) + + self.statusWidget().layout().addWidget(self._updateAvailableButton) + + self._menuBarWidget = self.MENUBAR_WIDGET_CLASS(self) + self._sidebarWidget = self.SIDEBAR_WIDGET_CLASS(self) + + self._filterByMenu.setDataset(library) + self._itemsWidget.setDataset(library) + self._searchWidget.setDataset(library) + self._sidebarWidget.setDataset(library) + + self.setLibrary(library) + + # -------------------------------------------------------------------- + # Setup the menu bar buttons + # -------------------------------------------------------------------- + + iconColor = self.iconColor() + + name = "New Item" + icon = studiolibrary.resource.icon("plus") + tip = "Add a new item to the selected folder" + self.addMenuBarAction(name, icon, tip, callback=self.showNewMenu) + self._menuBarWidget.addWidget(self._searchWidget) + + name = "Filters" + icon = studiolibrary.resource.icon("filter") + tip = "Filter the current results by type.\n" \ + "CTRL + Click will hide the others and show the selected one." + action = self.addMenuBarAction(name, icon, tip, callback=self.showFilterByMenu) + + name = "Item View" + icon = studiolibrary.resource.icon("sliders") + tip = "Change the style of the item view" + self.addMenuBarAction(name, icon, tip, callback=self.showItemViewMenu) + + name = "View" + icon = studiolibrary.resource.icon("columns-3") + tip = "Choose to show/hide both the preview and navigation pane.\n" \ + "CTRL + Click will hide the menu bar as well." + self.addMenuBarAction(name, icon, tip, callback=self.toggleView) + + name = "Sync items" + icon = studiolibrary.resource.icon("arrows-rotate") + tip = "Sync with the filesystem" + self.addMenuBarAction(name, icon, tip, callback=self.sync) + + name = "Settings" + icon = studiolibrary.resource.icon("bars") + tip = "Settings menu" + self.addMenuBarAction(name, icon, tip, callback=self.showSettingsMenu) + + # ------------------------------------------------------------------- + # Setup Layout + # ------------------------------------------------------------------- + + layout = QtWidgets.QVBoxLayout() + layout.setSpacing(0) + layout.setContentsMargins(0, 0, 0, 0) + self.setLayout(layout) + + layout = QtWidgets.QVBoxLayout() + layout.setContentsMargins(0, 1, 0, 0) + self._previewFrame.setLayout(layout) + + layout = QtWidgets.QVBoxLayout() + layout.setContentsMargins(0, 1, 0, 0) + + self._sidebarFrame.setLayout(layout) + self._sidebarFrame.layout().addWidget(self._sidebarWidget) + + self._splitter = QtWidgets.QSplitter(QtCore.Qt.Horizontal, self) + self._splitter.setSizePolicy(QtWidgets.QSizePolicy.Ignored, + QtWidgets.QSizePolicy.Expanding) + self._splitter.setHandleWidth(2) + self._splitter.setChildrenCollapsible(False) + + self._splitter.insertWidget(0, self._sidebarFrame) + self._splitter.insertWidget(1, self._itemsWidget) + self._splitter.insertWidget(2, self._previewFrame) + + self._splitter.setStretchFactor(0, False) + self._splitter.setStretchFactor(1, True) + self._splitter.setStretchFactor(2, False) + + self.layout().addWidget(self._menuBarWidget) + self.layout().addWidget(self._splitter) + self.layout().addWidget(self._statusWidget) + + vbox = QtWidgets.QVBoxLayout() + self._previewFrame.setLayout(vbox) + self._previewFrame.layout().setSpacing(0) + self._previewFrame.layout().setContentsMargins(0, 0, 0, 0) + self._previewFrame.setMinimumWidth(5) + + # ------------------------------------------------------------------- + # Setup Connections + # ------------------------------------------------------------------- + + itemsWidget = self.itemsWidget() + itemsWidget.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) + itemsWidget.itemMoved.connect(self._itemMoved) + itemsWidget.itemDropped.connect(self._itemDropped) + itemsWidget.itemSelectionChanged.connect(self._itemSelectionChanged) + itemsWidget.customContextMenuRequested.connect(self.showItemsContextMenu) + + sidebarWidget = self.sidebarWidget() + sidebarWidget.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) + sidebarWidget.itemDropped.connect(self._itemDropped) + sidebarWidget.itemSelectionChanged.connect(self._folderSelectionChanged) + sidebarWidget.customContextMenuRequested.connect(self.showFolderMenu) + sidebarWidget.settingsMenuRequested.connect(self._foldersMenuRequested) + + self.folderSelectionChanged.connect(self.updateLock) + + self.updateMenuBar() + self.updatePreviewWidget() + + if path: + self.setPath(path) + + def _keyPressed(self, event): + """ + Triggered from the items widget on key press event. + + :type event: QKeyEvent + """ + text = event.text().strip() + + if not text.isalpha() and not text.isdigit(): + return + + if text and not self.searchWidget().hasFocus(): + self.searchWidget().setFocus() + self.searchWidget().setText(text) + + def _searchFinished(self): + self.showRefreshMessage() + + def _foldersMenuRequested(self, menu): + """ + Triggered when the folders settings menu has been requested. + + :type menu: QtWidgets.QMenu + """ + # Adding a blank icon fixes the text alignment issue when using Qt 5.12.+ + icon = studiolibrary.resource.icon("blank") + + action = QtWidgets.QAction("Change Path", menu) + action.triggered.connect(self.showChangePathDialog) + action.setIcon(icon) + + menu.addAction(action) + menu.addSeparator() + + def _itemMoved(self, item): + """ + Triggered when the custom order has changed. + + :type item: studiolibrary.LibraryItem + :rtype: None + """ + self.saveCustomOrder() + + def _itemSelectionChanged(self): + """ + Triggered when an item is selected or deselected. + + :rtype: None + """ + item = self.itemsWidget().selectedItem() + + self.setPreviewWidgetFromItem(item) + self.itemSelectionChanged.emit(item) + + def _itemDropped(self, event): + """ + Triggered when items are dropped on the items widget or sidebar widget. + + :type event: QtCore.QEvent + :rtype: None + """ + mimeData = event.mimeData() + + if mimeData.hasUrls(): + urls = mimeData.urls() + path = self.selectedFolderPath() + items = self.createItemsFromUrls(urls) + + if self.isMoveItemsEnabled(): + self.showMoveItemsDialog(items, dst=path) + + elif not self.isCustomOrderEnabled(): + msg = 'Please sort by "Custom Order" to reorder items!' + self.showInfoMessage(msg) + + def _folderSelectionChanged(self): + """ + Triggered when a folder is selected or deselected. + + :rtype: None + """ + path = self.selectedFolderPath() + self.folderSelectionChanged.emit(path) + self.globalSignal.folderSelectionChanged.emit(self, path) + + def isUpdateAvailable(self): + return self._updateAvailable + + def checkForUpdate(self): + """Check if there are any new versions available.""" + self._updateAvailableButton.hide() + if self.isCheckForUpdateEnabled(): + self._checkForUpdateThread.start() + + def checkForUpdateFinished(self, info): + """Triggered when the check for update thread has finished.""" + self._updateInfo = info or {} + if self._updateInfo.get("updateFound"): + self._updateAvailableButton.show() + else: + self._updateAvailableButton.hide() + + def destroy(self): + """Destroy the current library window instance.""" + self.hide() + self.closePreviewWidget() + self.close() + self.itemsWidget().clear() + self.library().clear() + super(LibraryWindow, self).destroy() + + def setKwargs(self, kwargs): + """ + Set the key word arguments used to open the window. + + :type kwargs: dict + """ + self._kwargs.update(kwargs) + + def library(self): + """ + Return the library model object. + + :rtype: studiolibrary.Library + """ + return self._library + + def setLibrary(self, library): + """ + Set the library model. + + :type library: studiolibrary.Library + :rtype: None + """ + self._library = library + + def statusWidget(self): + """ + Return the status widget. + + :rtype: studioqt.StatusWidget + """ + return self._statusWidget + + def searchWidget(self): + """ + Return the search widget. + + :rtype: studioqt.SearchWidget + """ + return self._searchWidget + + def menuBarWidget(self): + """ + Return the menu bar widget. + + :rtype: MenuBarWidget + """ + return self._menuBarWidget + + def name(self): + """ + Return the name of the library. + + :rtype: str + """ + return self._name + + def path(self): + """ + Return the root path for the library. + + :rtype: str + """ + return self._path + + def setPath(self, path): + """ + Set the root path for the library. + + :type path: str + :rtype: None + """ + path = studiolibrary.realPath(path) + + if path == self.path(): + logger.debug("The root path is already set.") + return + + self._path = path + + library = self.library() + library.setPath(path) + + if not os.path.exists(library.databasePath()): + self.sync() + + self.refresh() + self.library().search() + self.updatePreviewWidget() + + @studioqt.showArrowCursor + def showPathErrorDialog(self): + """ + Called when the current root path doesn't exist on refresh. + + :rtype: None + """ + path = self.path() + + title = "Path Error" + + text = 'The current root path does not exist "{path}". ' \ + 'Please select a new root path to continue.' + + text = text.format(path=path) + + dialog = studiolibrary.widgets.createMessageBox(self, title, text) + + dialog.setHeaderColor("rgb(230, 80, 80)") + dialog.show() + + dialog.accepted.connect(self.showChangePathDialog) + + @studioqt.showArrowCursor + def showWelcomeDialog(self): + """ + Called when there is no root path set for the library. + + :rtype: None + """ + name = self.name() + + title = "Welcome" + title = title.format(studiolibrary.version(), name) + text = "Before you get started please choose a folder " \ + "location for storing the data. A network folder is " \ + "recommended for sharing within a studio." + + dialog = studiolibrary.widgets.createMessageBox(self, title, text) + dialog.show() + + dialog.accepted.connect(self.showChangePathDialog) + + def showChangePathDialog(self): + """ + Show a file browser dialog for changing the root path. + + :rtype: None + """ + path = self._showChangePathDialog() + if path: + self.setPath(path) + else: + self.refresh() + + @studioqt.showArrowCursor + def _showChangePathDialog(self): + """ + Open the file dialog for setting a new root path. + + :rtype: str + """ + path = self.path() + + if not path: + path = os.path.expanduser("~") + + path = QtWidgets.QFileDialog.getExistingDirectory( + None, + "Choose a root folder location", + path + ) + + return studiolibrary.normPath(path) + + def isRefreshEnabled(self): + """ + Return True if the LibraryWindow can be refreshed. + + :rtype: bool + """ + return self._refreshEnabled + + def setRefreshEnabled(self, enable): + """ + If enable is False, all updates will be ignored. + + :rtype: bool + """ + self.library().setSearchEnabled(enable) + self._refreshEnabled = enable + + @studioqt.showWaitCursor + def sync(self): + """ + Sync any data that might be out of date with the model. + + :rtype: None + """ + progressBar = self.statusWidget().progressBar() + + @studioqt.showWaitCursor + def _sync(): + elapsedTime = time.time() + self.library().sync(progressCallback=self.setProgressBarValue) + + elapsedTime = time.time() - elapsedTime + + msg = "Synced items in {0:.3f} seconds." + msg = msg.format(elapsedTime) + + self.statusWidget().showInfoMessage(msg) + self.setProgressBarValue("Done") + + studioqt.fadeOut(progressBar, duration=500, onFinished=progressBar.close) + + self.setProgressBarValue("Syncing") + studioqt.fadeIn(progressBar, duration=1, onFinished=_sync) + + progressBar.show() + + def setProgressBarValue(self, label, value=-1): + """Set the progress bar label and value""" + + progressBar = self.statusWidget().progressBar() + + if value == -1: + self.statusWidget().progressBar().reset() + value = 100 + + progressBar.setValue(value) + progressBar.setText(label) + + def refresh(self): + """ + Refresh all sidebar items and library items. + + :rtype: None + """ + if self.isRefreshEnabled(): + self.update() + + def update(self): + """Update the library widget and the data. """ + self.refreshSidebar() + self.updateWindowTitle() + + # ----------------------------------------------------------------- + # Methods for the sidebar widget + # ----------------------------------------------------------------- + + def sidebarWidget(self): + """ + Return the sidebar widget. + + :rtype: studioqt.SidebarWidget + """ + return self._sidebarWidget + + def selectedFolderPath(self): + """ + Return the selected folder items. + + :rtype: str or None + """ + return self.sidebarWidget().selectedPath() + + def selectedFolderPaths(self): + """ + Return the selected folder items. + + :rtype: list[str] + """ + return self.sidebarWidget().selectedPaths() + + def selectFolderPath(self, path): + """ + Select the given folder paths. + + :type path: str + :rtype: None + """ + self.selectFolderPaths([path]) + + def selectFolderPaths(self, paths): + """ + Select the given folder paths. + + :type paths: list[str] + :rtype: None + """ + self.sidebarWidget().selectPaths(paths) + + @studioqt.showWaitCursor + def refreshSidebar(self): + """ + Refresh the state of the sidebar widget. + + :rtype: None + """ + path = self.path() + + if not path: + return self.showWelcomeDialog() + elif not os.path.exists(path): + return self.showPathErrorDialog() + + self.updateSidebar() + + def updateSidebar(self): + """ + Update the folders to be shown in the folders widget. + + :rtype: None + """ + data = {} + root = self.path() + + queries = [{'filters': [('type', 'is', 'Folder')]}] + + items = self.library().findItems(queries) + + for item in items: + data[item.path()] = item.itemData() + + self.sidebarWidget().setData(data, root=root) + + def setFolderData(self, path, data): + """ + Convenience method for setting folder data. + + :type path: str + :type data: dict + """ + self.sidebarWidget().setItemData(path, data) + + def createFolderContextMenu(self): + """ + Return the folder menu for the selected folders. + + :rtype: QtWidgets.QMenu + """ + + path = self.selectedFolderPath() + + items = [] + + if path: + queries = [{"filters": [("path", "is", path)]}] + + items = self.library().findItems(queries) + + if items: + self._items_ = items + + return self.createItemContextMenu(items) + + # ----------------------------------------------------------------- + # Methods for the items widget + # ----------------------------------------------------------------- + + def itemsWidget(self): + """ + Return the widget the contains all the items. + + :rtype: studiolibrary.widgets.ItemsWidget + """ + return self._itemsWidget + + def selectPath(self, path): + """ + Select the item with the given path. + + :type path: str + :rtype: None + """ + self.selectPaths([path]) + + def selectPaths(self, paths): + """ + Select items with the given paths. + + :type paths: list[str] + :rtype: None + """ + selection = self.selectedItems() + + self.clearPreviewWidget() + self.itemsWidget().clearSelection() + self.itemsWidget().selectPaths(paths) + + if self.selectedItems() != selection: + self._itemSelectionChanged() + + def selectItems(self, items): + """ + Select the given items. + + :type items: list[studiolibrary.LibraryItem] + :rtype: None + """ + paths = [item.path() for item in items] + self.selectPaths(paths) + + def scrollToSelectedItem(self): + """ + Scroll the item widget to the selected item. + + :rtype: None + """ + self.itemsWidget().scrollToSelectedItem() + + def refreshSelection(self): + """ + Refresh the current item selection. + + :rtype: None + """ + items = self.selectedItems() + self.itemsWidget().clearSelection() + self.selectItems(items) + + def selectedItems(self): + """ + Return the selected items. + + :rtype: list[studiolibrary.LibraryItem] + """ + return self._itemsWidget.selectedItems() + + def clearItems(self): + """ + Remove all the loaded items. + + :rtype: list[studiolibrary.LibraryItem] + """ + self.itemsWidget().clear() + + def items(self): + """ + Return all the loaded items. + + :rtype: list[studiolibrary.LibraryItem] + """ + return self._items + + def addItem(self, item, select=False): + """ + Add the given item to the itemsWidget. + + :type item: studiolibrary.LibraryItem + :type select: bool + + :rtype: None + """ + self.addItems([item], select=select) + + def addItems(self, items, select=False): + """ + Add the given items to the itemsWidget. + + :type items: list[studiolibrary.LibraryItem] + :type select: bool + + :rtype: None + """ + self.itemsWidget().addItems(items) + self._items.extend(items) + + if select: + self.selectItems(items) + self.scrollToSelectedItem() + + def createItemsFromUrls(self, urls): + """ + Return a new list of items from the given urls. + + :rtype: list[studiolibrary.LibraryItem] + """ + return self.library().itemsFromUrls(urls, libraryWindow=self) + + # ----------------------------------------------------------------- + # Support for custom context menus + # ----------------------------------------------------------------- + + def addMenuBarAction(self, name, icon, tip, callback=None): + """ + Add a button/action to menu bar widget. + + :type name: str + :type icon: QtWidget.QIcon + :type tip: str + :type callback: func + :type: QtWidget.QAction + """ + + # The method below is needed to fix an issue with PySide2. + def _callback(): + callback() + + action = self.menuBarWidget().addAction(name) + + if icon: + action.setIcon(icon) + + if tip: + action.setToolTip(tip) + action.setStatusTip(tip) + + if callback: + action.triggered.connect(_callback) + + return action + + def showFilterByMenu(self): + """ + Show the filters menu. + + :rtype: None + """ + widget = self.menuBarWidget().findToolButton("Filters") + point = widget.mapToGlobal(QtCore.QPoint(0, widget.height())) + self._filterByMenu.show(point) + self.updateMenuBar() + + def showGroupByMenu(self): + """ + Show the group by menu at the group button. + + :rtype: None + """ + widget = self.menuBarWidget().findToolButton("Group By") + point = widget.mapToGlobal(QtCore.QPoint(0, widget.height())) + self._groupByMenu.show(point) + + def showSortByMenu(self): + """ + Show the sort by menu at the sort button. + + :rtype: None + """ + widget = self.menuBarWidget().findToolButton("Sort By") + point = widget.mapToGlobal(QtCore.QPoint(0, widget.height())) + self._sortByMenu.show(point) + + def showItemViewMenu(self): + """ + Show the item settings menu. + + :rtype: None + """ + menu = self.itemsWidget().createSettingsMenu() + widget = self.menuBarWidget().findToolButton("Item View") + + point = widget.mapToGlobal(QtCore.QPoint(0, widget.height())) + menu.exec_(point) + + def createNewItemMenu(self): + """ + Return the create new item menu for adding new folders and items. + + :rtype: QtWidgets.QMenu + """ + color = self.iconColor() + + icon = studiolibrary.resource.icon("add", color=color) + menu = QtWidgets.QMenu(self) + menu.setIcon(icon) + menu.setTitle("New") + + def _sortKey(item): + return item.MENU_ORDER + + for cls in sorted(studiolibrary.registeredItems(), key=_sortKey): + action = cls.createAction(menu, self) + + if action: + icon = studioqt.Icon(action.icon()) + icon.setColor(self.iconColor()) + + action.setIcon(icon) + menu.addAction(action) + + return menu + + def settingsValidator(self, **kwargs): + """ + The validator used for the settings dialog. + + :type kwargs: dict + """ + fields = [] + + color = kwargs.get("accentColor") + if color and self.theme().accentColor().toString() != color: + self.theme().setAccentColor(color) + + color = kwargs.get("backgroundColor") + if color and self.theme().backgroundColor().toString() != color: + self.theme().setBackgroundColor(color) + + path = kwargs.get("path", "") + if not os.path.exists(path): + fields.append( + { + "name": "path", + "value": path, + "error": "Path does not exists!" + } + ) + + scaleFactor = kwargs.get("scaleFactor") + scaleFactorMap = {"Small": 1.0, "Large": 1.5} + value = scaleFactorMap.get(scaleFactor, 1.0) + + if value != self.dpi(): + self.setDpi(value) + + return fields + + def settingsAccepted(self, **kwargs): + """ + Called when the user has accepted the changes in the settings dialog. + + :type kwargs: dict + """ + path = kwargs.get("path") + if path and path != self.path(): + self.setPath(path) + + self.saveSettings() + + def showSettingDialog(self): + """Show the settings dialog.""" + accentColor = self.theme().accentColor().toString() + backgroundColor = self.theme().backgroundColor().toString() + + form = { + "title": "Settings", + "description": "Your local settings", + "layout": "vertical", + "schema": [ + # {"name": "name", "type": "string", "default": self.name()}, + {"name": "path", "type": "path", "value": self.path()}, + { + "name": "accentColor", + "type": "color", + "value": accentColor, + "colors": [ + "rgb(225, 110, 110)", + # "rgb(220, 135, 100)", + "rgb(225, 150, 70)", + "rgb(225, 180, 35)", + "rgb(90, 175, 130)", + "rgb(100, 175, 160)", + "rgb(70, 160, 210)", + # "rgb(5, 135, 245)", + "rgb(30, 145, 245)", + "rgb(110, 125, 220)", + "rgb(100, 120, 150)", + ] + }, + { + "name": "backgroundColor", + "type": "color", + "value": backgroundColor, + "colors": [ + "rgb(45, 45, 48)", + "rgb(55, 55, 60)", + "rgb(68, 68, 70)", + "rgb(80, 60, 80)", + "rgb(85, 60, 60)", + "rgb(60, 75, 75)", + "rgb(60, 64, 79)", + "rgb(245, 245, 255)", + ] + }, + ], + "validator": self.settingsValidator, + "accepted": self.settingsAccepted, + } + + if self.DPI_ENABLED: + value = 'Large' if self.dpi() > 1 else "Small" + + form["schema"].append( + { + "name": "scaleFactor", + "type": "buttonGroup", + "title": "Scale Factor (DPI)", + "value": value, + "items": [ + "Small", + "Large", + ] + }, + ) + + self._settingsWidget = studiolibrary.widgets.FormDialog(form=form) + self._settingsWidget.setObjectName("settingsDialog") + self._settingsWidget.acceptButton().setText("Save") + + self._lightbox = studiolibrary.widgets.Lightbox(self) + self._lightbox.setWidget(self._settingsWidget) + self._lightbox.show() + + def createSettingsMenu(self): + """ + Return the settings menu for changing the library widget. + + :rtype: studioqt.Menu + """ + menu = studioqt.Menu("", self) + menu.setTitle("Settings") + + # Adding a blank icon fixes the text alignment issue when using Qt 5.12.+ + icon = studiolibrary.resource.icon("blank") + + action = menu.addAction("Sync") + action.triggered.connect(self.sync) + action.setIcon(icon) + + menu.addSeparator() + action = menu.addAction("Settings") + action.triggered.connect(self.showSettingDialog) + + menu.addSeparator() + + librariesMenu = studiolibrary.widgets.LibrariesMenu(libraryWindow=self) + menu.addMenu(librariesMenu) + menu.addSeparator() + + action = QtWidgets.QAction("Show Menu", menu) + action.setCheckable(True) + action.setChecked(self.isMenuBarWidgetVisible()) + action.triggered[bool].connect(self.setMenuBarWidgetVisible) + menu.addAction(action) + + action = QtWidgets.QAction("Show Sidebar", menu) + action.setCheckable(True) + action.setChecked(self.isFoldersWidgetVisible()) + action.triggered[bool].connect(self.setFoldersWidgetVisible) + menu.addAction(action) + + action = QtWidgets.QAction("Show Preview", menu) + action.setCheckable(True) + action.setChecked(self.isPreviewWidgetVisible()) + action.triggered[bool].connect(self.setPreviewWidgetVisible) + menu.addAction(action) + + action = QtWidgets.QAction("Show Status", menu) + action.setCheckable(True) + action.setChecked(self.isStatusBarWidgetVisible()) + action.triggered[bool].connect(self.setStatusBarWidgetVisible) + menu.addAction(action) + + menu.addSeparator() + + action = QtWidgets.QAction("Save Settings", menu) + action.triggered.connect(self.saveSettings) + menu.addAction(action) + + action = QtWidgets.QAction("Reset Settings", menu) + action.triggered.connect(self.resetSettings) + menu.addAction(action) + + action = QtWidgets.QAction("Open Settings", menu) + action.triggered.connect(self.openSettings) + menu.addAction(action) + + if self.TEMP_PATH_MENU_ENABLED: + action = QtWidgets.QAction("Open Temp Path", menu) + action.triggered.connect(self.openTempPath) + menu.addAction(action) + + menu.addSeparator() + + if self.trashEnabled(): + action = QtWidgets.QAction("Show Trash Folder", menu) + action.setEnabled(self.trashFolderExists()) + action.setCheckable(True) + action.setChecked(self.isTrashFolderVisible()) + action.triggered[bool].connect(self.setTrashFolderVisible) + menu.addAction(action) + + menu.addSeparator() + + action = QtWidgets.QAction("Enable Recursive Search", menu) + action.setCheckable(True) + action.setChecked(self.isRecursiveSearchEnabled()) + action.triggered[bool].connect(self.setRecursiveSearchEnabled) + menu.addAction(action) + + menu.addSeparator() + + viewMenu = self.itemsWidget().createSettingsMenu() + menu.addMenu(viewMenu) + + menu.addSeparator() + + action = QtWidgets.QAction("Check For Updates", menu) + action.setCheckable(True) + action.setChecked(self.isCheckForUpdateEnabled()) + action.triggered[bool].connect(self.setCheckForUpdateEnabled) + menu.addAction(action) + + action = QtWidgets.QAction("Debug Mode", menu) + action.setCheckable(True) + action.setChecked(self.isDebug()) + action.triggered[bool].connect(self.setDebugMode) + menu.addAction(action) + + menu.addSeparator() + + action = QtWidgets.QAction("Report Issue", menu) + action.triggered.connect(self.openReportUrl) + menu.addAction(action) + + action = QtWidgets.QAction("Help", menu) + action.triggered.connect(self.openHelpUrl) + menu.addAction(action) + + return menu + + def showNewMenu(self): + """ + Creates and shows the new menu at the new action button. + + :rtype: QtWidgets.QAction + """ + menu = self.createNewItemMenu() + + point = self.menuBarWidget().rect().bottomLeft() + point = self.menuBarWidget().mapToGlobal(point) + + return menu.exec_(point) + + def showSettingsMenu(self): + """ + Show the settings menu at the current cursor position. + + :rtype: QtWidgets.QAction + """ + menu = self.createSettingsMenu() + + point = self.menuBarWidget().rect().bottomRight() + point = self.menuBarWidget().mapToGlobal(point) + + # Align menu to the left of the cursor. + menu.move(-1000, -1000) # Fix display bug on linux + menu.show() + x = point.x() - menu.width() + point.setX(x) + + return menu.exec_(point) + + def showFolderMenu(self, pos=None): + """ + Show the folder context menu at the current cursor position. + + :type pos: None or QtCore.QPoint + :rtype: QtWidgets.QAction + """ + menu = self.createFolderContextMenu() + + point = QtGui.QCursor.pos() + point.setX(point.x() + 3) + point.setY(point.y() + 3) + action = menu.exec_(point) + menu.close() + + return action + + def showItemsContextMenu(self, pos=None): + """ + Show the item context menu at the current cursor position. + + :type pos: QtGui.QPoint + :rtype QtWidgets.QAction + """ + items = self.itemsWidget().selectedItems() + + menu = self.createItemContextMenu(items) + + point = QtGui.QCursor.pos() + point.setX(point.x() + 3) + point.setY(point.y() + 3) + action = menu.exec_(point) + menu.close() + + return action + + def createItemContextMenu(self, items): + """ + Return the item context menu for the given items. + + :type items: list[studiolibrary.LibraryItem] + :rtype: studiolibrary.ContextMenu + """ + menu = studioqt.Menu(self) + + item = None + + if items: + item = items[-1] + item.contextMenu(menu) + + if not self.isLocked(): + menu.addMenu(self.createNewItemMenu()) + + if item: + editMenu = studioqt.Menu(menu) + editMenu.setTitle("Edit") + menu.addMenu(editMenu) + + item.contextEditMenu(editMenu) + + if self.trashEnabled(): + editMenu.addSeparator() + + callback = partial(self.showMoveItemsToTrashDialog, items) + + action = QtWidgets.QAction("Move to Trash", editMenu) + action.setEnabled(not self.isTrashSelected()) + action.triggered.connect(callback) + editMenu.addAction(action) + + menu.addSeparator() + + sortByMenu = self.SORTBY_MENU_CLASS("Sort By", menu, self.library()) + menu.addMenu(sortByMenu) + + groupByMenu = self.GROUPBY_MENU_CLASS("Group By", menu, self.library()) + menu.addMenu(groupByMenu) + + menu.addSeparator() + menu.addMenu(self.createSettingsMenu()) + + return menu + + def saveCustomOrder(self): + """ + Convenience method for saving the custom order. + + :rtype: None + """ + self.library().saveItemData(self.library()._items, emitDataChanged=True) + + # ------------------------------------------------------------------- + # Support for moving items with drag and drop + # ------------------------------------------------------------------- + + def isCustomOrderEnabled(self): + """ + Return True if sorting by "Custom Order" is enabled. + + :rtype: bool + """ + return 'Custom Order' in str(self.library().sortBy()) + + def isMoveItemsEnabled(self): + """ + Return True if moving items via drag and drop is enabled. + + :rtype: bool + """ + paths = self.selectedFolderPaths() + + if len(paths) != 1: + return False + + if self.selectedItems(): + return False + + return True + + def createMoveItemsDialog(self): + """ + Create and return a dialog for moving items. + + :rtype: studiolibrary.widgets.MessageBox + """ + text = 'Would you like to copy or move the selected item/s?' + + dialog = studiolibrary.widgets.createMessageBox(self, "Move or Copy items?", text) + dialog.buttonBox().clear() + + dialog.addButton(u'Copy', QtWidgets.QDialogButtonBox.AcceptRole) + dialog.addButton(u'Move', QtWidgets.QDialogButtonBox.AcceptRole) + dialog.addButton(u'Cancel', QtWidgets.QDialogButtonBox.RejectRole) + + return dialog + + def showMoveItemsDialog(self, items, dst): + """ + Show the move items dialog for the given items. + + :type items: list[studiolibrary.LibraryItem] + :type dst: str + :rtype: None + """ + Copy = 0 + Cancel = 2 + + # Check if the items are moving to another folder. + for item in items: + + if item.isVersionPath(): + raise NameError("You can only save items that were " + "created using Studio Library version 2!") + + if os.path.dirname(item.path()) == dst: + return + + dialog = self.createMoveItemsDialog() + action = dialog.exec_() + dialog.close() + + if action == Cancel: + return + + copy = action == Copy + + self.moveItems(items, dst, copy=copy) + + def moveItems(self, items, dst, copy=False, force=False): + """ + Move the given items to the destination folder path. + + :type items: list[studiolibrary.LibraryItem] + :type dst: str + :type copy: bool + :type force: bool + :rtype: None + """ + self.itemsWidget().clearSelection() + + movedItems = [] + + try: + self.library().blockSignals(True) + + for item in items: + + path = dst + "/" + os.path.basename(item.path()) + + if force: + path = studiolibrary.generateUniquePath(path) + + if copy: + item.copy(path) + else: + item.rename(path) + + movedItems.append(item) + + except Exception as error: + self.showExceptionDialog("Move Error", error) + raise + finally: + self.library().blockSignals(False) + + self.refresh() + self.selectItems(movedItems) + self.scrollToSelectedItem() + + # ----------------------------------------------------------------------- + # Support for search + # ----------------------------------------------------------------------- + + def isPreviewWidgetVisible(self): + """ + Return True if the PreviewWidget is visible, otherwise return False. + + :rtype: bool + """ + return self._previewWidgetVisible + + def isFoldersWidgetVisible(self): + """ + Return True if the FoldersWidget is visible, otherwise return False. + + :rtype: bool + """ + return self._sidebarWidgetVisible + + def isStatusBarWidgetVisible(self): + """ + Return True if the StatusWidget is visible, otherwise return False. + + :rtype: bool + """ + return self._statusBarWidgetVisible + + def isMenuBarWidgetVisible(self): + """ + Return True if the MenuBarWidget is visible, otherwise return False. + + :rtype: bool + """ + return self.menuBarWidget().isExpanded() + + def setPreviewWidgetVisible(self, value): + """ + If the value is True then show the PreviewWidget, otherwise hide. + + :type value: bool + """ + value = bool(value) + self._previewWidgetVisible = value + + if value: + self._previewFrame.show() + else: + self._previewFrame.hide() + + self.updateMenuBar() + + def setFoldersWidgetVisible(self, value): + """ + If the value is True then show the FoldersWidget, otherwise hide. + + :type value: bool + """ + value = bool(value) + self._sidebarWidgetVisible = value + + if value: + self._sidebarFrame.show() + else: + self._sidebarFrame.hide() + + self.updateMenuBar() + + def setMenuBarWidgetVisible(self, value): + """ + If the value is True then show the tMenuBarWidget, otherwise hide. + + :type value: bool + """ + value = bool(value) + + if value: + self.menuBarWidget().expand() + else: + self.menuBarWidget().collapse() + + def setStatusBarWidgetVisible(self, value): + """ + If the value is True then show the StatusBarWidget, otherwise hide. + + :type value: bool + """ + value = bool(value) + + self._statusBarWidgetVisible = value + if value: + self.statusWidget().show() + else: + self.statusWidget().hide() + + # ----------------------------------------------------------------------- + # Support for search + # ----------------------------------------------------------------------- + + def itemsVisibleCount(self): + """ + Return the number of items visible. + + :rtype: int + """ + return self._itemsVisibleCount + + def itemsHiddenCount(self): + """ + Return the number of items hidden. + + :rtype: int + """ + return self._itemsHiddenCount + + def setSearchText(self, text): + """ + Set the search widget text.. + + :type text: str + :rtype: None + """ + self.searchWidget().setText(text) + + # ----------------------------------------------------------------------- + # Support for custom preview widgets + # ----------------------------------------------------------------------- + + def setCreateWidget(self, widget): + """ + :type widget: QtWidgets.QWidget + :rtype: None + """ + self.setPreviewWidgetVisible(True) + self.itemsWidget().clearSelection() + + # Force the preview pane to expand when creating a new item. + fsize, rsize, psize = self._splitter.sizes() + if psize < 150: + self.setSizes((fsize, rsize, 180)) + + self.setPreviewWidget(widget) + + def clearPreviewWidget(self): + """ + Set the default preview widget. + """ + self._previewWidget = None + widget = studiolibrary.widgets.PlaceholderWidget() + self.setPreviewWidget(widget) + + def updatePreviewWidget(self): + """Update the current preview widget.""" + self.setPreviewWidgetFromItem(self._currentItem, force=True) + + def setPreviewWidgetFromItem(self, item, force=False): + """ + :type item: studiolibrary.LibraryItem + :rtype: None + """ + if not force and self._currentItem == item: + logger.debug("The current item preview widget is already set.") + return + + self._currentItem = item + + if item: + self.closePreviewWidget() + try: + item.showPreviewWidget(self) + except Exception as error: + self.showErrorMessage(error) + self.clearPreviewWidget() + raise + else: + self.clearPreviewWidget() + + def previewWidget(self): + """ + Return the current preview widget. + + :rtype: QtWidgets.QWidget + """ + return self._previewWidget + + def setPreviewWidget(self, widget): + """ + Set the preview widget. + + :type widget: QtWidgets.QWidget + :rtype: None + """ + if self._previewWidget == widget: + msg = 'Preview widget already contains widget "{0}"' + msg.format(widget) + logger.debug(msg) + else: + self.closePreviewWidget() + self._previewWidget = widget + if self._previewWidget: + self._previewFrame.layout().addWidget(self._previewWidget) + self._previewWidget.show() + + def closePreviewWidget(self): + """ + Close and delete the preview widget. + + :rtype: None + """ + layout = self._previewFrame.layout() + + while layout.count(): + item = layout.takeAt(0) + item.widget().hide() + item.widget().close() + item.widget().deleteLater() + + self._previewWidget = None + + # ----------------------------------------------------------------------- + # Support for saving and loading the widget state + # ----------------------------------------------------------------------- + + def resetSettings(self): + """ + Reset the settings to the default settings. + + :rtype: str + """ + self.setSettings(self.DEFAULT_SETTINGS) + + def geometrySettings(self): + """ + Return the geometry values as a list. + + :rtype: list[int] + """ + settings = ( + self.window().geometry().x(), + self.window().geometry().y(), + self.window().geometry().width(), + self.window().geometry().height() + ) + return settings + + def setGeometrySettings(self, settings): + """ + Set the geometry of the widget with the given values. + + :type settings: list[int] + :rtype: None + """ + x, y, width, height = settings + + pos = QtGui.QCursor.pos() + geometry = QtWidgets.QApplication.screenAt(pos).availableGeometry() + screenWidth = geometry.width() + screenHeight = geometry.height() + + if x <= 0 or y <= 0 or x >= screenWidth or y >= screenHeight: + self.centerWindow(width, height) + else: + self.window().setGeometry(x, y, width, height) + + def settings(self): + """ + Return a dictionary with the widget settings. + + :rtype: dict + """ + settings = {} + + settings['dpi'] = self.dpi() + settings['kwargs'] = self._kwargs + settings['geometry'] = self.geometrySettings() + settings['paneSizes'] = self._splitter.sizes() + + if self.theme(): + settings['theme'] = self.theme().settings() + + settings["library"] = self.library().settings() + settings["trashFolderVisible"] = self.isTrashFolderVisible() + settings["sidebarWidgetVisible"] = self.isFoldersWidgetVisible() + settings["previewWidgetVisible"] = self.isPreviewWidgetVisible() + settings["menuBarWidgetVisible"] = self.isMenuBarWidgetVisible() + settings["statusBarWidgetVisible"] = self.isStatusBarWidgetVisible() + + settings['itemsWidget'] = self.itemsWidget().settings() + settings['searchWidget'] = self.searchWidget().settings() + settings['sidebarWidget'] = self.sidebarWidget().settings() + settings["recursiveSearchEnabled"] = self.isRecursiveSearchEnabled() + settings["checkForUpdateEnabled"] = self.isCheckForUpdateEnabled() + + settings['filterByMenu'] = self._filterByMenu.settings() + + settings["path"] = self.path() + + return settings + + def setSettings(self, settings): + """ + Set the widget settings from the given dictionary. + + :type settings: dict + """ + defaults = copy.deepcopy(self.DEFAULT_SETTINGS) + settings = studiolibrary.update(defaults, settings) + + isRefreshEnabled = self.isRefreshEnabled() + + try: + self.setRefreshEnabled(False) + self.itemsWidget().setToastEnabled(False) + + geometry = settings.get("geometry") + if geometry: + self.setGeometrySettings(geometry) + + themeSettings = settings.get("theme") + if themeSettings: + self.setThemeSettings(themeSettings) + + if not self.path(): + path = settings.get("path") + if path and os.path.exists(path): + self.setPath(path) + + dpi = settings.get("dpi", 1.0) + self.setDpi(dpi) + + sizes = settings.get('paneSizes') + if sizes and len(sizes) == 3: + self.setSizes(sizes) + + value = settings.get("sidebarWidgetVisible") + if value is not None: + self.setFoldersWidgetVisible(value) + + value = settings.get("menuBarWidgetVisible") + if value is not None: + self.setMenuBarWidgetVisible(value) + + value = settings.get("previewWidgetVisible") + if value is not None: + self.setPreviewWidgetVisible(value) + + value = settings.get("statusBarWidgetVisible") + if value is not None: + self.setStatusBarWidgetVisible(value) + + value = settings.get('searchWidget') + if value is not None: + self.searchWidget().setSettings(value) + + value = settings.get("recursiveSearchEnabled") + if value is not None: + self.setRecursiveSearchEnabled(value) + + value = settings.get("checkForUpdateEnabled") or studiolibrary.config.get("checkForUpdateEnabled") + if value is not None: + self.setCheckForUpdateEnabled(value) + + value = settings.get('filterByMenu') + if value is not None: + self._filterByMenu.setSettings(value) + + finally: + self.reloadStyleSheet() + self.setRefreshEnabled(isRefreshEnabled) + self.refresh() + + value = settings.get('library') + if value is not None: + self.library().setSettings(value) + + value = settings.get('trashFolderVisible') + if value is not None: + self.setTrashFolderVisible(value) + + value = settings.get('sidebarWidget', {}) + self.sidebarWidget().setSettings(value) + + value = settings.get('itemsWidget', {}) + self.itemsWidget().setSettings(value) + + self.itemsWidget().setToastEnabled(True) + + self.updateMenuBar() + + def updateSettings(self, settings): + """ + Save the given path to the settings on disc. + + :type settings: dict + :rtype: None + """ + data = self.readSettings() + data.update(settings) + self.saveSettings(data) + + def openTempPath(self): + """Launch the system explorer to the temp directory.""" + path = studiolibrary.tempPath() + studiolibrary.showInFolder(path) + + def openSettings(self): + """Launch the system explorer to the open directory.""" + path = studiolibrary.settingsPath() + studiolibrary.showInFolder(path) + + def saveSettings(self, data=None): + """ + Save the settings to the settings path set in the config. + + :type data: dict or None + :rtype: None + """ + settings = studiolibrary.readSettings() + + settings.setdefault(self.name(), {}) + settings[self.name()].update(data or self.settings()) + + studiolibrary.saveSettings(settings) + + self.showToastMessage("Saved") + + @studioqt.showWaitCursor + def loadSettings(self): + """ + Load the user settings from disc. + + :rtype: None + """ + self.reloadStyleSheet() + settings = self.readSettings() + self.setSettings(settings) + + def readSettings(self): + """ + Get the user settings from disc. + + :rtype: dict + """ + key = self.name() + data = studiolibrary.readSettings() + return data.get(key, {}) + + def isLoaded(self): + """ + Return True if the Studio Library has been shown + + :rtype: bool + """ + return self._isLoaded + + def setLoaded(self, loaded): + """ + Set if the widget has been shown. + + :type loaded: bool + :rtype: None + """ + self._isLoaded = loaded + + def setSizes(self, sizes): + """ + :type sizes: (int, int, int) + :rtype: None + """ + fSize, cSize, pSize = sizes + + if pSize == 0: + pSize = 200 + + if fSize == 0: + fSize = 120 + + self._splitter.setSizes([fSize, cSize, pSize]) + self._splitter.setStretchFactor(1, 1) + + def centerWindow(self, width=None, height=None): + """ + Center the widget to the center of the desktop. + + :rtype: None + """ + geometry = self.frameGeometry() + + if width: + geometry.setWidth(width) + + if height: + geometry.setHeight(height) + + pos = QtGui.QCursor.pos() + screen = QtWidgets.QApplication.screenAt(pos) + centerPoint = screen.availableGeometry().center() + + geometry.moveCenter(centerPoint) + self.window().setGeometry(geometry) + + # ----------------------------------------------------------------------- + # Overloading events + # ----------------------------------------------------------------------- + + def event(self, event): + """ + :type event: QtWidgets.QEvent + :rtype: QtWidgets.QEvent + """ + if isinstance(event, QtGui.QKeyEvent): + if studioqt.isControlModifier() and event.key() == QtCore.Qt.Key_F: + self.searchWidget().setFocus() + + if isinstance(event, QtGui.QStatusTipEvent): + self.statusWidget().showInfoMessage(event.tip()) + + return QtWidgets.QWidget.event(self, event) + + def keyReleaseEvent(self, event): + """ + :type event: QtGui.QKeyEvent + :rtype: None + """ + for item in self.selectedItems(): + item.keyReleaseEvent(event) + QtWidgets.QWidget.keyReleaseEvent(self, event) + + def closeEvent(self, event): + """ + :type event: QtWidgets.QEvent + :rtype: None + """ + self.saveSettings() + QtWidgets.QWidget.closeEvent(self, event) + + def show(self, **kwargs): + """ + Overriding this method to always raise_ the widget on show. + + Developers can use the kwargs to set platform dependent show options used in subclasses. + + :rtype: None + """ + QtWidgets.QWidget.show(self) + self.setWindowState(QtCore.Qt.WindowNoState) + self.raise_() + + def showEvent(self, event): + """ + :type event: QtWidgets.QEvent + :rtype: None + """ + QtWidgets.QWidget.showEvent(self, event) + + if not self.isLoaded(): + self.setLoaded(True) + self.setRefreshEnabled(True) + self.loadSettings() + + # ----------------------------------------------------------------------- + # Support for themes and custom style sheets + # ----------------------------------------------------------------------- + + def dpi(self): + """ + Return the current dpi for the library widget. + + :rtype: float + """ + if not self.DPI_ENABLED: + return 1.0 + + return float(self._dpi) + + def setDpi(self, dpi): + """ + Set the current dpi for the library widget. + + :rtype: float + """ + if not self.DPI_ENABLED: + dpi = 1.0 + + self._dpi = dpi + + self.itemsWidget().setDpi(dpi) + self.menuBarWidget().setDpi(dpi) + self.sidebarWidget().setDpi(dpi) + self.statusWidget().setFixedHeight(20 * dpi) + + self._splitter.setHandleWidth(2 * dpi) + + self.showToastMessage("DPI: {0}".format(int(dpi * 100))) + + self.reloadStyleSheet() + + def iconColor(self): + """ + Return the icon color. + + :rtype: studioqt.Color + """ + return self.ICON_COLOR + + def setThemeSettings(self, settings): + """ + Set the theme from the given settings. + + :type settings: dict + :rtype: None + """ + theme = studiolibrary.widgets.Theme() + theme.setSettings(settings) + self.setTheme(theme) + + def setTheme(self, theme): + """ + Set the theme. + + :type theme: studioqt.Theme + :rtype: None + """ + self._theme = theme + self._theme.updated.connect(self.reloadStyleSheet) + self.reloadStyleSheet() + + def theme(self): + """ + Return the current theme. + + :rtype: studioqt.Theme + """ + if not self._theme: + self._theme = studiolibrary.widgets.Theme() + + return self._theme + + def reloadStyleSheet(self): + """ + Reload the style sheet to the current theme. + + :rtype: None + """ + theme = self.theme() + theme.setDpi(self.dpi()) + + options = theme.options() + styleSheet = theme.styleSheet() + + color = studioqt.Color.fromString(options["ITEM_TEXT_COLOR"]) + self.itemsWidget().setTextColor(color) + + color = studioqt.Color.fromString(options["ITEM_TEXT_SELECTED_COLOR"]) + self.itemsWidget().setTextSelectedColor(color) + + color = studioqt.Color.fromString(options["ITEM_BACKGROUND_COLOR"]) + self.itemsWidget().setItemBackgroundColor(color) + + color = studioqt.Color.fromString(options["BACKGROUND_COLOR"]) + self.itemsWidget().setBackgroundColor(color) + + color = studioqt.Color.fromString( + options["ITEM_BACKGROUND_HOVER_COLOR"]) + self.itemsWidget().setBackgroundHoverColor(color) + + color = studioqt.Color.fromString( + options["ITEM_BACKGROUND_SELECTED_COLOR"]) + self.itemsWidget().setBackgroundSelectedColor(color) + + self.setStyleSheet(styleSheet) + + # Reloading the style sheets is needed for OSX + self.itemsWidget().setStyleSheet(self.itemsWidget().styleSheet()) + self.searchWidget().setStyleSheet(self.searchWidget().styleSheet()) + self.menuBarWidget().setStyleSheet(self.menuBarWidget().styleSheet()) + self.sidebarWidget().setStyleSheet(self.sidebarWidget().styleSheet()) + self.previewWidget().setStyleSheet(self.previewWidget().styleSheet()) + + if self._settingsWidget: + self._settingsWidget.setStyleSheet(self._settingsWidget.styleSheet()) + + self.searchWidget().update() + self.menuBarWidget().update() + self.sidebarWidget().update() + + # ----------------------------------------------------------------------- + # Support for the Trash folder. + # ----------------------------------------------------------------------- + + def trashEnabled(self): + """ + Return True if moving items to trash. + + :rtype: bool + """ + return self._trashEnabled + + def setTrashEnabled(self, enable): + """ + Enable items to be trashed. + + :type enable: bool + :rtype: None + """ + self._trashEnabled = enable + + def isPathInTrash(self, path): + """ + Return True if the given path is in the Trash path. + + :rtype: bool + """ + return "trash" in path.lower() + + def trashPath(self): + """ + Return the trash path for the library. + + :rtype: str + """ + path = self.path() + return u'{0}/{1}'.format(path, "Trash") + + def trashFolderExists(self): + """ + Return True if the trash folder exists. + + :rtype: bool + """ + return os.path.exists(self.trashPath()) + + def createTrashFolder(self): + """ + Create the trash folder if it does not exist. + + :rtype: None + """ + path = self.trashPath() + if not os.path.exists(path): + os.makedirs(path) + + def isTrashFolderVisible(self): + """ + Return True if the trash folder is visible to the user. + + :rtype: bool + """ + return self._isTrashFolderVisible + + def setTrashFolderVisible(self, visible): + """ + Enable the trash folder to be visible to the user. + + :type visible: str + :rtype: None + """ + self._isTrashFolderVisible = visible + + if visible: + query = { + 'name': 'trash_query', + 'filters': [] + } + else: + query = { + 'name': 'trash_query', + 'filters': [('path', 'not_contains', 'Trash')] + } + + self.library().addGlobalQuery(query) + self.updateSidebar() + self.library().search() + + def isTrashSelected(self): + """ + Return True if the selected folders is in the trash. + + :rtype: bool + """ + folders = self.selectedFolderPaths() + for folder in folders: + if self.isPathInTrash(folder): + return True + + items = self.selectedItems() + for item in items: + if self.isPathInTrash(item.path()): + return True + + return False + + def moveItemsToTrash(self, items): + """ + Move the given items to trash path. + + :items items: list[studiolibrary.LibraryItem] + :rtype: None + """ + self.createTrashFolder() + self.moveItems(items, dst=self.trashPath(), force=True) + + def showMoveItemsToTrashDialog(self, items=None): + """ + Show the "Move to trash" dialog for the selected items. + + :type items: list[studiolibrary.LibraryItem] or None + :rtype: None + """ + items = items or self.selectedItems() + + if items: + title = "Move to trash?" + text = "Are you sure you want to move the selected" \ + "item/s to the trash?" + + buttons = [ + ("Move to Trash", QtWidgets.QDialogButtonBox.AcceptRole), + QtWidgets.QDialogButtonBox.Cancel + ] + + result = studiolibrary.widgets.MessageBox.question(self, title, text, buttons=buttons) + + if result != QtWidgets.QDialogButtonBox.Cancel: + self.moveItemsToTrash(items) + + # ----------------------------------------------------------------------- + # Support for message boxes + # ----------------------------------------------------------------------- + + def showToastMessage(self, text, duration=1000): + """ + A convenience method for showing the toast widget with the given text. + + :type text: str + :type duration: int + :rtype: None + """ + self.itemsWidget().showToastMessage(text, duration) + + def showInfoMessage(self, text): + """ + A convenience method for showing an info message to the user. + + :type text: str + :rtype: None + """ + self.statusWidget().showInfoMessage(text) + + def showErrorMessage(self, text): + """ + A convenience method for showing an error message to the user. + + :type text: str + :rtype: None + """ + self.statusWidget().showErrorMessage(text) + self.setStatusBarWidgetVisible(True) + + def showWarningMessage(self, text): + """ + A convenience method for showing a warning message to the user. + + :type text: str + :rtype: None + """ + self.statusWidget().showWarningMessage(text) + self.setStatusBarWidgetVisible(True) + + def showRefreshMessage(self): + """Show how long the current refresh took.""" + itemCount = len(self.library().results()) + elapsedTime = self.library().searchTime() + + plural = "" + if itemCount > 1: + plural = "s" + + msg = "Found {0} item{1} in {2:.3f} seconds." + msg = msg.format(itemCount, plural, elapsedTime) + self.statusWidget().showInfoMessage(msg) + + logger.debug(msg) + + def showInfoDialog(self, title, text): + """ + A convenience method for showing an information dialog to the user. + + :type title: str + :type text: str + :rtype: QMessageBox.StandardButton + """ + buttons = QtWidgets.QDialogButtonBox.Ok + + return studiolibrary.widgets.MessageBox.question(self, title, text, buttons=buttons) + + def showErrorDialog(self, title, text): + """ + A convenience method for showing an error dialog to the user. + + :type title: str + :type text: str + :rtype: QMessageBox.StandardButton + """ + self.showErrorMessage(text) + return studiolibrary.widgets.MessageBox.critical(self, title, text) + + def showExceptionDialog(self, title, error): + """ + A convenience method for showing an error dialog to the user. + + :type title: str + :type error: Exception + :rtype: QMessageBox.StandardButton + """ + logger.exception(error) + self.showErrorDialog(title, error) + + def showQuestionDialog(self, title, text, buttons=None): + """ + A convenience method for showing a question dialog to the user. + + :type title: str + :type text: str + :type buttons: list[QMessageBox.StandardButton] + :rtype: QMessageBox.StandardButton + """ + buttons = buttons or [ + QtWidgets.QDialogButtonBox.Yes, + QtWidgets.QDialogButtonBox.No, + QtWidgets.QDialogButtonBox.Cancel + ] + + return studiolibrary.widgets.MessageBox.question(self, title, text, buttons=buttons) + + def updateWindowTitle(self): + """ + Update the window title with the version and lock status. + + :rtype: None + """ + title = "Studio Library - " + title += studiolibrary.version() + " - " + self.name() + + if self.isLocked(): + title += " (Locked)" + + self.setWindowTitle(title) + + # ----------------------------------------------------------------------- + # Support for locking via regex + # ----------------------------------------------------------------------- + + def isLocked(self): + """ + Return lock state of the library. + + :rtype: bool + """ + return self._isLocked + + def setLocked(self, value): + """ + Set the state of the widget to not editable. + + :type value: bool + :rtype: None + """ + self._isLocked = value + + self.sidebarWidget().setLocked(value) + self.itemsWidget().setLocked(value) + + self.updateMenuBar() + self.updateWindowTitle() + + self.lockChanged.emit(value) + + def superusers(self): + """ + Return the superusers for the widget. + + :rtype: list[str] + """ + return self._superusers + + def setSuperusers(self, superusers): + """ + Set the valid superusers for the library widget. + + This will lock all folders unless the current user is a superuser. + + :type superusers: list[str] + :rtype: None + """ + self._superusers = superusers + self.updateLock() + + def lockRegExp(self): + """ + Return the lock regexp used for locking the widget. + + :rtype: str + """ + return self._lockRegExp + + def setLockRegExp(self, regExp): + """ + Set the lock regexp used for locking the widget. + + Lock only folders that contain the given regExp in their path. + + :type regExp: str + :rtype: None + """ + self._lockRegExp = regExp + self.updateLock() + + def unlockRegExp(self): + """ + Return the unlock regexp used for unlocking the widget. + + :rtype: str + """ + return self._unlockRegExp + + def setUnlockRegExp(self, regExp): + """ + Return the unlock regexp used for locking the widget. + + Unlock only folders that contain the given regExp in their path. + + :type regExp: str + :rtype: None + """ + self._unlockRegExp = regExp + self.updateLock() + + def isLockRegExpEnabled(self): + """ + Return True if either the lockRegExp or unlockRegExp has been set. + + :rtype: bool + """ + return not ( + self.superusers() is None + and self.lockRegExp() is None + and self.unlockRegExp() is None + ) + + def updateLock(self): + """ + Update the lock state for the library. + + This is triggered when the user clicks on a folder. + + :rtype: None + """ + if not self.isLockRegExpEnabled(): + return + + superusers = self.superusers() or [] + reLocked = re.compile(self.lockRegExp() or "") + reUnlocked = re.compile(self.unlockRegExp() or "") + + if studiolibrary.user() in superusers: + self.setLocked(False) + + elif reLocked.match("") and reUnlocked.match(""): + + if superusers: + # Lock if only the superusers arg is used + self.setLocked(True) + else: + # Unlock if no keyword arguments are used + self.setLocked(False) + + else: + folders = self.selectedFolderPaths() + + # Lock the selected folders that match the reLocked regx + if not reLocked.match(""): + for folder in folders: + if reLocked.search(folder): + self.setLocked(True) + return + + self.setLocked(False) + + # Unlock the selected folders that match the reUnlocked regx + if not reUnlocked.match(""): + for folder in folders: + if reUnlocked.search(folder): + self.setLocked(False) + return + + self.setLocked(True) + + # ----------------------------------------------------------------------- + # Misc + # ----------------------------------------------------------------------- + + def isCompactView(self): + """ + Return True if both the folder and preview widget are hidden + + :rtype: bool + """ + return not self.isFoldersWidgetVisible() and not self.isPreviewWidgetVisible() + + def toggleView(self): + """ + Toggle the preview widget and folder widget visible. + + :rtype: None + """ + compact = self.isCompactView() + + if studioqt.isControlModifier(): + compact = False + self.setMenuBarWidgetVisible(compact) + + self.setPreviewWidgetVisible(compact) + self.setFoldersWidgetVisible(compact) + + def updateMenuBar(self): + + # Update view icon + action = self.menuBarWidget().findAction("New Item") + + if self.isLocked(): + icon = studiolibrary.resource.icon("lock") + action.setEnabled(False) + else: + icon = studiolibrary.resource.icon("plus-large") + action.setEnabled(True) + + action.setIcon(icon) + + # Update view icon + action = self.menuBarWidget().findAction("View") + + if not self.isCompactView(): + icon = studiolibrary.resource.icon("eye") + else: + icon = studiolibrary.resource.icon("eye-slash") + + action.setIcon(icon) + + # Update filters icon + action = self.menuBarWidget().findAction("Filters") + + if self._filterByMenu.isActive(): + icon = studiolibrary.resource.icon("filter") + action._badgeColor = self.ICON_BADGE_COLOR + action._badgeEnabled = True + else: + icon = studiolibrary.resource.icon("filter") + + action.setIcon(icon) + + self.menuBarWidget().updateIconColor() + + def isRecursiveSearchEnabled(self): + """ + Return True if recursive search is enabled. + + :rtype: bool + """ + return self.sidebarWidget().isRecursive() + + def setRecursiveSearchEnabled(self, value): + """ + Enable recursive search for searching sub folders. + + :type value: int + + :rtype: None + """ + self.sidebarWidget().setRecursive(value) + + def openHelpUrl(self): + """Open the help URL in a web browse.""" + webbrowser.open(self._updateInfo.get("helpUrl", "https://www.studiolibrary.com")) + + def openReportUrl(self): + """Open the report URL in a web browse.""" + webbrowser.open(self._updateInfo.get("reportUrl", "https://www.studiolibrary.com")) + + def openReleasesUrl(self): + """Open the releases URL in a web browser.""" + webbrowser.open(self._updateInfo.get("releasesUrl", "https://www.studiolibrary.com")) + + def setDebugMode(self, value): + """ + :type value: bool + """ + self._isDebug = value + studiolibrary.setDebugMode(value) + + def setCheckForUpdateEnabled(self, value): + self._checkForUpdateEnabled = value + self.checkForUpdate() + + def isCheckForUpdateEnabled(self): + return self._checkForUpdateEnabled + + def isDebug(self): + """ + :rtype: bool + """ + return self._isDebug diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/main.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/main.py new file mode 100644 index 0000000..aabcc5c --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/main.py @@ -0,0 +1,58 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +import studioqt +import studiolibrary + + +def main(*args, **kwargs): + """ + Convenience method for creating/showing a library widget instance. + + return studiolibrary.LibraryWindow.instance( + name="", + path="", + show=True, + lock=False, + superusers=None, + lockRegExp=None, + unlockRegExp=None + ) + + :rtype: studiolibrary.LibraryWindow + """ + # Reload all Studio Library modules when Shift is pressed. + # This is for developers to test their changes in a DCC application. + if studioqt.isShiftModifier(): + import studiolibrary + studiolibrary.reload() + + # Register all the items from the config file. + import studiolibrary + studiolibrary.registerItems() + + if studiolibrary.isMaya(): + from studiolibrarymaya import mayalibrarywindow + libraryWindow = mayalibrarywindow.MayaLibraryWindow.instance(*args, **kwargs) + else: + from studiolibrary import librarywindow + libraryWindow = librarywindow.LibraryWindow.instance(*args, **kwargs) + + return libraryWindow + + +if __name__ == "__main__": + + # Run the Studio Library in a QApplication instance + import studioqt + with studioqt.app(): + studiolibrary.main() diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource.py new file mode 100644 index 0000000..7b71aa6 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource.py @@ -0,0 +1,74 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +import os + +from studioqt import Icon +from studioqt import Pixmap + +from . import utils + + +PATH = os.path.abspath(__file__) +DIRNAME = os.path.dirname(PATH) +RESOURCE_DIRNAME = os.path.join(DIRNAME, "resource") + + +def get(*args): + """ + This is a convenience function for returning the resource path. + + :rtype: str + """ + path = os.path.join(RESOURCE_DIRNAME, *args) + return utils.normPath(path) + + +def icon(*args, **kwargs): + """ + Return an Icon object from the given resource name. + + :rtype: str + """ + path = get("icons", *args) + return Icon(pixmap(path, **kwargs)) + + +def pixmap(name, scope="icons", extension="png", color=None): + """ + Return a Pixmap object from the given resource name. + + :type name: str + :type scope: str + :type extension: str + :type color: str + :rtype: QtWidgets.QPixmap + """ + if name.endswith(".svg"): + extension = "" + + path = "" + + if os.path.exists(name): + path = name + + elif extension: + path = get(scope, name + "." + extension) + if not os.path.exists(path): + path = get(scope, name + ".svg") + + p = Pixmap(path) + + if color: + p.setColor(color) + + return p diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/css/default.css b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/css/default.css new file mode 100644 index 0000000..5cb3cdc --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/css/default.css @@ -0,0 +1,1515 @@ + +/* + -------------------------------------------------------------------------- + Base widgets + -------------------------------------------------------------------------- +*/ + +QWidget { + font-size: 12px; + font-family: Open Sans; + color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 180); +} + +QFrame { + background-color: BACKGROUND_COLOR; +} + +QWidget:disabled { + color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 100); +} + +QLineEdit, QPushButton, QToolBar, QToolButton, QTabBar, QTabBar::tab { + border: 0px; + background-color: BACKGROUND_COLOR; +} + +MenuBarWidget, MenuBarWidget QToolButton { + color: ACCENT_FOREGROUND_COLOR; + background-color: ACCENT_COLOR; + qproperty-iconSize: 24px; +} + +QToolBar { + spacing: 4px; +} + +MenuBarWidget { + spacing: 2px; +} + +MenuBarWidget QToolButton { + min-height: 28px; + max-height: 28px; + min-width: 28px; + max-width: 28px; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + + +MenuBarWidget QToolButton:Hover { + background-color: rgba(255,255,255,55); +} + +QToolTip { + background-color: rgb(255, 255, 204); + color: black; + border: black solid 1px; + margin: 2px; +} + + +/* + -------------------------------------------------------------------------- + Push Button + -------------------------------------------------------------------------- +*/ + +QPushButton:hover { + background-color: rgba(ACCENT_COLOR_R, ACCENT_COLOR_G, ACCENT_COLOR_B, 200); +} + +QPushButton#updateButton { + color: ACCENT_COLOR; + height: 24px; + margin: 5px; + padding: 5px; + border-radius: 1px; + background-color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 220); +} + +QPushButton#acceptButton { + font: bold 12px; + color: ACCENT_FOREGROUND_COLOR; + background-color: rgba(ACCENT_COLOR_R, ACCENT_COLOR_G, ACCENT_COLOR_B, 230); +} + +QPushButton#acceptButton:hover { + background-color: rgba(ACCENT_COLOR_R, ACCENT_COLOR_G, ACCENT_COLOR_B, 250); +} + +/* + -------------------------------------------------------------------------- + Slider + -------------------------------------------------------------------------- +*/ + +QSlider::groove:horizontal { + height: 3px; /* the groove expands to the size of the slider by default. by giving it a height, it has a fixed size */ + background: rgba(0, 0, 0, 0); +} + +QSlider::handle:horizontal { + background: ACCENT_COLOR; + width: 8px; + height: 2px; + margin: -4px 0; /* handle is placed by default on the contents rect of the groove. Expand outside the groove */ + border-radius: 2px; + } + +QSlider::add-page:horizontal { + border: 0px solid #999999; + background-color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 50); +} + +QSlider::sub-page:horizontal { + background-color: ACCENT_COLOR; + border-top: 1px solid ACCENT_COLOR; + border-bottom: 1px solid ACCENT_COLOR; +} + +/* + -------------------------------------------------------------------------- + Scroll Bar + -------------------------------------------------------------------------- +*/ + +QScrollBar:vertical { + width: 8px; +} + +QScrollBar:horizontal { + height: 8px; +} + +QScrollBar:vertical, +QScrollBar:horizontal { + margin: 0px; + border: 0px solid grey; + background: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 0); +} + +QScrollBar::handle:vertical, +QScrollBar::handle:horizontal{ + min-height: 0px; + border-radius: 1px; + background: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 25); +} + +QScrollBar::handle:vertical:hover, +QScrollBar::handle:horizontal:hover { + background: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 75); +} + +QScrollBar::add-line:vertical, +QScrollBar::add-line:horizontal { + height: 0px; + border: 0px solid grey; + subcontrol-origin: margin; + subcontrol-position: bottom; + /*background: rgb(80, 80, 80);*/ +} + +QScrollBar::sub-line:vertical, +QScrollBar::sub-line:horizontal { + height: 0px; + border: 0px solid grey; + subcontrol-position: top; + subcontrol-origin: margin; + /*background: rgb(80, 80, 80);*/ +} + +QScrollBar::up-arrow:vertical, QScrollBar::down-arrow:vertical { + width: 0px; + height: 0px; + border: 0px; + background: white; +} + +QScrollBar::add-page:horizontal, QScrollBar::add-page:vertical, +QScrollBar::sub-page:horizontal, QScrollBar::sub-page:vertical { + background: none; +} + +/* + -------------------------------------------------------------------------- + Header View + -------------------------------------------------------------------------- +*/ + +/* style the sort indicator */ + QHeaderView::up-arrow { + image: url("RESOURCE_DIRNAME/icons/up_arrow.png"); + } + +QHeaderView::down-arrow { + image: url("RESOURCE_DIRNAME/icons/down_arrow.png"); + } + +QAbstractItemView::separator{ + height: 0px; + padding: 0px 0px 0px 0px; + background-color: transparent; +} + +QListView::item, QTreeView::item { + border: 0px; + outline: none; + border-style: solid; + margin: 0px 0px 0px 0px; + padding: 0px 0px 0px 0px; + background-color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 10); +} + +QHeaderView::section { + font: 12px; + height: 18px; + border: 0px; + border-right: 1px solid rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 20); + border-bottom: 1px solid rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 20); + padding: 5px; + background-color: rgba(0, 0, 0, 20); +} + +/* + -------------------------------------------------------------------------- + List/Tree View + -------------------------------------------------------------------------- +*/ + +QTreeView { + color: FOREGROUND_COLOR; +} + +QTreeView, QListView, QPushButton { + border: 0px; + outline: none; +} + +QTreeView::item, QTreeView::branch { + height: 22px; + show-decoration-selected: 1; /* make the selection span the entire width of the view */ + background-color: BACKGROUND_COLOR; +} + +QTreeView::item:focus{ + border: 0px; + outline: none; +} + +QTreeView::branch:has-children:!has-siblings:closed, +QTreeView::branch:closed:has-children:has-siblings { + border-image: none; + image: url("RESOURCE_DIRNAME/icons/branch_closed_DARKNESS.png"); +} + +QTreeView::branch:open:has-children:!has-siblings, +QTreeView::branch:open:has-children:has-siblings { + border-image: none; + image: url("RESOURCE_DIRNAME/icons/branch_open_DARKNESS.png"); +} + +QMenu::separator, QListView::item:hover, +QTreeView::branch:hover, QTreeView::item:hover { + background-color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 20); +} + +QTreeView::branch:selected, +QFrame#headerFrame > QWidget, QFrame#headerFrame, QMenu::item:selected { + color: ACCENT_FOREGROUND_COLOR; + background-color: ACCENT_COLOR; +} + +QTreeView::item:selected, QTreeView::item:selected:active, +QListView::item:selected, QListView::item:selected:active { + color: ACCENT_FOREGROUND_COLOR; + background-color: ACCENT_COLOR; +} + + + +QCheckBox::indicator, QRadioButton::indicator { + width: 16px; + height: 16px; +} + +QRadioButton::indicator:checked { + image: url("RESOURCE_DIRNAME/icons/radio_button_checked_DARKNESS.png"); +} + +QRadioButton::indicator:unchecked { + image: url("RESOURCE_DIRNAME/icons/radio_button_unchecked_DARKNESS.png"); +} + +QCheckBox::indicator:checked, QMenu::indicator:non-exclusive:checked { + image: url("RESOURCE_DIRNAME/icons/check_box_checked_DARKNESS.png"); +} + +QCheckBox::indicator:unchecked, QMenu::indicator:non-exclusive:unchecked { + image: url("RESOURCE_DIRNAME/icons/check_box_unchecked_DARKNESS.png"); +} + +QCheckBox::indicator:disabled, QMenu::indicator:non-exclusive:disabled { + image: url("RESOURCE_DIRNAME/icons/check_box_unchecked_DARKNESS.png"); +} + + +/* + -------------------------------------------------------------------------- + ComboBox + -------------------------------------------------------------------------- +*/ + +QComboBox { + width: 10px; + border: 0px; + padding-left: 2px; + border-radius: 0px; + background-color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 15); +} + +QComboBox::drop-down { + border: 0px; + padding-top: 2px; + background-color: rgba(255, 255, 255, 0); + image: url("RESOURCE_DIRNAME/icons/drop_arrow_DARKNESS.png"); +} + +/*QComboBox::down-arrow {*/ + /*width: 1px;*/ + /*image: url("RESOURCE_DIRNAME/icons/null.png");*/ + /*background-color: rgba(255, 255, 255, 0);*/ +/*}*/ + + +QSpinBox, +QLineEdit, +QComboBox, +QComboBox QAbstractItemView:item { + height: 24px; + padding: 0 4px; + border-radius: 0px; + background-color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 15); + border-bottom: 0px solid rgba(255, 255, 255, 50); + selection-color: rgba(255, 255, 255, 230); + selection-background-color: ACCENT_COLOR; +} + +QComboBox, +QLineEdit { + border: 0px; + border-bottom: 2px solid rgba(0,0,0,0); +} + +QComboBox:hover, +QLineEdit:hover { + border: 0px; + background-color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 35); +} + +QComboBox:focus, +QLineEdit:focus { + border: 0px; + border-bottom: 2px solid ACCENT_COLOR; + background-color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 30); +} + +QLineEdit#filterEdit QAbstractItemView { + border: 2px solid darkgray; + selection-background-color: lightgray; +} + +QComboBox QAbstractItemView { + selection-background-color: ACCENT_COLOR; + selection-color: ACCENT_FOREGROUND_COLOR; +} + +QComboBox QAbstractItemView::item { +} + + +QLabel { + selection-color: ACCENT_FOREGROUND_COLOR; + selection-background-color: ACCENT_COLOR; +} + +/* + -------------------------------------------------------------------------- + Tab bar + -------------------------------------------------------------------------- +*/ + +QTabBar { + qproperty-drawBase: 0; +} + +QTabBar::tab { + border: 0px; + padding-left: 10px; + padding-right: 10px; +} + +QTabBar::tab:first:selected { + background-color: rgba(0, 0, 0, 0); + border-left: 0px solid rgba(0, 0, 0, 0); +} + + +/* + -------------------------------------------------------------------------- + Menu Item + -------------------------------------------------------------------------- +*/ + + +QMenu { + border: 1px solid rgba(250, 250, 250, 25); +} + +QMenu, QMenu QWidget { + font: 12px; + color: FOREGROUND_COLOR; + background-color: BACKGROUND_COLOR; +} + +QMenu::separator { + height: 1px; + padding: 0px 1px 0px 1px; +} + +QMenu::icon { + padding: 4px; +} + +QMenu::indicator:non-exclusive { + width: 14px; + height: 14px; + margin-left: 3px; +} + +QMenu::item { + min-width: 124px; + color: FOREGROUND_COLOR; + padding: 3px; + border: 1px solid rgba(0, 0, 0, 0); +} + + +QMenu::item:disabled { + color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 50); +} + +QMenu::item:selected { + color: ACCENT_FOREGROUND_COLOR; + background-color: ACCENT_COLOR; +} + +QMenu::item:selected:disabled { + color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 50); + background-color: rgba(ACCENT_COLOR_R, ACCENT_COLOR_G, ACCENT_COLOR_B, 50); +} + +/* + -------------------------------------------------------------------------- + SearchWidget + -------------------------------------------------------------------------- +*/ +/* +SearchWidget { + margin: 2px; + padding: 0px; + min-height: 22; + max-height: 22; + border-radius: 2px; +} +*/ +SearchWidget, SearchWidget QLabel { + font: 18px; + padding: 0px; + padding-top:2px; + color: ACCENT_FOREGROUND_COLOR; + background-color: rgba(255, 255, 255, 0); + selection-background-color: rgba(ACCENT_FOREGROUND_COLOR_R, ACCENT_FOREGROUND_COLOR_G, ACCENT_FOREGROUND_COLOR_B, 210); + selection-color: ACCENT_COLOR; +} + +SearchWidget[hasText=true] { + background-color: rgba(255, 255, 255, 30); + border-bottom: 2px solid rgba(255, 255, 255, 80); +} + +SearchWidget:focus { + border: 0px; + border-bottom: 2px solid rgba(255, 255, 255, 180); + background-color: rgba(255, 255, 255, 30); + selection-background-color: rgba(255, 255, 255, 240); + selection-color: ACCENT_COLOR; +} + +SearchWidget QLabel { + border: 0px; + color: FOREGROUND_COLOR; +} + +SearchWidget QPushButton, SearchWidget QPushButton:hover { + border: 0px; + padding: 0px; + color: ACCENT_FOREGROUND_COLOR; + background-color: rgba(255, 255, 255, 0); +} + +SearchWidget QPushButton { + qproperty-iconSize: 24px; +} +/* + -------------------------------------------------------------------------- + QSplitter + -------------------------------------------------------------------------- +*/ + +QSplitter { + max-width: 2px; + background-color: BACKGROUND_COLOR; +} + +QSplitter:handle { + background-color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 10); +} + +QSplitter::handle:hover { + background-color: ACCENT_COLOR; +} + + +/* + -------------------------------------------------------------------------- + Slider Widget Action + -------------------------------------------------------------------------- +*/ + +SliderWidgetAction { + padding-top: 4px; + padding-left: 18px; + padding-right: 4px; +} + +SliderWidgetAction QLabel { + min-width: 50px; +} + + +/* + -------------------------------------------------------------------------- + Separator Widget Action + -------------------------------------------------------------------------- +*/ + +SeparatorWidgetAction { + margin: 2px; + padding-left: 4px; + margin-right: 0px; +} + +SeparatorWidgetAction Line { + min-height: 1px; + max-height: 1px; + background-color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 30); +} + +SeparatorWidgetAction QLabel { + min-height:22px; + max-height:22px; + padding-right: 2px; + color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 80); +} + + +/* + -------------------------------------------------------------------------- + Other + -------------------------------------------------------------------------- +*/ + + +NavigationFrame { + margin: 2px; +} + +#actionWidget { + margin: 0px; + padding: 0px; +} + +#actionLabel { + padding-left: 5px; + background-color: transparent; +} + +#actionOption { + color: FOREGROUND_COLOR; + margin: 1px; + background-color: rgba(255, 255, 255, 5); +} + +ToastWidget { + max-height: 48px; + font: bold 25px; + border-radius: 5px; + color: rgb(250, 250, 250); + background-color: rgba(0, 0, 0, 200); +} + +/* + -------------------------------------------------------------------------- + TESTING NEW STYLE + -------------------------------------------------------------------------- +*/ +/*!**/ + /*--------------------------------------------------------------------------*/ + /*Folders Widget*/ + /*--------------------------------------------------------------------------*/ +/**!*/ + +/*FoldersWidget,*/ +/*FoldersWidget:item,*/ +/*FoldersWidget:branch {*/ + /*color: rgba(255, 255, 255, 150);*/ + /*background-color: rgb(60, 60, 60);*/ +/*}*/ + + + + + + + +/*!**/ + /*--------------------------------------------------------------------------*/ + /*Preview Frame*/ + /*--------------------------------------------------------------------------*/ +/**!*/ + +/*PreviewFrame {*/ + /*margin: 2px;*/ +/*}*/ + +/*PreviewFrame, PreviewFrame QWidget {*/ + /*color: rgba(255, 255, 255, 150);*/ + /*background-color: rgb(60, 60, 60);*/ +/*}*/ + +PreviewFrame QWidget { + color: FOREGROUND_COLOR; +} + +#previewButtons QPushButton { + color: ACCENT_FOREGROUND_COLOR; + background-color: ACCENT_COLOR; +} + +PreviewFrame QPushButton { + color: FOREGROUND_COLOR; +} + +PreviewFrame QPushButton:hover { + color: ACCENT_FOREGROUND_COLOR; +} + +/* +-------------------------------------------------------------------------- +Status Widget +-------------------------------------------------------------------------- +*/ + +StatusWidget { + color: FOREGROUND_COLOR; + background-color: BACKGROUND_COLOR; + border-top: 1px solid rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 10); +} + + +StatusWidget QLabel { + background-color: transparent; +} + +StatusWidget[status="error"], +StatusWidget[status="error"] QLabel { + color: rgb(240, 240, 240); + background-color: rgb(220, 40, 40); + selection-color: rgb(220, 40, 40); + selection-background-color: rgb(240, 240, 240); +} + +StatusWidget[status="warning"] { + color: rgb(240, 240, 240); + background-color: rgb(240, 170, 0); +} + + +/* +-------------------------------------------------------------------------- +UPDATE AVAILABLE WIDGET +-------------------------------------------------------------------------- +*/ + +#updateAvailableButton { + padding: 2px; + margin: 2px; + font-size: 11px; + color: BACKGROUND_COLOR; + background-color: rgba(FOREGROUND_COLOR_R,FOREGROUND_COLOR_G,FOREGROUND_COLOR_B,150); + border-radius: 2px; +} + +#updateAvailableButton { + padding-left: 5px; + padding-right: 5px; +} + +#updateAvailableButton:hover { + background-color: rgba(FOREGROUND_COLOR_R,FOREGROUND_COLOR_G,FOREGROUND_COLOR_B,200); +} + + +/* +-------------------------------------------------------------------------- +PROGRESS WIDGET +-------------------------------------------------------------------------- +*/ + +ProgressBar, +ProgressBar QLabel { + background-color: transparent; +} + +ProgressBar QLabel { + margin: 0px; + padding: 1px; + min-width: 100px; +} + +ProgressBar QProgressBar{ + margin-top: 4px; + margin-right: 6px; + max-width: 200px; + min-width: 150px; + max-height: 4px; + padding: 0px; + color: rgba(0,0,0,200); + border-radius: 2px; + background-color: rgba(250,250,250,50); +} + +ProgressBar QProgressBar::chunk { + color: white; + background-color: white; + margin: 0px; + max-height: 4px; + border-radius: 2px; +} + + + /*--------------------------------------------------------------------------*/ + /* CUSTOM MESSAGE BOX */ + /*--------------------------------------------------------------------------*/ + +MessageBox { + min-width: 320px; + min-height: 220px; +} + +#messageBoxHeaderLabel { + font: 16px; + color: rgb(255,255,255); +} + +#messageBoxHeaderFrame { + height: 46px; + border-top-left-radius: 5px; + border-top-right-radius: 5px; + background-color: rgba(0,0,0,0); +} + +#messageBox { + border-radius: 7px; + background-color: rgba(255,255,255,255); +} + +#messageBox QWidget { + background-color: rgba(255,255,255,0); +} + +#messageBox #messageBoxTitle QLabel { + font: 16px; +} + +#messageBox #messageBoxIcon { + width: 32px; + height: 32px; +} + +#messageBox #messageBoxBody QLabel { + font: 12px; +} + +#messageBox #messageBoxInputEdit { + min-height: 32px; + background-color: rgba(240, 240, 240, 180); +} + +#messageBoxBody QWidget { + color: rgb(100,100,110); +} + +#messageBox QPushButton { + font: 12px; + color: rgba(250, 250, 250, 250); + min-width: 72px; + min-height: 32px; + padding-left: 9px; + padding-right: 9px; + border-radius: 16px; + background-color: rgba(180, 180, 180, 230); +} + +#messageBox QPushButton:focus, #messageBox QPushButton:hover { + color: ACCENT_FOREGROUND_COLOR; + background-color: ACCENT_COLOR; +} + +#messageBox QRadioButton::indicator:checked { + image: url("RESOURCE_DIRNAME/icons/radio_button_checked_black.png"); +} + +#messageBox QRadioButton::indicator:unchecked { + image: url("RESOURCE_DIRNAME/icons/radio_button_unchecked_black.png"); +} + +#messageBox QCheckBox::indicator:checked { + image: url("RESOURCE_DIRNAME/icons/check_box_checked_black.png"); +} + +#messageBox QCheckBox::indicator:unchecked { + image: url("RESOURCE_DIRNAME/icons/check_box_unchecked_black.png"); +} + +#messageBox QCheckBox::indicator:disabled { + image: url("RESOURCE_DIRNAME/icons/check_box_unchecked_black.png"); +} + +#messageBoxFrame { + background-color: rgba(0,0,0,100); +} + +#settingsDialog { + min-width: 300px; + min-height: 300px; + max-width: 400px; + max-height: 400px; +} + +#filterByAction QWidget { + background-color: transparent; +} + +#filterByAction:hover { + background-color: ACCENT_COLOR; + color: ACCENT_FOREGROUND_COLOR; +} + +#filterByAction { + height: 22px; + padding: 3px; + background-color: transparent; +} + +#filterByAction #actionCounter { + padding: 2px; + border-radius: 5px; + background-color: rgba(255,255,255,20); +} + +#filterByAction QCheckBox { + width: 64px; +} + +#filterByAction QCheckBox::indicator { + width: 14px; + height: 14px; + padding-left: 2px; +} + + +/* +---------------------------------------- +Settings Dialog Color Picker +---------------------------------------- +*/ + +#settingsDialog ColorPickerWidget { + margin: 0px; + max-height: 24px; + min-height: 24px; + border-radius: 4px; +} + +#settingsDialog ColorPickerWidget #colorButton[first=true] { + border-top-left-radius: 2px; + border-bottom-left-radius: 2px; +} + +#settingsDialog ColorPickerWidget #colorButton[last=true] { + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; +} + +#settingsDialog ColorPickerWidget #colorButton:checked { + border-bottom: 3px solid rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 180); +} + +/* +---------------------------------------- +Preview Widget Color Picker +---------------------------------------- +*/ + +PreviewWidget ColorPickerWidget { + margin: 0px; + max-height: 14px; + min-height: 14px; +} + +PreviewWidget ColorPickerWidget #colorButton { + max-width: 14px; + min-width: 14px; + border-radius: 7px; +} + +PreviewWidget ColorPickerWidget #colorButton:checked { + border: 2px solid rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 255); +} + + +/* +---------------------------------------- +Icon Picker Action +---------------------------------------- +*/ + +IconPickerWidget { + max-height: 156px; + min-height: 156px; +} + + +#iconPickerAction { + max-height: 120px; + min-height: 120px; + margin-left: 10px; + margin-bottom: 10px; +} + +#iconPickerAction QToolButton { + qproperty-iconSize: 14px; +} + +IconPickerWidget QToolButton { + margin: 5px; + padding: 2px; + align: center; + min-width: 20px; + min-height: 20px; + max-width: 20px; + max-height: 20px; + border-radius: 2px; + qproperty-iconSize: 18px; +} + +IconPickerWidget QToolButton { + color: rgb(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B); +} + +IconPickerWidget QToolButton:checked { + background-color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 50); +} + +IconPickerWidget QToolButton:hover { + background-color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 75); +} + + +/* +---------------------------------------- +Color Picker Action +---------------------------------------- +*/ + +#colorPickerAction { + max-height: 28px; + min-height: 28px; + margin-left: 10px; +} + +#colorPickerAction #colorButton { + max-width: 12px; + min-width: 12px; + max-height: 12px; + min-height: 12px; + border-radius: 6px; +} + +#colorPickerAction #colorButton:checked { + border: 2px solid rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 255); +} + +Lightbox { + background-color: rgba(0, 0, 0, 100); +} + +#menuButton, +#editButton { + margin-left: 4px; + min-width: 25px; + max-width: 25px; + border-radius: 2px; + text-align: center; + background-color: rgba(0,0,0,20); +} + +#menuButton:hover, +#editButton:hover { + background-color: rgba(100,100,100,20); +} + +#editButton { + min-height: 22px; +} + +/* +#errorLabel { + font-style: italic; +} +*/ + +/* +--------------------------- +Field Widgets +--------------------------- +*/ + +SeparatorFieldWidget > #widget { + min-height: 1px; + max-height: 1px; + font: bold; + margin: 4px; + background-color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 20); +} + +TextFieldWidget QTextEdit { + max-height: 92px; +} + +FormWidget QWidget { + text-align: left; +} + +#fieldWidget[layout="vertical"] { + min-height: 44px; +} + +FieldWidget[layout="vertical"] { + margin-bottom: 3px; +} + +FieldWidget[layout="vertical"] #label { + margin-bottom: 2px; +} + +FieldWidget[layout="horizontal"] { + margin-top: 3px; +} + +FieldWidget[layout="horizontal"] #label { + margin: 0px; + margin-right: 4px; +} + +LabelFieldWidget[layout="horizontal"] { + min-height: 16px; + max-height: 16px; + margin-top: 2px; + margin-bottom: 0px; +} + +FieldWidget #label { + min-width: 72px; + color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 100); +} + +FieldWidget #label:disabled { + color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 25); +} + +FormWidget #titleWidget { + padding: 2px; + margin:0px; + padding-left: 5px; + background-color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 20); + border-bottom: 0px solid rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 20); +} + +FormWidget #titleWidget:checked { + background-color: rgba(255, 255, 255, 5); +} + +FormWidget #optionsFrame { + margin: 0px; +} + +FieldWidget QComboBox { + border: 1px solid transparent; +} + +/* +--------------------------- +Group Box Widget +--------------------------- +*/ + +GroupFieldWidget[layout="horizontal"] { + margin-top: 2px; + margin-bottom: 0px; +} + +GroupBoxWidget { + margin-top: 3px; +} + +GroupBoxWidget #title { + padding: 2px; + padding-left: 5px; + text-align: left; + border-radius: 2px; + min-height: 18px; + max-height: 18px; + icon-size: 18px; + color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 150); + background-color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 10); +} + +GroupBoxWidget #title:checked { + background-color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 15); +} + +GroupBoxWidget #title:hover { + background-color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 20); +} + +/* +--------------------------- +Save Widget & Load Widget +--------------------------- +*/ + +BaseSaveWidget #fieldWidget { + margin-top: 4px; +} + +PreviewWidget ImageSequenceWidget { + background-color: rgba(0,0,0,0); +} + +PreviewWidget #titleLabel, +BaseSaveWidget #titleLabel, +BaseLoadWidget #titleLabel { + font-size: 14px; +} + +BaseLoadWidget #blendEdit { + min-width: 32px; + max-width: 32px; +} + +BaseSaveWidget #acceptButton, +BaseLoadWidget #acceptButton { + min-width: 80px; + max-height: 35px; + max-width: 125px; + min-height: 35px; + border-top-left-radius: 2px; + border-bottom-left-radius: 2px; +} + +BaseSaveWidget #selectionSetButton, +BaseLoadWidget #selectionSetButton { + min-width: 35px; + max-width: 35px; + min-height: 35px; + max-height: 35px; + margin-left: 1px; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; +} + +BaseSaveWidget ImageSequenceWidget { + border-radius: 2px; + color: rgb(40, 40, 40); + border: 1px solid rgba(254, 255, 230, 200); + background-color: rgba(254, 255, 230, 200); +} + +BaseSaveWidget ImageSequenceWidget { + border: 0px solid rgba(254, 255, 230, 200); +} + +/* +--------------------------- +Form Widget +--------------------------- +*/ + +FormWidget #fieldWidget { + margin-top: 4px; +} + +FormWidget #titleLabel, +FormWidget #titleLabel, +FormWidget #titleLabel { + font-size: 14px; +} + +FormWidget QLineEdit, +FormWidget QTextEdit, +FormWidget QComboBox, +FormWidget #thumbnailButton, +FormWidget QLineEdit, +FormWidget QTextEdit, +FormWidget QComboBox, +FormWidget #thumbnailButton, +FormWidget QLineEdit, +FormWidget QTextEdit, +FormWidget QComboBox, +FormWidget #thumbnailButton { + border-radius: 2px; +} + +FormWidget QLineEdit, +FormWidget QLineEdit:focus, +FormWidget QLineEdit:hover, +FormWidget QTextEdit, +FormWidget QTextEdit:focus, +FormWidget QTextEdit:hover, +FormWidget QPlainTextEdit, +FormWidget QPlainTextEdit:focus, +FormWidget QPlainTextEdit:hover { + color: rgb(40, 40, 40); + border: 1px solid rgba(254, 255, 230, 200); + background-color: rgba(254, 255, 230, 200); +} + +FormDialog { + padding: 5px; + border-radius:3px; +} + +FormDialog #title { + padding: 4px; + font-size: 18px; +} + +FormDialog FieldWidget QLabel { + background-color: rgba(200,200,100, 0); +} + +FormDialog FieldWidget { + padding-bottom: 10px; +} + +FormDialog #description { + padding: 4px; + padding-bottom: 9px; + margin-bottom: 10px; + border-bottom: 1px solid rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 15); +} + +FormDialog #acceptButton, +FormDialog #rejectButton { + margin: 2px; + font-size: 14px; + padding: 4px; + min-width: 72px; + min-height: 24px; + border-radius: 2px; +} + +FormDialog #acceptButton, +FormDialog #rejectButton { + background-color: rgba(0,0,0,0); +} + +FormDialog #acceptButton:disabled, +FormDialog #rejectButton:disabled { + color: rgba(250, 250, 250, 50); +} + +#acceptButton, +#rejectButton { + background-color: rgba(0,0,0,0); +} + +#acceptButton:disabled, +#rejectButton:disabled { + color: rgba(250,250,250,50); +} + +#acceptButton { + color: FOREGROUND_COLOR; +} + +#acceptButton:hover { + color: ACCENT_FOREGROUND_COLOR; + background-color: rgba(ACCENT_COLOR_R, ACCENT_COLOR_G, ACCENT_COLOR_B, 220); +} + +FormDialog #acceptButton:pressed { + background-color: rgba(ACCENT_COLOR_R, ACCENT_COLOR_G, ACCENT_COLOR_B, 220); +} + +FormDialog #rejectButton:hover { + background-color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 50); +} + +#acceptButton:pressed { + background-color: rgba(ACCENT_COLOR_R, ACCENT_COLOR_G, ACCENT_COLOR_B, 220); +} + +#rejectButton:hover { + background-color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B,50); +} + +FormDialog FieldWidget QLineEdit, +FormDialog FieldWidget QTextEdit { + border-radius: 3px; +} + +FieldWidget[error=true] QLineEdit:focus, +FieldWidget[error=true] QTextEdit:focus { + border-color: rgb(250, 80, 80); +} + +FieldWidget[error=true] QLineEdit, +FieldWidget[error=true] QTextEdit { + color: rgba(255,255,255,200); + border-color: rgb(230, 80, 80); + background-color: rgba(230, 80, 80, 50); +} + + +ButtonGroupFieldWidget QPushButton { + height: 24px; + margin: 1px; + text-align: center; + color: FOREGROUND_COLOR; + background-color: rgba(0, 0, 0, 30); +} + +ButtonGroupFieldWidget QPushButton[first=true] { + border-top-left-radius: 2px; + border-bottom-left-radius: 2px; +} + +ButtonGroupFieldWidget QPushButton[last=true] { + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; +} + +ButtonGroupFieldWidget QPushButton:checked { + color: ACCENT_FOREGROUND_COLOR; + background-color: rgba(ACCENT_COLOR_R, ACCENT_COLOR_G, ACCENT_COLOR_B, 220); +} + + +/* +FieldWidget[default=false] QLineEdit, +FieldWidget[default=false] QTextEdit { + border: 1px solid rgba(240, 150, 0, 255); + background-color: rgba(240, 150, 0, 100); +} + +FieldWidget[default=true] QComboBox { + border-radius: 2px; + border: 1px solid rgba(150, 150, 150, 100); +} + +FieldWidget[default=false] QComboBox { + border-radius: 2px; + border: 1px solid rgba(240, 150, 0, 255); + background-color: rgba(240, 150, 0, 100); +} + +FieldWidget[default=false] QRadioButton:checked { + color: rgb(240, 150, 0); +} + +FieldWidget[default=false] #label { + color: rgb(240, 150, 0); +} + + +FieldWidget[error=true] QRadioButton:checked { + color: rgb(240, 0, 0); +} + +FieldWidget[error=true] #label { + color: rgb(240, 0, 0); +} +*/ + +BaseLoadWidget ImageSequenceWidget { + background-color: rgba(0,0,0,0); +} + +/* +DIALOG +*/ + +QDialog QPushButton { + text-align: center; + min-height: 32px; + min-width: 80px; + border-radius: 2px; +} + +QDialog QPushButton:focus { + color: ACCENT_FOREGROUND_COLOR; + background-color: ACCENT_COLOR; +} + +QDialog QPushButton { + color: FOREGROUND_COLOR; + background-color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 30); +} + +QDialog QPushButton:hover { + background-color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 50); +} + +/* +-------------------------------------------------------------------------- +TITLE WIDGET +-------------------------------------------------------------------------- +*/ +#titleWidget #titleButton { + font: bold; + margin: 0px; + padding: 0px; + padding-left: 4px; + text-align: left; + font-size: 14px; + min-height: 28px; + color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 210); + background-color: transparent; +} + + +#titleWidget #titleButton:hover { + background-color: rgba(250,250,250,0); +} + +#titleWidget #menuButton { + margin-left: 4px; + margin-right: 4px; + font-size: 14px; + max-height: 22px; + max-width: 22px; + background-color: transparent; +} + +#titleWidget #menuButton:hover { + background-color: rgba(250,250,250,25); +} + + + +#titleWidget +{ + margin: 0px; + min-height: 26px; + background-color: rgba(0,0,0,15); + border-bottom: 1px solid rgba(250, 250, 250, 20); +} + +#titleWidget LineEdit { + margin-left: 4px; + margin-right: 4px; + margin-bottom: 4px; + min-height: 22px; + font-size: 12px; +} + +#titleWidget LineEdit #icon { + margin-top: -3px; + margin-left: 4px; +} + +#titleWidget LineEdit #clear { + margin-top: -3px; + margin-right: 2px; +} + +SidebarWidget #titleWidget LineEdit { + border: 0px solid rbga(0,0,0,0); + border-radius: 3px; +} \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/LICENSE.txt b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/LICENSE.txt new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/OpenSans-Bold.ttf b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/OpenSans-Bold.ttf new file mode 100644 index 0000000..7b52945 Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/OpenSans-Bold.ttf differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/OpenSans-BoldItalic.ttf b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/OpenSans-BoldItalic.ttf new file mode 100644 index 0000000..a670e14 Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/OpenSans-BoldItalic.ttf differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/OpenSans-ExtraBold.ttf b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/OpenSans-ExtraBold.ttf new file mode 100644 index 0000000..3660681 Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/OpenSans-ExtraBold.ttf differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/OpenSans-ExtraBoldItalic.ttf b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/OpenSans-ExtraBoldItalic.ttf new file mode 100644 index 0000000..8c4c15d Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/OpenSans-ExtraBoldItalic.ttf differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/OpenSans-Italic.ttf b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/OpenSans-Italic.ttf new file mode 100644 index 0000000..e6c5414 Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/OpenSans-Italic.ttf differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/OpenSans-Light.ttf b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/OpenSans-Light.ttf new file mode 100644 index 0000000..563872c Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/OpenSans-Light.ttf differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/OpenSans-LightItalic.ttf b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/OpenSans-LightItalic.ttf new file mode 100644 index 0000000..5ebe2a2 Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/OpenSans-LightItalic.ttf differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/OpenSans-Regular.ttf b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/OpenSans-Regular.ttf new file mode 100644 index 0000000..2e31d02 Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/OpenSans-Regular.ttf differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/OpenSans-SemiBold.ttf b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/OpenSans-SemiBold.ttf new file mode 100644 index 0000000..99db86a Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/OpenSans-SemiBold.ttf differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/OpenSans-SemiBoldItalic.ttf b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/OpenSans-SemiBoldItalic.ttf new file mode 100644 index 0000000..8cad4e3 Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/fonts/OpenSans-SemiBoldItalic.ttf differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/add.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/add.png new file mode 100644 index 0000000..9ad0c7d Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/add.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/add_28.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/add_28.png new file mode 100644 index 0000000..9b240ad Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/add_28.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/archive.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/archive.svg new file mode 100644 index 0000000..394dad2 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/archive.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/arrows-rotate.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/arrows-rotate.svg new file mode 100644 index 0000000..e0cb3f2 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/arrows-rotate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/asset.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/asset.svg new file mode 100644 index 0000000..a627fd5 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/asset.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/assets.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/assets.svg new file mode 100644 index 0000000..208f688 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/assets.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/bars.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/bars.svg new file mode 100644 index 0000000..b8b779b --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/bars.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/blank.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/blank.png new file mode 100644 index 0000000..d6fa80c Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/blank.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/book.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/book.svg new file mode 100644 index 0000000..22e9c39 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/book.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/branch_closed_black.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/branch_closed_black.png new file mode 100644 index 0000000..db2623f Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/branch_closed_black.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/branch_closed_white.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/branch_closed_white.png new file mode 100644 index 0000000..b8e3040 Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/branch_closed_white.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/branch_open_black.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/branch_open_black.png new file mode 100644 index 0000000..4f273f4 Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/branch_open_black.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/branch_open_white.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/branch_open_white.png new file mode 100644 index 0000000..efb5ce3 Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/branch_open_white.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/camera-alt.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/camera-alt.svg new file mode 100644 index 0000000..d4772d3 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/camera-alt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/camera.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/camera.svg new file mode 100644 index 0000000..dc9f608 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/camera.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/cancel.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/cancel.png new file mode 100644 index 0000000..36116ed Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/cancel.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/caret-down.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/caret-down.svg new file mode 100644 index 0000000..b3ee2ea --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/caret-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/caret-right.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/caret-right.svg new file mode 100644 index 0000000..bcd4cd1 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/caret-right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/character.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/character.svg new file mode 100644 index 0000000..631f168 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/character.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/check_box_checked_black.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/check_box_checked_black.png new file mode 100644 index 0000000..f1b52d9 Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/check_box_checked_black.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/check_box_checked_white.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/check_box_checked_white.png new file mode 100644 index 0000000..734353c Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/check_box_checked_white.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/check_box_unchecked_black.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/check_box_unchecked_black.png new file mode 100644 index 0000000..d8a0cf2 Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/check_box_unchecked_black.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/check_box_unchecked_white.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/check_box_unchecked_white.png new file mode 100644 index 0000000..d9ba062 Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/check_box_unchecked_white.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/circle.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/circle.png new file mode 100644 index 0000000..b896637 Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/circle.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/circle.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/circle.svg new file mode 100644 index 0000000..c2db0b2 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/cloud.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/cloud.svg new file mode 100644 index 0000000..38d2dc5 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/cloud.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/cog.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/cog.png new file mode 100644 index 0000000..476d5c9 Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/cog.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/columns-3.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/columns-3.svg new file mode 100644 index 0000000..8357340 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/columns-3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/critical.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/critical.png new file mode 100644 index 0000000..6dafd36 Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/critical.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/cross.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/cross.png new file mode 100644 index 0000000..8431b7b Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/cross.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/database.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/database.svg new file mode 100644 index 0000000..a6e4982 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/database.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/delete.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/delete.png new file mode 100644 index 0000000..c75e834 Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/delete.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/drop_arrow_black.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/drop_arrow_black.png new file mode 100644 index 0000000..f3423c0 Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/drop_arrow_black.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/drop_arrow_white.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/drop_arrow_white.png new file mode 100644 index 0000000..527c786 Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/drop_arrow_white.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/environment.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/environment.svg new file mode 100644 index 0000000..2b7eda4 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/environment.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/error.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/error.png new file mode 100644 index 0000000..2606a0a Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/error.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/expand.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/expand.svg new file mode 100644 index 0000000..e8f812d --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/expand.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/eye-slash.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/eye-slash.svg new file mode 100644 index 0000000..5ccdbf7 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/eye-slash.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/eye.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/eye.svg new file mode 100644 index 0000000..e5e88aa --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/eye.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/face.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/face.svg new file mode 100644 index 0000000..dc8784a --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/face.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/favorite.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/favorite.svg new file mode 100644 index 0000000..d9fa587 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/favorite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/file-alt.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/file-alt.svg new file mode 100644 index 0000000..e1f980c --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/file-alt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/file.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/file.svg new file mode 100644 index 0000000..7f495dc --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/file.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/filter.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/filter.svg new file mode 100644 index 0000000..c745e65 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/filter.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/folder.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/folder.svg new file mode 100644 index 0000000..c960768 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/folder.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/folder_collapsed.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/folder_collapsed.png new file mode 100644 index 0000000..fb701e0 Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/folder_collapsed.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/folder_expanded.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/folder_expanded.png new file mode 100644 index 0000000..829a0de Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/folder_expanded.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/folder_item.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/folder_item.png new file mode 100644 index 0000000..67022c3 Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/folder_item.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/folder_open.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/folder_open.png new file mode 100644 index 0000000..0bb4b74 Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/folder_open.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/folder_open.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/folder_open.svg new file mode 100644 index 0000000..57dcfa6 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/folder_open.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/globe.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/globe.svg new file mode 100644 index 0000000..3e4462e --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/globe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/groupby.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/groupby.png new file mode 100644 index 0000000..76b5574 Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/groupby.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/hand.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/hand.svg new file mode 100644 index 0000000..8ed4eed --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/hand.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/header.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/header.png new file mode 100644 index 0000000..4efcb57 Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/header.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/icon.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/icon.png new file mode 100644 index 0000000..298cfdf Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/icon.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/image.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/image.png new file mode 100644 index 0000000..ebe206f Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/image.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/inbox.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/inbox.svg new file mode 100644 index 0000000..761d6c7 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/inbox.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/info.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/info.png new file mode 100644 index 0000000..abdc049 Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/info.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/layers.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/layers.svg new file mode 100644 index 0000000..08ca453 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/layers.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/lock.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/lock.svg new file mode 100644 index 0000000..7d0e70b --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/lock.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/logo.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/logo.png new file mode 100644 index 0000000..298cfdf Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/logo.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/logo_high.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/logo_high.png new file mode 100644 index 0000000..0e4f48c Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/logo_high.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/logo_white.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/logo_white.png new file mode 100644 index 0000000..df7b607 Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/logo_white.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/magnifying-glass.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/magnifying-glass.svg new file mode 100644 index 0000000..49f991b --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/magnifying-glass.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/plus-large.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/plus-large.svg new file mode 100644 index 0000000..e017935 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/plus-large.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/plus.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/plus.svg new file mode 100644 index 0000000..2a81ab8 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/plus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/preview_placeholder.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/preview_placeholder.png new file mode 100644 index 0000000..cf1db0c Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/preview_placeholder.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/question.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/question.png new file mode 100644 index 0000000..b6a03e5 Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/question.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/radio_button_checked_black.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/radio_button_checked_black.png new file mode 100644 index 0000000..c73830e Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/radio_button_checked_black.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/radio_button_checked_white.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/radio_button_checked_white.png new file mode 100644 index 0000000..b896637 Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/radio_button_checked_white.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/radio_button_unchecked_black.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/radio_button_unchecked_black.png new file mode 100644 index 0000000..c2a78ca Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/radio_button_unchecked_black.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/radio_button_unchecked_white.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/radio_button_unchecked_white.png new file mode 100644 index 0000000..ae56b1f Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/radio_button_unchecked_white.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/search.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/search.png new file mode 100644 index 0000000..083a9ee Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/search.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/search.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/search.svg new file mode 100644 index 0000000..acd3282 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/search.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/settings.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/settings.png new file mode 100644 index 0000000..5ec088e Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/settings.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/share.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/share.svg new file mode 100644 index 0000000..2f3151d --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/share.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/shot.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/shot.svg new file mode 100644 index 0000000..823951e --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/shot.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/sliders.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/sliders.svg new file mode 100644 index 0000000..bfca789 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/sliders.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/sortby.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/sortby.png new file mode 100644 index 0000000..64c574f Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/sortby.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/sync.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/sync.png new file mode 100644 index 0000000..93290a9 Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/sync.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/tag.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/tag.png new file mode 100644 index 0000000..81375f8 Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/tag.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/thumbnail.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/thumbnail.png new file mode 100644 index 0000000..c77cdf3 Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/thumbnail.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/thumbnail_solid.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/thumbnail_solid.png new file mode 100644 index 0000000..03dc926 Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/thumbnail_solid.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/times.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/times.svg new file mode 100644 index 0000000..c528bcd --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/times.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/trash.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/trash.svg new file mode 100644 index 0000000..6305280 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/trash.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/tree.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/tree.svg new file mode 100644 index 0000000..a3c7f93 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/tree.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/user.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/user.svg new file mode 100644 index 0000000..591873a --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/user.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/users.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/users.svg new file mode 100644 index 0000000..3f07aab --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/users.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/vehicle.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/vehicle.svg new file mode 100644 index 0000000..9b23899 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/vehicle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/video.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/video.svg new file mode 100644 index 0000000..e14b3b9 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/video.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/view_all.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/view_all.png new file mode 100644 index 0000000..d17e015 Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/view_all.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/view_compact.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/view_compact.png new file mode 100644 index 0000000..5bc5688 Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/view_compact.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/view_settings.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/view_settings.png new file mode 100644 index 0000000..4ef173e Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/view_settings.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/warning.png b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/warning.png new file mode 100644 index 0000000..cac8e85 Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/warning.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/xmark.svg b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/xmark.svg new file mode 100644 index 0000000..008abc4 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/resource/icons/xmark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/utils.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/utils.py new file mode 100644 index 0000000..f53e551 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/utils.py @@ -0,0 +1,1739 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +import re +import os +import sys +import json +import uuid +import errno +import ctypes +import shutil +import locale +import logging +import getpass +import random +import tempfile +import platform +import threading +import traceback +import collections +import distutils.version + +from datetime import datetime + +try: + from collections import Mapping +except ImportError: + from collections.abc import Mapping + +# Use the built-in version of scandir/walk if possible, +# otherwise use the scandir module version +try: + from scandir import walk +except ImportError: + from os import walk + +import studiolibrary + +from studiovendor import six +from studiovendor.six.moves import urllib + + +__all__ = [ + "reload", + "user", + "isMac", + "isMaya", + "isLinux", + "isWindows", + "addLibrary", + "setLibraries", + "removeLibrary", + "defaultLibrary", + "checkForUpdates", + "read", + "write", + "update", + "saveJson", + "readJson", + "updateJson", + "replaceJson", + "readSettings", + "saveSettings", + "updateSettings", + "settingsPath", + "relPath", + "absPath", + "tempPath", + "realPath", + "normPath", + "normPaths", + "copyPath", + "movePath", + "movePaths", + "listPaths", + "splitPath", + "localPath", + "removePath", + "renamePath", + "formatPath", + "pathsFromUrls", + "resolveModule", + "createTempPath", + "renamePathInFile", + "walkup", + "generateUniquePath", + "MovePathError", + "RenamePathError", + "timeAgo", + "modules", + "setDebugMode", + "showInFolder", + "stringToList", + "listToString", + "registerItem", + "registerItems", + "registeredItems", + "runTests", + "findItemsInFolders", + "isVersionPath", + "latestVersionPath", +] + + +logger = logging.getLogger(__name__) + + +_itemClasses = collections.OrderedDict() + + +class PathError(IOError): + """ + Exception that supports unicode escape characters. + """ + def __init__(self, msg): + """ + :type: str or unicode + """ + msg = six.text_type(msg) + super(PathError, self).__init__(msg) + self._msg = msg + + def __unicode__(self): + """ + Return the decoded message using 'unicode_escape' + + :rtype: unicode + """ + return six.text_type(self._msg) + + +class MovePathError(PathError): + """""" + + +class RenamePathError(PathError): + """""" + + +def reload(): + """ + Removes all Studio Library modules from the Python cache. + + You can use this function for developing within DCC applications, however, + it should not be used in production. + + Example: + import studiolibrary + studiolibrary.reload() + + import studiolibrary + studiolibrary.main() + """ + os.environ["STUDIO_LIBRARY_RELOADED"] = "1" + + from studiolibrary import librarywindow + librarywindow.LibraryWindow.destroyInstances() + + names = modules() + + for mod in list(sys.modules.keys()): + for name in names: + if mod in sys.modules and mod.startswith(name): + logger.info('Removing module: %s', mod) + del sys.modules[mod] + + +def defaultLibrary(): + """ + Get the name of the default library. + + :rtype: str + """ + libraries = readSettings() + + # Try to get the library that has been set to default + for name in libraries: + if libraries[name].get("default"): + return name + + # Try to get the library named Default + if "Default" in libraries: + return "Default" + + # Try to get a library + for name in libraries: + return name + + # Otherwise just return the name "Default" + return "Default" + + +def addLibrary(name, path, **settings): + """ + Add a new library with the given name, path and settings. + + :type name: str + :type path: path + :type settings: dict + """ + libraries = readSettings() + libraries.setdefault(name, {}) + libraries[name]["path"] = path + + update(libraries[name], settings) + + saveSettings(libraries) + + +def removeLibrary(name): + """ + Remove a library by name. + + :type name: str + """ + libraries = readSettings() + if name in libraries: + del libraries[name] + saveSettings(libraries) + + +def setLibraries(libraries): + """ + Remove existing libraries and set the new. + + Example: + import studiolibrary + + libraries = [ + {"name":"test1", "path":r"D:\LibraryData", "default":True}}, + {"name":"test2", "path":r"D:\LibraryData2"}, + {"name":"Temp", "path":r"C:\temp"}, + ] + + studiolibrary.setLibraries(libraries) + + :type libraries: list[dict] + """ + for library in libraries: + addLibrary(**library) + + old = readSettings().keys() + new = [library["name"] for library in libraries] + + remove = set(old) - set(new) + for name in remove: + removeLibrary(name) + + +def modules(): + """ + Get all the module names for the package. + + :rtype: list[str] + """ + names = [] + dirname = os.path.dirname(os.path.dirname(__file__)) + for filename in os.listdir(dirname): + names.append(filename) + return names + + +def setDebugMode(level): + """ + Set the logging level to debug. + + :type level: int + :rtype: None + """ + if level: + level = logging.DEBUG + else: + level = logging.INFO + + for name in modules(): + logger_ = logging.getLogger(name) + logger_.setLevel(level) + + +def resolveModule(name): + """Resolve a dotted name to a global object.""" + name = name.split('.') + used = name.pop(0) + found = __import__(used) + for n in name: + used = used + '.' + n + try: + found = getattr(found, n) + except AttributeError: + __import__(used) + found = getattr(found, n) + return found + + +def registerItems(): + """Register all the items from the config file.""" + for name in studiolibrary.config.get("itemRegistry"): + cls = resolveModule(name) + studiolibrary.registerItem(cls) + + +def registerItem(cls): + """ + Register the given item class to the given extension. + + :type cls: studiolibrary.LibraryItem + :rtype: None + """ + global _itemClasses + _itemClasses[cls.__name__] = cls + + +def registeredItems(): + """ + Return all registered library item classes. + + :rtype: list[studiolibrary.LibraryItem] + """ + return _itemClasses.values() + + +def clearRegisteredItems(): + """ + Remove all registered item classes. + + :rtype: None + """ + global _itemClasses + _itemClasses = collections.OrderedDict() + + +def tempPath(*args): + """ + Get the temp directory set in the config. + + :rtype: str + """ + temp = studiolibrary.config.get("tempPath") + return normPath(os.path.join(formatPath(temp), *args)) + + +def createTempPath(name, clean=True, makedirs=True): + """ + Create a temp directory with the given name. + + :type name: str + :type clean: bool + :type makedirs: bool + + :rtype: bool + """ + path = tempPath(name) + + if clean and os.path.exists(path): + if os.path.exists(path): + shutil.rmtree(path) + + if makedirs and not os.path.exists(path): + os.makedirs(path) + + return path + + +def pathsFromUrls(urls): + """ + Return the local file paths from the given QUrls + + :type urls: list[QtGui.QUrl] + :rtype: collections.Iterable[str] + """ + for url in urls: + path = url.toLocalFile() + + # Fixes a bug when dragging from windows explorer on windows 10 + if isWindows(): + if path.startswith("/"): + path = path[1:] + + yield path + + +def findItems(path, depth=3, **kwargs): + """ + Find and create items by walking the given path. + + :type path: str + :type depth: int + + :rtype: collections.Iterable[studiolibrary.LibraryItem] + """ + path = normPath(path) + + maxDepth = depth + startDepth = path.count(os.path.sep) + + for root, dirs, files in walk(path, followlinks=True): + + files.extend(dirs) + + for filename in files: + remove = False + + # Normalise the path for consistent matching + path = os.path.join(root, filename) + item = itemFromPath(path, **kwargs) + + if item: + # Yield the item that matches/supports the current path + yield item + + # Stop walking the dir if the item doesn't support nested items + if not item.ENABLE_NESTED_ITEMS: + remove = True + + if remove and filename in dirs: + dirs.remove(filename) + + if depth == 1: + break + + # Stop walking the directory if the maximum depth has been reached + currentDepth = root.count(os.path.sep) + if (currentDepth - startDepth) >= maxDepth: + del dirs[:] + + +def findItemsInFolders(folders, depth=3, **kwargs): + """ + Find and create new item instances by walking the given paths. + + :type folders: list[str] + :type depth: int + + :rtype: collections.Iterable[studiolibrary.LibraryItem] + """ + for folder in folders: + for item in findItems(folder, depth=depth, **kwargs): + yield item + + +def user(): + """ + Return the current user name in lowercase. + + :rtype: str + """ + return getpass.getuser().lower() + + +def system(): + """ + Return the current platform in lowercase. + + :rtype: str + """ + return platform.system().lower() + + +def isMaya(): + """ + Return True if the current python session is in Maya. + + :rtype: bool + """ + try: + import maya.cmds + maya.cmds.about(batch=True) + return True + except ImportError: + return False + + +def isMac(): + """ + Return True if the current OS is Mac. + + :rtype: bool + """ + return system().startswith("os") or \ + system().startswith("mac") or \ + system().startswith("darwin") + + +def isWindows(): + """ + Return True if the current OS is windows. + + :rtype: bool + """ + return system().startswith("win") + + +def isLinux(): + """ + Return True if the current OS is linux. + + :rtype: bool + """ + return system().startswith("lin") + + +def localPath(*args): + """ + Return the users preferred disc location. + + :rtype: str + """ + path = os.getenv('APPDATA') or os.getenv('HOME') + path = os.path.join(path, "StudioLibrary", *args) + + return path + + +def formatPath(formatString, path="", **kwargs): + """ + Resolve the given string with the given path and kwargs. + + Example: + print formatPath("{dirname}/meta.json", path="C:/hello/world.json") + # "C:/hello/meta.json" + + :type formatString: str + :type path: str + :type kwargs: dict + :rtype: str + """ + logger.debug("Format String: %s", formatString) + + dirname, name, extension = splitPath(path) + + encoding = locale.getpreferredencoding() + + # Environment variables return raw strings so we need to convert them to + # unicode using the preferred system encoding + + temp = tempfile.gettempdir() + if temp: + + temp = six.text_type(temp) + + username = user() + if username: + username = six.text_type(username) + + local = os.getenv('APPDATA') or os.getenv('HOME') + if local: + local = six.text_type(local) + + kwargs.update(os.environ) + + labels = { + "name": name, + "path": path, + "root": path, # legacy + "user": username, + "temp": temp, + "home": local, # legacy + "local": local, + "dirname": dirname, + "extension": extension, + } + + kwargs.update(labels) + + resolvedString = six.text_type(formatString).format(**kwargs) + + logger.debug("Resolved String: %s", resolvedString) + + return normPath(resolvedString) + + +def copyPath(src, dst, force=False): + """ + Make a copy of the given src path to the given destination path. + + :type src: str + :type dst: str + :type force: bool + :rtype: str + """ + dirname = os.path.dirname(src) + + if "/" not in dst: + dst = os.path.join(dirname, dst) + + src = normPath(src) + dst = normPath(dst) + + logger.info(u'Copying path "{0}" -> "{1}"'.format(src, dst)) + + if src == dst: + msg = u'The source path and destination path are the same: {0}' + raise IOError(msg.format(src)) + + if not force and os.path.exists(dst): + msg = u'Cannot copy over an existing path: "{0}"' + raise IOError(msg.format(dst)) + + if force and os.path.exists(dst): + if os.path.isdir(dst): + shutil.rmtree(dst) + else: + os.remove(dst) + + # Make sure the destination directory exists + dstDir = os.path.dirname(dst) + if not os.path.exists(dstDir): + os.makedirs(dstDir) + + if os.path.isfile(src): + shutil.copy(src, dst) + else: + shutil.copytree(src, dst) + + logger.info("Copied path!") + + return dst + + +def movePath(src, dst): + """ + Move the given source path to the given destination path. + + :type src: str + :type dst: str + :rtype: str + """ + src = six.text_type(src) + dirname, name, extension = splitPath(src) + + if not os.path.exists(src): + raise MovePathError(u'No such file or directory: {0}'.format(src)) + + if os.path.isdir(src): + dst = u'{0}/{1}{2}'.format(dst, name, extension) + dst = generateUniquePath(dst) + + shutil.move(src, dst) + return dst + + +def movePaths(srcPaths, dst): + """ + Move the given src paths to the given dst path. + + :type srcPaths: list[str] + :type dst: str + """ + if not os.path.exists(dst): + os.makedirs(dst) + + for src in srcPaths or []: + + if not src: + continue + + basename = os.path.basename(src) + + dst_ = os.path.join(dst, basename) + dst_ = normPath(dst_) + + logger.info(u'Moving Content: {0} => {1}'.format(src, dst_)) + shutil.move(src, dst_) + + +def silentRemove(filename): + """ + Silently remove a file, ignore if it doesn't exist. + + Workaround for #237 where `os.path.exists` gave false + positives and removal of files failed because of it. + + :type filename: str + :rtype: None + + """ + try: + os.remove(filename) + except OSError as e: + # Ignore case of no such file or directory + if e.errno != errno.ENOENT: + raise + + +def removePath(path): + """ + Delete the given path from disc. + + :type path: str + :rtype: None + """ + if os.path.isfile(path): + os.remove(path) + elif os.path.isdir(path): + shutil.rmtree(path) + + +def renamePath(src, dst, extension=None, force=False): + """ + Rename the given source path to the given destination path. + + :type src: str + :type dst: str + :type extension: str + :type force: bool + :rtype: str + """ + dirname = os.path.dirname(src) + + if "/" not in dst: + dst = os.path.join(dirname, dst) + + if extension and extension not in dst: + dst += extension + + src = normPath(src) + dst = normPath(dst) + + logger.debug(u'Renaming: {0} => {1}'.format(src, dst)) + + if src == dst and not force: + msg = u'The source path and destination path are the same: {0}' + raise RenamePathError(msg.format(src)) + + if os.path.exists(dst) and not force: + msg = u'Cannot save over an existing path: "{0}"' + raise RenamePathError(msg.format(dst)) + + if not os.path.exists(dirname): + msg = u'The system cannot find the specified path: "{0}".' + raise RenamePathError(msg.format(dirname)) + + if not os.path.exists(os.path.dirname(dst)) and force: + os.mkdir(os.path.dirname(dst)) + + if not os.path.exists(src): + msg = u'The system cannot find the specified path: "{0}"' + raise RenamePathError(msg.format(src)) + + os.rename(src, dst) + + logger.debug(u'Renamed: {0} => {1}'.format(src, dst)) + + return dst + + +def read(path): + """ + Return the contents of the given file. + + :type path: str + :rtype: str + """ + data = "" + path = normPath(path) + + if os.path.isfile(path): + with open(path) as f: + data = f.read() or data + + data = absPath(data, path) + + return data + + +def write(path, data): + if six.PY2: + write2(path, data) + else: + write3(path, data) + + +def write2(path, data): + """ + Write the given data to the given file on disc. + + :type path: str + :type data: str + :rtype: None + """ + path = normPath(path) + data = relPath(data, path) + + tmp = path + ".tmp" + bak = path + ".bak" + + # Create the directory if it doesn't exists + dirname = os.path.dirname(path) + if not os.path.exists(dirname): + os.makedirs(dirname) + + # Use the tmp file to check for concurrent writes + if os.path.exists(tmp): + msg = "The path is locked for writing and cannot be accessed {}" + msg = msg.format(tmp) + raise IOError(msg) + + # Safely write the data to a tmp file and then rename to the given path + try: + # Create and write the new data + # to the path.tmp file + with open(tmp, "w") as f: + f.write(data) + f.flush() + + # Remove any existing path.bak files + silentRemove(bak) + + # Rename the existing path to path.bak + if os.path.exists(path): + os.rename(path, bak) + + # Rename the tmp path to the given path + if os.path.exists(tmp): + os.rename(tmp, path) + + # Clean up the bak file only if the given path exists + if os.path.exists(path) and os.path.exists(bak): + silentRemove(bak) + + except: + # Remove the tmp file if there are any issues + silentRemove(tmp) + + # Restore the path from the current .bak file + if not os.path.exists(path) and os.path.exists(bak): + os.rename(bak, path) + + raise + + +def write3(path, data): + """ + Writes the given data to a file atomically by first writing to a + temp file and then renaming it. + + This approach avoids using the tempfile module to keep permissions + consistent with the write2 function. + """ + path = normPath(path) + data = relPath(data, path) + + dirname = os.path.dirname(path) + if not os.path.exists(dirname): + os.makedirs(dirname) + + tmp = None + + try: + + # Create a temporary file with a random name + characters = "abcdefghijklmnopqrstuvwxyz0123456789_" + name = ''.join(random.choice(characters) for _ in range(8)) + tmp = os.path.join(dirname, name + ".delete") + + with open(tmp, "w") as f: + f.write(data) + f.flush() + + # Introduced in python 3.3 + os.replace(tmp, path) + + finally: + if tmp and os.path.exists(tmp): + os.remove(tmp) + + +def update(data, other): + """ + Update the value of a nested dictionary of varying depth. + + :type data: dict + :type other: dict + :rtype: dict + """ + for key, value in other.items(): + if isinstance(value, Mapping): + data[key] = update(data.get(key, {}), value) + else: + data[key] = value + return data + + +def updateJson(path, data): + """ + Update a json file with the given data. + + :type path: str + :type data: dict + :rtype: None + """ + data_ = readJson(path) + data_ = update(data_, data) + saveJson(path, data_) + + +def saveJson(path, data): + """ + Serialize the data to a JSON string and write it to the given path. + + :type path: str + :type data: dict + :rtype: None + """ + path = normPath(path) + + data = collections.OrderedDict(sorted(data.items(), key=lambda t: t[0])) + data = json.dumps(data, indent=4) + write(path, data) + + +def readJson(path): + """ + Read the given JSON file and deserialize to a Python object. + + :type path: str + :rtype: dict + """ + path = normPath(path) + + logger.debug(u'Reading json file: {0}'.format(path)) + + data = read(path) or "{}" + data = json.loads(data) + + return data + + +def settingsPath(): + """ + Get the settings path from the config file. + + :rtype: str + """ + formatString = studiolibrary.config.get('settingsPath') + return studiolibrary.formatPath(formatString) + + +def updateSettings(data): + """ + Update the existing settings with the given data. + + :type data: dict + """ + settings = studiolibrary.readSettings() + update(settings, data) + studiolibrary.saveSettings(settings) + + +def readSettings(): + """ + Get all the user settings. + + :rtype: dict + """ + path = settingsPath() + + logger.debug(u'Reading settings from "%s"', path) + + data = {} + + try: + data = studiolibrary.readJson(path) + except Exception as error: + logger.exception('Cannot read settings from "%s"', path) + + return data + + +def saveSettings(data): + """ + Save the given data to the settings path. + + :type data: + """ + path = settingsPath() + + logger.debug(u'Saving settings to "%s"', path) + + try: + studiolibrary.saveJson(path, data) + except Exception: + logger.exception(u'Cannot save settings to "%s"', path) + + +def replaceJson(path, old, new, count=-1): + """ + Replace the old value with the new value in the given json file. + + :type path: str + :type old: str + :type new: str + :type count: int + :rtype: dict + """ + old = six.text_type(old) + new = six.text_type(new) + + data = read(path) or "{}" + data = data.replace(old, new, count) + data = json.loads(data) + + saveJson(path, data) + + return data + + +def renamePathInFile(path, src, dst): + """ + Rename the given src path to the given dst path. + + :type path: str + :type src: str + :type dst: str + :rtype: None + """ + src = normPath(src) + dst = normPath(dst) + + src1 = '"' + src + '"' + dst2 = '"' + dst + '"' + + # Replace paths that match exactly the given src and dst strings + replaceJson(path, src1, dst2) + + src2 = '"' + src + dst2 = '"' + dst + + # Add a slash as a suffix for better directory matching + if not src2.endswith("/"): + src2 += "/" + + if not dst2.endswith("/"): + dst2 += "/" + + # Replace all paths that start with the src path with the dst path + replaceJson(path, src2, dst2) + + +def relPath(data, start): + """ + Return a relative version of all the paths in data from the start path. + + :type data: str + :type start: str + :rtype: str + """ + rpath = start + + for i in range(0, 3): + + rpath = os.path.dirname(rpath) + token = os.path.relpath(rpath, start) + + rpath = normPath(rpath) + token = normPath(token) + + if rpath.endswith("/"): + rpath = rpath[:-1] + + data = data.replace(rpath, token) + + return data + + +def absPath(data, start, depth=3): + """ + Return an absolute version of all the paths in data using the start path. + + :type data: str + :type start: str + :type depth: int + :rtype: str + """ + token = ".." + pairs = [] + path = normPath(os.path.dirname(start)) + + # First create a list of tokens and paths. + for i in range(1, depth+1): + rel = ((token + "/") * i) + pairs.append((rel, path)) + path = normPath(os.path.dirname(path)) + + # Second replace the token with the paths. + for pair in reversed(pairs): + rel, path = pair + + # Replace with the trailing slash + # '../../', 'P:/LibraryData/' + if not rel.endswith("/"): + rel += "/" + + if not path.endswith("/"): + path += "/" + + data = data.replace(rel, path) + + # Replace without the trailing slash + # '../..', 'P:/LibraryData' + if rel.endswith("/"): + rel = rel[:-1] + + if path.endswith("/"): + path = path[:-1] + + data = data.replace(rel, path) + + return data + + +def realPath(path): + """ + Return the given path eliminating any symbolic link. + + :type path: str + :rtype: str + """ + path = os.path.realpath(path) + path = os.path.expanduser(path) + return normPath(path) + + +def normPath(path): + """ + Return a normalized path containing only forward slashes. + + :type path: str + :rtype: unicode + """ + # Check and support the UNC path structure + unc = path.startswith("//") or path.startswith("\\\\") + + path = path.replace("//", "/") + path = path.replace("\\", "/") + + if path.endswith("/") and not path.endswith(":/"): + path = path.rstrip("/") + + # Make sure we retain the UNC path structure + if unc and not path.startswith("//") and path.startswith("/"): + path = "/" + path + + return path + + +def normPaths(paths): + """ + Normalize all the given paths to a consistent format. + + :type paths: list[str] + :rtype: list[str] + """ + return [normPath(path) for path in paths] + + +def splitPath(path): + """ + Split the given path into directory, basename and extension. + + Example: + print splitPath("P:/production/rigs/character/mario.ma + + # (u'P:/production/rigs/character', u'mario', u'.ma') + + :type path: str + :rtype: list[str] + """ + path = normPath(path) + filename, extension = os.path.splitext(path) + return os.path.dirname(filename), os.path.basename(filename), extension + + +def listToString(data): + """ + Return a string from the given list. + + Example: + print listToString(['apple', 'pear', 'cherry']) + + # apple,pear,cherry + + :type data: list + :rtype: str + """ + # Convert all items to string and remove 'u' + data = [str(item) for item in data] + data = str(data).replace("[", "").replace("]", "") + data = data.replace("'", "").replace('"', "") + return data + + +def stringToList(data): + """ + Return a list from the given string. + + Example: + print listToString('apple, pear, cherry') + + # ['apple', 'pear', 'cherry'] + + :type data: str + :rtype: list + """ + data = '["' + str(data) + '"]' + data = data.replace(' ', '') + data = data.replace(',', '","') + return eval(data) + + +def isVersionPath(path): + basename = path.rstrip('/').split('/')[-1] + if re.match(r'^v\d+$', basename): + return True + return False + + +def latestVersionPath(path): + version = "" + + for name in sorted(os.listdir(path), reverse=True): + if name.startswith("v"): + version = name + break + + if version: + return "{}/{}".format(path, version) + + +def listPaths(path): + """ + Return a list of paths that are in the given directory. + + :type path: str + :rtype: collections.Iterable[str] + """ + for name in os.listdir(path): + value = path + "/" + name + yield value + + +def generateUniquePath(path, attempts=1000): + """ + Generate a unique path on disc. + + Example: + # If the following files exist then the next unique path will be 3. + # C:/tmp/file.text + # C:/tmp/file (2).text + + print generateUniquePath("C:/tmp/file.text") + # C:/tmp/file (3).text + + :type path: str + :type attempts: int + :rtype: str + """ + attempt = 1 # We start at one so that the first unique name is actually 2. + dirname, name, extension = splitPath(path) + path_ = u'{dirname}/{name} ({number}){extension}' + + while os.path.exists(path): + attempt += 1 + + path = path_.format( + name=name, + number=attempt, + dirname=dirname, + extension=extension + ) + + if attempt >= attempts: + msg = u'Cannot generate unique name for path {path}' + msg = msg.format(path=path) + raise ValueError(msg) + + return path + + +def walkup(path, match=None, depth=3, sep="/"): + """ + :type path: str + :type match: func + :type depth: int + :type sep: str + :rtype: collections.Iterable[str] + """ + path = normPath(path) + + if not path.endswith(sep): + path += sep + + folders = path.split(sep) + depthCount = 0 + + for i, folder in enumerate(folders): + if not folder: + continue + + if depthCount > depth: + break + depthCount += 1 + + folder = os.path.sep.join(folders[:i*-1]) + if not os.path.isdir(folder): + continue + try: + filenames = os.listdir(folder) + except PermissionError: + continue # expected on network shares + except OSError as e: + if getattr(e, 'winerror', None) == 59: + continue # "An unexpected network error occurred" + if getattr(e, 'winerror', None) == 6: + # "The handle is invalid" - something weird on network share + continue + raise + for filename in filenames: + path = os.path.join(folder, filename) + if match is None or match(path): + yield normPath(path) + + +def timeAgo(timeStamp): + """ + Return a pretty string for how long ago the given timeStamp was. + + Example: + print timeAgo("2015-04-27 22:29:55" + # 2 years ago + + :type timeStamp: str + :rtype: str + """ + t1 = int(timeStamp) + t1 = datetime.fromtimestamp(t1) + + t2 = datetime.now() + diff = t2 - t1 + + dayDiff = diff.days + secondsDiff = diff.seconds + + if dayDiff < 0: + return '' + + if dayDiff == 0: + if secondsDiff < 10: + return "just now" + if secondsDiff < 60: + return "{:.0f} seconds ago".format(secondsDiff) + if secondsDiff < 120: + return "a minute ago" + if secondsDiff < 3600: + return "{:.0f} minutes ago".format(secondsDiff / 60) + if secondsDiff < 7200: + return "an hour ago" + if secondsDiff < 86400: + return "{:.0f} hours ago".format(secondsDiff / 3600) + + if dayDiff == 1: + return "yesterday" + + if dayDiff < 7: + return "{:.0f} days ago".format(dayDiff) + + if dayDiff < 31: + v = dayDiff / 7 + if v == 1: + return "{:.0f} week ago".format(v) + return "{:.0f} weeks ago".format(dayDiff / 7) + + if dayDiff < 365: + v = dayDiff / 30 + if v == 1: + return "{:.0f} month ago".format(v) + return "{:.0f} months ago".format(v) + + v = dayDiff / 365 + if v == 1: + return "{:.0f} year ago".format(v) + return "{:.0f} years ago".format(v) + + +def userUuid(): + """ + Return a unique uuid4 for each user. + + This does not compromise privacy as it generates a random uuid4 string + for the current user. + + :rtype: str + """ + path = os.path.join(localPath(), "settings.json") + userUuid_ = readJson(path).get("userUuid") + + if not userUuid_: + updateJson(path, {"userUuid": str(uuid.uuid4())}) + + # Read the uuid again to make sure its persistent + userUuid_ = readJson(path).get("userUuid") + + return userUuid_ + + +def showInFolder(path): + """ + Show the given path in the system file explorer. + + :type path: unicode + :rtype: None + """ + if isWindows(): + # os.system() and subprocess.call() can't pass command with + # non ascii symbols, use ShellExecuteW directly + cmd = ctypes.windll.shell32.ShellExecuteW + else: + cmd = os.system + + args = studiolibrary.config.get('showInFolderCmd') + + if args: + if isinstance(args, six.string_types): + args = [args] + + elif isLinux(): + args = [u'xdg-open "{path}"&'] + + elif isWindows(): + args = [None, u'open', u'explorer', u'/select, "{path}"', None, 1] + + elif isMac(): + args = [u'open -R "{path}"'] + + # Normalize the pathname for windows + path = os.path.normpath(path) + + for i, a in enumerate(args): + if isinstance(a, six.string_types) and '{path}' in a: + args[i] = a.format(path=path) + + logger.info("Call: '%s' with arguments: %s", cmd.__name__, args) + cmd(*args) + + +global DCC_INFO + +try: + import maya.cmds + DCC_INFO = { + "name": "maya", + "version": maya.cmds.about(q=True, version=True) + } +except Exception as error: + DCC_INFO = { + "name": "undefined", + "version": "undefined", + } + + +def osVersion(): + try: + # Fix for Windows 11 returning the wrong version + if platform.system().lower() == "windows" and platform.release() == "10" and sys.getwindowsversion().build >= 22000: + return "11" + finally: + return platform.release().replace(' ', '%20') + + +def checkForUpdates(): + """ + This function should only be used once every session unless specified by the user. + + Returns True if a newer release is found for the given platform. + + :rtype: dict + """ + if os.environ.get("STUDIO_LIBRARY_RELOADED") == "1": + return {} + + if not studiolibrary.config.get('checkForUpdatesEnabled', True): + return {} + + # In python 2.7 the getdefaultlocale function could return a None "ul" + try: + ul, _ = locale.getdefaultlocale() + ul = ul or "undefined" + ul = ul.replace("_", "-").lower() + except Exception as error: + ul = "undefined" + + try: + uid = userUuid() or "undefined" + url = "https://app.studiolibrary.com/releases?uid={uid}&v={v}&dv={dv}&dn={dn}&os={os}&ov={ov}&pv={pv}&ul={ul}" + url = url.format( + uid=uid, + v=studiolibrary.__version__, + dn=DCC_INFO.get("name").replace(' ', '%20'), + dv=DCC_INFO.get("version").replace(' ', '%20'), + os=platform.system().lower().replace(' ', '%20'), + ov=osVersion(), + pv=platform.python_version().replace(' ', '%20'), + ul=ul, + ) + + response = urllib.request.urlopen(url) + + # Check the HTTP status code + if response.getcode() == 200: + json_content = response.read().decode('utf-8') + data = json.loads(json_content) + return data + + except Exception as error: + logger.debug("Exception occurred:\n%s", traceback.format_exc()) + pass + + return {} + + +def testNormPath(): + """Test the norm path utility function. """ + + assert normPath("//win-q9lu/Library Data") == "//win-q9lu/Library Data" + + assert normPath("////win-q9lu/Library Data/") == "//win-q9lu/Library Data" + + assert normPath("\\\\win-q9l\\Library Data\\") == "//win-q9l/Library Data" + + assert normPath(r"C:\folder//Library Data/") == "C:/folder/Library Data" + + assert normPath(r"\folder//Library Data/") == "/folder/Library Data" + + assert normPath("C:\\folder//Library Data/") == "C:/folder/Library Data" + + assert normPath("\\folder//Library Data/") == "/folder/Library Data" + + assert normPath("C:/") == "C:/" + + +def testUpdate(): + """ + Test the update dictionary command + + :rtype: None + """ + testData1 = { + "../../images/beach.jpg": { + "Custom Order": "00001" + }, + "../../images/sky.jpg": { + "Custom Order": "00019", + "Other": {"Paths": "../../images/bird2.mb"} + } + } + + testData2 = { + "../../images/sky.jpg": { + "Labels": ["head", "face"], + }, + } + + expected = { + "../../images/beach.jpg": { + "Custom Order": "00001" + }, + "../../images/sky.jpg": { + "Custom Order": "00019", + "Labels": ["head", "face"], + "Other": {"Paths": "../../images/bird2.mb"} + } + } + + # Test updating/inserting a value in a dictionary. + result = update(testData1, testData2) + + msg = "Data does not match {} {}".format(expected, result) + assert expected == result, msg + + # Test the update command with an empty dictionary. + testData2 = { + "../../images/sky.jpg": {}, + } + + result = update(testData1, testData2) + + msg = "Data does not match {} {}".format(expected, result) + assert expected == result, msg + + +def testSplitPath(): + """ + Test he splitPath command. + + :rtype: None + """ + path = "P:/production/rigs/character/mario.ma" + + result = splitPath(path) + expected = (u'P:/production/rigs/character', u'mario', u'.ma') + + msg = "Data does not match {} {}".format(expected, result) + assert expected == result, msg + + +def testFormatPath(): + """ + Test the formatPath command. + + :rtype: None + """ + formatString = "{dirname}/versions/{name}{extension}" + + result = formatPath(formatString, path="P:/production/rigs/database.json") + expected = "P:/production/rigs/versions/database.json" + + msg = "Data does not match {} {}".format(expected, result) + assert expected == result, msg + + +def testRelativePaths(): + """ + Test absolute and relative paths. + + :rtype: None + """ + data = """ + { + "P:/path/head.anim": {}, + "P:/test/path/face.anim": {}, + "P:/test/relative/path/hand.anim": {}, + } + """ + + expected = """ + { + "../../../path/head.anim": {}, + "../../path/face.anim": {}, + "../path/hand.anim": {}, + } + """ + + data_ = relPath(data, "P:/test/relative/file.database") + msg = "Data does not match {} {}".format(expected, data_) + assert data_ == expected, msg + + data = """ + { + "P:/": {}, + "P:/head.anim": {}, + "P:/path/head.anim": {}, + "P:/test/path/face.anim": {}, + "P:/test/relative/path/hand.anim": {}, + } + """ + + expected = """ + { + "../../": {}, + "../../head.anim": {}, + "../../path/head.anim": {}, + "../../test/path/face.anim": {}, + "../../test/relative/path/hand.anim": {}, + } + """ + + data_ = relPath(data, "P:/.studiolibrary/database.json") + msg = "Data does not match {} {}".format(expected, data_) + assert data_ == expected, msg + + path = "P:/path/head.anim" + start = "P:/test/relative/file.database" + expected = "../../../path/head.anim" + + result = relPath(path, start) + msg = 'Data does not match "{}" "{}"'.format(result, expected) + assert result == expected, msg + + result = absPath(result, start) + msg = 'Data does not match "{}" "{}"'.format(result, path) + assert result == path, msg + + data = """ + { + "P:/LibraryData": {}, + } + """ + + expected = """ + { + "../..": {}, + } + """ + + data_ = relPath(data, "P:/LibraryData/.studiolibrary/database.json") + + print(data_) + msg = "Data does not match {} {}".format(expected, data_) + assert data_ == expected, msg + + data = """ + { + "../..": {}, + } + """ + + expected = """ + { + "P:/LibraryData": {}, + } + """ + + data_ = absPath(data, "P:/LibraryData/.studiolibrary/database.json") + + print(data_) + msg = "Data does not match {} {}".format(expected, data_) + assert data_ == expected, msg + + +def runTests(): + """Run all the tests for this file.""" + testUpdate() + testSplitPath() + testFormatPath() + testRelativePaths() + testNormPath() + + +if __name__ == "__main__": + runTests() diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/PlaceholderWidget.ui b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/PlaceholderWidget.ui new file mode 100644 index 0000000..a9ab813 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/PlaceholderWidget.ui @@ -0,0 +1,95 @@ + + + Frame + + + + 0 + 0 + 229 + 639 + + + + Frame + + + QFrame::NoFrame + + + QFrame::Plain + + + 0 + + + + + + + 0 + 10 + + + + QFrame::NoFrame + + + QFrame::Plain + + + 0 + + + + + + + 96 + 96 + + + + + 96 + 96 + + + + + + + ../resource/icons/preview_placeholder.png + + + true + + + + + + + + + + + 0 + 2 + + + + QFrame::NoFrame + + + QFrame::Plain + + + 0 + + + + + + + + diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/PreviewWidget.ui b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/PreviewWidget.ui new file mode 100644 index 0000000..1c18811 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/PreviewWidget.ui @@ -0,0 +1,300 @@ + + + Frame + + + + 0 + 0 + 160 + 479 + + + + + 160 + 0 + + + + Frame + + + QFrame::NoFrame + + + QFrame::Plain + + + 0 + + + + 2 + + + 0 + + + + + + 0 + 24 + + + + QFrame::NoFrame + + + QFrame::Plain + + + 0 + + + + 0 + + + 0 + + + + + + + + + 0 + 16 + + + + + + + QFrame::NoFrame + + + QFrame::Plain + + + 0 + + + + 0 + + + 4 + + + 2 + + + 4 + + + 2 + + + + + + + + + 0 + 0 + + + + + 5000 + 5000 + + + + QFrame::NoFrame + + + QFrame::Plain + + + 0 + + + + 0 + + + 0 + + + + + + 0 + 1 + + + + + 50 + 50 + + + + + 5000 + 5000 + + + + + + + QFrame::NoFrame + + + QFrame::Plain + + + 0 + + + + 0 + + + 4 + + + 2 + + + 4 + + + 2 + + + + + + + + + + + + 0 + 0 + + + + + 0 + 15 + + + + QFrame::NoFrame + + + QFrame::Plain + + + 0 + + + + 0 + + + 4 + + + 2 + + + 4 + + + 2 + + + + + + + + + 0 + 0 + + + + QFrame::NoFrame + + + QFrame::Plain + + + 0 + + + + + + + QFrame::NoFrame + + + QFrame::Plain + + + 0 + + + + 4 + + + 4 + + + + + + 32 + 32 + + + + + 96 + 96 + + + + + 12 + 50 + false + + + + Accept + + + + + + + + + + + diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/__init__.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/__init__.py new file mode 100644 index 0000000..c72ecb9 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/__init__.py @@ -0,0 +1,37 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +from .lightbox import Lightbox +from .lineedit import LineEdit +from .sortbymenu import SortByMenu +from .groupbymenu import GroupByMenu +from .filterbymenu import FilterByMenu +from .messagebox import MessageBox, createMessageBox +from .toastwidget import ToastWidget +from .searchwidget import SearchWidget +from .statuswidget import StatusWidget +from .previewwidget import PreviewWidget +from .menubarwidget import MenuBarWidget +from .sidebarwidget import SidebarWidget +from .groupboxwidget import GroupBoxWidget +from .placeholderwidget import PlaceholderWidget +from .itemswidget.item import Item +from .itemswidget.groupitem import GroupItem +from .itemswidget.itemswidget import ItemsWidget +from .themesmenu import Theme, ThemesMenu +from .librariesmenu import LibrariesMenu +from .slideraction import SliderAction +from .separatoraction import SeparatorAction +from .iconpicker import IconPickerAction, IconPickerWidget +from .colorpicker import ColorPickerAction, ColorPickerWidget +from .sequencewidget import ImageSequenceWidget +from .formwidget import FormWidget, FormDialog diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/colorpicker.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/colorpicker.py new file mode 100644 index 0000000..60beab8 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/colorpicker.py @@ -0,0 +1,408 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +from functools import partial + +from studiovendor.Qt import QtGui +from studiovendor.Qt import QtCore +from studiovendor.Qt import QtWidgets + +import studioqt + + +class ColorButton(QtWidgets.QPushButton): + + def __init__(self, *args): + QtWidgets.QPushButton.__init__(self, *args) + + self._color = None + + self.setCheckable(True) + self.setCursor(QtCore.Qt.PointingHandCursor) + + def setColor(self, color): + """ + Set the color for the button. + + :type color: QtGui.QColor + """ + self._color = color + + color = studioqt.Color.fromString(color) + + rgb = "{0},{1},{2}" + rgb = rgb.format(color.red(), color.green(), color.blue()) + + css = """ + ColorButton { + background-color: rgb(RGB); + } + + ColorButton:hover { + background-color: rgba(RGB, 220); + } + """.replace("RGB", rgb) + + self.setStyleSheet(css) + + def color(self): + """ + Get the color for the button. + + :rtype: QtGui.QColor + """ + return self._color + + +class ColorPickerAction(QtWidgets.QWidgetAction): + + def __init__(self, *args): + super(ColorPickerAction, self).__init__(*args) + + self._picker = ColorPickerWidget() + self._picker.setMouseTracking(True) + self._picker.setObjectName("colorPickerAction") + self._picker.colorChanged.connect(self._triggered) + + def picker(self): + """ + Get the picker widget instance. + + :rtype: ColorPickerWidget + """ + return self._picker + + def _triggered(self): + """Triggered when the checkbox value has changed.""" + self.trigger() + + if isinstance(self.parent().parent(), QtWidgets.QMenu): + self.parent().parent().close() + + elif isinstance(self.parent(), QtWidgets.QMenu): + self.parent().close() + + def createWidget(self, menu): + """ + This method is called by the QWidgetAction base class. + + :type menu: QtWidgets.QMenu + """ + widget = QtWidgets.QFrame(menu) + widget.setObjectName("colorPickerAction") + + actionLayout = QtWidgets.QHBoxLayout() + actionLayout.setContentsMargins(0, 0, 0, 0) + actionLayout.addWidget(self.picker(), stretch=1) + widget.setLayout(actionLayout) + + return widget + + +class ColorPickerWidget(QtWidgets.QFrame): + + COLOR_BUTTON_CLASS = ColorButton + + colorChanged = QtCore.Signal(object) + + def __init__(self, *args): + QtWidgets.QFrame.__init__(self, *args) + + self._buttons = [] + self._currentColor = None + self._browserColors = None + self._menuButton = None + + layout = QtWidgets.QHBoxLayout() + layout.setSpacing(0) + layout.setContentsMargins(0, 0, 0, 0) + self.setLayout(layout) + + def enterEvent(self, event): + """ + Overriding this method to fix a bug with custom actions. + + :type event: QtCore.QEvent + """ + if self.parent(): + menu = self.parent().parent() + if isinstance(menu, QtWidgets.QMenu): + menu.setActiveAction(None) + + def _colorChanged(self, color): + """ + Triggered when the user clicks or browses for a color. + + :type color: studioqt.Color + :rtype: None + """ + self.setCurrentColor(color) + self.colorChanged.emit(color) + + def menuButton(self): + """ + Get the menu button used for browsing for custom colors. + + :rtype: QtGui.QWidget + """ + return self._menuButton + + def deleteButtons(self): + """ + Delete all the color buttons. + + :rtype: None + """ + layout = self.layout() + while layout.count(): + item = layout.takeAt(0) + item.widget().deleteLater() + + def currentColor(self): + """ + Return the current color. + + :rtype: studioqt.Color + """ + return self._currentColor + + def setCurrentColor(self, color): + """ + Set the current color. + + :type color: studioqt.Color + """ + self._currentColor = color + self.refresh() + + def refresh(self): + """Update the current state of the selected color.""" + for button in self._buttons: + button.setChecked(button.color() == self.currentColor()) + + def setColors(self, colors): + """ + Set the colors for the color bar. + + :type colors: list[str] or list[studioqt.Color] + """ + self.deleteButtons() + + first = True + last = False + + for i, color in enumerate(colors): + + if i == len(colors)-1: + last = True + + if not isinstance(color, str): + color = studioqt.Color(color) + color = color.toString() + + callback = partial(self._colorChanged, color) + + button = self.COLOR_BUTTON_CLASS(self) + + button.setObjectName('colorButton') + button.setColor(color) + + button.setSizePolicy( + QtWidgets.QSizePolicy.Expanding, + QtWidgets.QSizePolicy.Preferred + ) + + button.setProperty("first", first) + button.setProperty("last", last) + + button.clicked.connect(callback) + + self.layout().addWidget(button) + + self._buttons.append(button) + + first = False + + self._menuButton = QtWidgets.QPushButton("...", self) + self._menuButton.setObjectName('menuButton') + self._menuButton.setSizePolicy( + QtWidgets.QSizePolicy.Expanding, + QtWidgets.QSizePolicy.Preferred + ) + + self._menuButton.clicked.connect(self.browseColor) + self.layout().addWidget(self._menuButton) + self.refresh() + + def setBrowserColors(self, colors): + """ + :type colors: list((int,int,int)) + """ + self._browserColors = colors + + def browserColors(self): + """ + Get the colors to be displayed in the browser + + :rtype: list[studioqt.Color] + """ + return self._browserColors + + @QtCore.Slot() + def blankSlot(self): + """Blank slot to fix an issue with PySide2.QColorDialog.open()""" + pass + + def browseColor(self): + """ + Show the color dialog. + + :rtype: None + """ + color = self.currentColor() + if color: + color = studioqt.Color.fromString(color) + + d = QtWidgets.QColorDialog(self) + d.setCurrentColor(color) + + standardColors = self.browserColors() + + if standardColors: + index = -1 + for standardColor in standardColors: + index += 1 + + try: + # Support for new qt5 signature + standardColor = QtGui.QColor(standardColor) + d.setStandardColor(index, standardColor) + except: + # Support for new qt4 signature + standardColor = QtGui.QColor(standardColor).rgba() + d.setStandardColor(index, standardColor) + + d.currentColorChanged.connect(self._colorChanged) + + if d.exec_(): + self._colorChanged(d.selectedColor()) + else: + self._colorChanged(color) + + +def example(): + """ + Example: + + import studiolibrary.widgets.colorpicker + reload(studiolibrary.widgets.colorpicker) + studiolibrary.widgets.colorpicker.example() + """ + def _colorChanged(color): + print("colorChanged:", color) + + style = """ + #colorButton { + margin: 5px; + min-width: 100px; + min-height: 100px; + } + + #browseColorButton { + margin: 5px; + font-size: 45px; + min-width: 100px; + min-height: 100px; + } + """ + + colors = [ + "rgba(230, 60, 60, 255)", + "rgb(255, 90, 40)", + "rgba(255, 125, 100, 255)", + "rgba(250, 200, 0, 255)", + "rgba(80, 200, 140, 255)", + "rgba(50, 180, 240, 255)", + "rgba(110, 110, 240, 255)", + ] + + browserColors = [] + browserColors_ = [ + # Top row, Bottom row + (230, 60, 60), (250, 80, 130), + (255, 90, 40), (240, 100, 170), + (255, 125, 100), (240, 200, 150), + (250, 200, 0), (225, 200, 40), + (80, 200, 140), (80, 225, 120), + (50, 180, 240), (100, 200, 245), + (130, 110, 240), (180, 160, 255), + (180, 110, 240), (210, 110, 255) + ] + + for colorR, colorG, colorB in browserColors_: + for i in range(0, 3): + color = QtGui.QColor(colorR, colorG, colorB) + browserColors.append(color) + + picker = ColorPickerWidget() + picker.setColors(colors) + picker.setStyleSheet(style) + picker.setBrowserColors(browserColors) + picker.colorChanged.connect(_colorChanged) + picker.show() + + +def example2(): + """ + Example: + + import studiolibrary.widgets.colorpicker + reload(studiolibrary.widgets.colorpicker) + studiolibrary.widgets.colorpicker.example2() + """ + menu = QtWidgets.QMenu() + + colors = [ + "rgb(230, 60, 60)", + "rgb(255, 90, 40)", + "rgb(255, 125, 100)", + "rgb(250, 200, 0)", + "rgb(80, 200, 140)", + "rgb(50, 180, 240)", + "rgb(110, 110, 240)", + ] + + action = ColorPickerAction(menu) + action.picker().setColors(colors) + menu.addAction(action) + + colors = [ + "rgb(20, 20, 20)", + "rgb(20, 30, 40)", + "rgb(40, 40, 40)", + "rgb(40, 50, 60)", + "rgb(60, 60, 60)", + "rgb(60, 70, 80)", + "rgb(240, 240, 240)", + ] + + action = ColorPickerAction(menu) + action.picker().setColors(colors) + menu.addAction(action) + menu.addSeparator() + + menu.exec_() + + +if __name__ == "__main__": + with studioqt.app(): + example() diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/fieldwidgets.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/fieldwidgets.py new file mode 100644 index 0000000..f5202d0 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/fieldwidgets.py @@ -0,0 +1,1512 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +import re +import logging +import functools + +from studiovendor import six +from studiovendor.Qt import QtGui, QtCore, QtWidgets + +import studioqt + +from . import groupboxwidget +from . import colorpicker +from . import iconpicker +from . import sequencewidget + + +logger = logging.getLogger(__name__) + + +def toTitle(name): + """Convert camel case strings to title strings""" + s1 = re.sub('(.)([A-Z][a-z]+)', r'\1 \2', name) + return re.sub('([a-z0-9])([A-Z])', r'\1 \2', s1).title() + + +class FieldWidget(QtWidgets.QFrame): + + """The base widget for all field widgets. + + Examples: + + data = { + 'name': 'startFrame', + 'type': 'int' + 'value': 1, + } + + fieldWidget = FieldWidget(data) + + """ + valueChanged = QtCore.Signal() + + DefaultLayout = "horizontal" + + def __init__(self, parent=None, data=None, formWidget=None): + super(FieldWidget, self).__init__(parent) + + self._data = data or {} + self._widget = None + self._default = None + self._required = None + self._collapsed = False + self._errorLabel = None + self._menuButton = None + self._actionResult = None + self._formWidget = None + self._validateEnabled = True + + if formWidget: + self.setFormWidget(formWidget) + + self.setObjectName("fieldWidget") + + direction = self._data.get("layout", self.DefaultLayout) + + if direction == "vertical": + layout = QtWidgets.QVBoxLayout() + else: + layout = QtWidgets.QHBoxLayout() + + layout.setContentsMargins(0, 0, 0, 0) + layout.setSpacing(0) + self.setLayout(layout) + + self.setContentsMargins(0, 0, 0, 0) + + self._label = QtWidgets.QLabel(self) + self._label.setObjectName('label') + self._label.setSizePolicy( + QtWidgets.QSizePolicy.Preferred, + QtWidgets.QSizePolicy.Preferred, + ) + + layout.addWidget(self._label) + + self._layout2 = QtWidgets.QHBoxLayout() + layout.addLayout(self._layout2) + + if direction == "vertical": + self._label.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter) + else: + self._label.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) + + widget = self.createWidget() + if widget: + self.setWidget(widget) + + + def setValidateEnabled(self, v): + self._validateEnabled = v + + def validateEnabled(self): + return self._validateEnabled + + def name(self): + """ + Get the name of field widget. + + :rtype: str + """ + return self.data()["name"] + + def defaultData(self): + """ + This is the default data used by the schema. + + :rtype: dict + """ + return {} + + def setFormWidget(self, formWidget): + """ + Set the form widget which contains the field widget. + + :type formWidget: studiolibrary.widgets.formwidget.FormWidget + """ + self._formWidget = formWidget + + def formWidget(self): + """ + Get the form widget the contains the field widget. + + :return: studiolibrary.widgets.formwidget.FormWidget + """ + return self._formWidget + + def setCollapsed(self, collapsed): + """ + Set the field widget collapsed used by the GroupFieldWidget. + + :return: studiolibrary.widgets.formwidget.FormWidget + """ + self._collapsed = collapsed + + def isCollapsed(self): + """ + Get the collapsed state of the field widget. + + :return: studiolibrary.widgets.formwidget.FormWidget + """ + return self._collapsed + + def createWidget(self): + """ + Create the widget to be used by the field. + + :rtype: QtWidgets.Widget or None + """ + return None + + def label(self): + """ + Get the label widget. + + :rtype: QtWidgets.QLabel + """ + return self._label + + def state(self): + """ + Get the current state of the data. + + :rtype: dict + """ + return { + "name": self._data["name"], + "value": self.value() + } + + def data(self): + """ + Get the data for the widget. + + :rtype: dict + """ + return self._data + + def title(self): + """ + Get the title to be displayed for the field. + + :rtype: str + """ + data = self.data() + + title = data.get("title") + if title is None: + title = data.get("name", "") + title = toTitle(title) + + if self.isRequired(): + title += '*' + + return title + + def setData(self, data): + """ + Set the current state of the field widget using a dictionary. + + :type data: dict + """ + self.blockSignals(True) + + items = data.get('items') + if items is not None: + self.setItems(items) + + value = data.get('value') + default = data.get('default') + + # Must set the default before value + if default is not None: + self.setDefault(default) + elif value is not None: + self.setDefault(value) + + if value is not None or (value and value != self.value()): + try: + self.setValue(value) + except TypeError as error: + logger.exception(error) + + enabled = data.get('enabled') + if enabled is not None: + self.setEnabled(enabled) + self._label.setEnabled(enabled) + + hidden = data.get('hidden') + if hidden is not None: + self.setHidden(hidden) + + visible = data.get('visible') + if visible is not None and not self.isCollapsed(): + self.setVisible(visible) + + required = data.get('required') + if required is not None: + self.setRequired(required) + + error = data.get('error') + if error is not None: + self.setError(error) + + value = data.get('errorVisible') + if value is not None: + self.setErrorVisible(value) + + toolTip = data.get('toolTip') + if toolTip is not None: + self.setToolTip(toolTip) + self.setStatusTip(toolTip) + + placeholder = data.get("placeholder") + if placeholder is not None: + self.setPlaceholder(placeholder) + + style = data.get("style") + if style is not None: + self.setStyleSheet(style) + + title = self.title() or "" + self.setText(title) + + label = data.get('label') + if label is not None: + + text = label.get("name") + if text is not None: + self.setText(text) + + visible = label.get('visible') + if visible is not None: + self.label().setVisible(visible) + + # Menu Items + actions = data.get('actions') + if actions is not None: + self._menuButton.setVisible(True) + + # Menu Button + menu = data.get('menu') + if menu is not None: + text = menu.get("name") + if text is not None: + self._menuButton.setText(text) + + visible = menu.get("visible", True) + self._menuButton.setVisible(visible) + + self._data.update(data) + + self.refresh() + + self.blockSignals(False) + + def setPlaceholder(self, placeholder): + """ + Set the placeholder text to be displayed for the widget. + + :type placeholder: str + :raises: NotImplementedError + """ + NotImplementedError('The method "setPlaceholder" needs to be implemented') + + def hasError(self): + """ + Check if the field contains any errors. + + :rtype: bool + """ + return bool(self.data().get("error")) + + def setErrorVisible(self, visible): + """ + Set the error message visibility. + + :type visible: bool + """ + self._data["errorVisible"] = visible + self.refreshError() + + def setError(self, message): + """ + Set the error message to be displayed for the field widget. + + :type message: str + """ + self._data["error"] = message + self.refreshError() + + def refreshError(self): + """Refresh the error message with the current data.""" + error = self.data().get("error") + + if self.hasError() and self.data().get("errorVisible", False): + self._errorLabel.setText(error) + self._errorLabel.setHidden(False) + self.setToolTip(error) + else: + self._errorLabel.setText("") + self._errorLabel.setHidden(True) + self.setToolTip(self.data().get('toolTip')) + + self.refresh() + + def setText(self, text): + """ + Set the label text for the field widget. + + :type text: str + """ + self._label.setText(text) + + def setValue(self, value): + """ + Set the value of the field widget. + + Will emit valueChanged() if the new value is different from the old one. + + :type value: object + """ + self.emitValueChanged() + + def value(self): + """ + Get the value of the field widget. + + :rtype: object + """ + raise NotImplementedError('The method "value" needs to be implemented') + + def setItems(self, items): + """ + Set the items for the field widget. + + :type items: list[str] + """ + raise NotImplementedError('The method "setItems" needs to be implemented') + + def reset(self): + """Reset the field widget back to the defaults.""" + self.setState(self._data) + + def setRequired(self, required): + """ + Set True if a value is required for this field. + + :type required: bool + """ + self._required = required + self.setProperty('required', required) + self.setStyleSheet(self.styleSheet()) + + def isRequired(self): + """ + Check if a value is required for the field widget. + + :rtype: bool + """ + return bool(self._required) + + def setDefault(self, default): + """ + Set the default value for the field widget. + + :type default: object + """ + self._default = default + + def default(self): + """ + Get the default value for the field widget. + + :rtype: object + """ + return self._default + + def isDefault(self): + """ + Check if the current value is the same as the default value. + + :rtype: bool + """ + return self.value() == self.default() + + def emitValueChanged(self, *args): + """ + Emit the value changed signal. + + :type args: list + """ + self.valueChanged.emit() + self.refresh() + + def setWidget(self, widget): + """ + Set the widget used to set and get the field value. + + :type widget: QtWidgets.QWidget + """ + widgetLayout = QtWidgets.QHBoxLayout() + widgetLayout.setContentsMargins(0, 0, 0, 0) + widgetLayout.setSpacing(0) + + self._widget = widget + self._widget.setParent(self) + self._widget.setObjectName('widget') + self._widget.setSizePolicy( + QtWidgets.QSizePolicy.Expanding, + QtWidgets.QSizePolicy.Preferred, + ) + + self._menuButton = QtWidgets.QPushButton("...") + self._menuButton.setHidden(True) + self._menuButton.setObjectName("menuButton") + self._menuButton.clicked.connect(self._menuCallback) + self._menuButton.setSizePolicy( + QtWidgets.QSizePolicy.Preferred, + QtWidgets.QSizePolicy.Expanding, + ) + + widgetLayout.addWidget(self._widget) + widgetLayout.addWidget(self._menuButton) + + layout = QtWidgets.QVBoxLayout() + layout.setContentsMargins(0, 0, 0, 0) + layout.setSpacing(0) + + self._errorLabel = QtWidgets.QLabel(self) + self._errorLabel.setHidden(True) + self._errorLabel.setObjectName("errorLabel") + self._errorLabel.setSizePolicy( + QtWidgets.QSizePolicy.Expanding, + QtWidgets.QSizePolicy.Preferred, + ) + + layout.addLayout(widgetLayout) + layout.addWidget(self._errorLabel) + + self._layout2.addLayout(layout) + + def _menuCallback(self): + callback = self.data().get("menu", {}).get("callback", self.showMenu) + callback() + + def _actionCallback(self, callback): + """ + Wrap schema callback to get the return value. + + :type callback: func + """ + self._actionResult = callback() + + def showMenu(self): + """Show the menu using the actions from the data.""" + menu = QtWidgets.QMenu(self) + actions = self.data().get("actions", []) + + for action in actions: + + name = action.get("name", "No name found") + enabled = action.get("enabled", True) + callback = action.get("callback") + + func = functools.partial(self._actionCallback, callback) + + action = menu.addAction(name) + action.setEnabled(enabled) + action.triggered.connect(func) + + point = QtGui.QCursor.pos() + point.setX(point.x() + 3) + point.setY(point.y() + 3) + + # Reset the action results + self._actionResult = None + + menu.exec_(point) + + if self._actionResult is not None: + self.setValue(self._actionResult) + + def widget(self,): + """ + Get the widget used to set and get the field value. + + :rtype: QtWidgets.QWidget + """ + return self._widget + + def refresh(self): + """Refresh the style properties.""" + direction = self._data.get("layout", self.DefaultLayout) + + self.setProperty("layout", direction) + self.setProperty('default', self.isDefault()) + + if self.data().get("errorVisible", False): + self.setProperty('error', self.hasError()) + + self.setStyleSheet(self.styleSheet()) + + +class GroupFieldWidget(FieldWidget): + + def __init__(self, *args, **kwargs): + super(GroupFieldWidget, self).__init__(*args, **kwargs) + + widget = groupboxwidget.GroupBoxWidget(self.data().get("title"), None) + widget.setChecked(True) + widget.toggled.connect(self.setValue) + + self.setWidget(widget) + self.setValidateEnabled(False) + + self.label().hide() + + def defaultData(self): + """ + Get the default values for the group field. + + :rtype: dict + """ + return { + "value": True, + "persistent": True, + "validate": False, + "persistentKey": "BaseItem", + } + + def value(self): + """ + Get the value of the Group Field + + :type: bool + """ + return self.widget().isChecked() + + def setValue(self, visible): + """ + Set the value of the Group Field + + :type visible: bool + """ + self.widget().setChecked(visible) + + isChild = False + + if self.formWidget(): + for fieldWidget in self.formWidget().fieldWidgets(): + + if fieldWidget.name() == self.name(): + isChild = True + continue + + if isChild: + + if isinstance(fieldWidget, GroupFieldWidget): + break + + fieldWidget.setCollapsed(not visible) + + if visible and fieldWidget.data().get("visible") is not None: + fieldWidget.setVisible(fieldWidget.data().get("visible")) + else: + fieldWidget.setVisible(visible) + + +class Label(QtWidgets.QLabel): + + """A custom label which supports elide right.""" + + def __init__(self, *args): + super(Label, self).__init__(*args) + self._text = '' + + def setText(self, text): + """ + Overriding this method to store the original text. + + :type text: str + """ + self._text = text + QtWidgets.QLabel.setText(self, text) + + def resizeEvent(self, event): + """Overriding this method to modify the text with elided text.""" + metrics = QtGui.QFontMetrics(self.font()) + elided = metrics.elidedText(self._text, QtCore.Qt.ElideRight, self.width()) + QtWidgets.QLabel.setText(self, elided) + + +class LabelFieldWidget(FieldWidget): + + def __init__(self, *args, **kwargs): + super(LabelFieldWidget, self).__init__(*args, **kwargs) + + widget = Label(self) + widget.setAlignment(QtCore.Qt.AlignVCenter) + widget.setTextInteractionFlags(QtCore.Qt.TextSelectableByMouse) + self.setWidget(widget) + self.setValidateEnabled(False) + + def value(self): + """ + Get the value of the label. + + :rtype: str + """ + return six.text_type(self.widget().text()) + + def setValue(self, value): + """ + Set the value of the label. + + :type value: str + """ + self.widget().setText(six.text_type(value)) + super(LabelFieldWidget, self).setValue(value) + + +class ObjectsFieldWidget(FieldWidget): + + def __init__(self, *args, **kwargs): + super(ObjectsFieldWidget, self).__init__(*args, **kwargs) + + self._value = [] + + widget = Label(self) + widget.setAlignment(QtCore.Qt.AlignVCenter) + widget.setTextInteractionFlags(QtCore.Qt.TextSelectableByMouse) + self.setWidget(widget) + + def value(self): + """ + Get the objects + + :rtype: list[str] + """ + return self._value + + def setValue(self, value): + """ + Set the objects + + :type value: list[str] + """ + if value: + count = len(value) + plural = "s" if count > 1 else "" + + msg = "{0} object{1} selected for saving" + msg = msg.format(str(count), plural) + else: + msg = "Nothing selected for saving" + + self._value = value + self.widget().setText(msg) + super(ObjectsFieldWidget, self).setValue(value) + + +class StringFieldWidget(FieldWidget): + + def __init__(self, *args, **kwargs): + super(StringFieldWidget, self).__init__(*args, **kwargs) + + widget = QtWidgets.QLineEdit(self) + widget.textChanged.connect(self.emitValueChanged) + self.setWidget(widget) + + def value(self): + """ + Get the value of the widget. + + :rtype: unicode + """ + return six.text_type(self.widget().text()) + + def setValue(self, value): + """ + Set the string value for the widget. + + :type value: unicode + """ + pos = self.widget().cursorPosition() + + self.widget().blockSignals(True) + try: + self.widget().setText(value) + finally: + self.widget().blockSignals(False) + + self.widget().setCursorPosition(pos) + + super(StringFieldWidget, self).setValue(value) + + +class PathFieldWidget(StringFieldWidget): + def __init__(self, *args, **kwargs): + super(PathFieldWidget, self).__init__(*args, **kwargs) + + def setData(self, data): + """ + Overriding this method to add a browse to folder button. + + :type data: dict + """ + if "menu" not in data: + data["menu"] = { + "callback": self.browse + } + + super(PathFieldWidget, self).setData(data) + + def browse(self): + """Open the file dialog.""" + path = self.value() + path = QtWidgets.QFileDialog.getExistingDirectory( + None, + "Browse Folder", + path + ) + if path: + self.setValue(path) + + +class TextFieldWidget(FieldWidget): + + DefaultLayout = "Vertical" + + def __init__(self, *args, **kwargs): + super(TextFieldWidget, self).__init__(*args, **kwargs) + + widget = QtWidgets.QTextEdit(self) + widget.textChanged.connect(self.emitValueChanged) + self.setWidget(widget) + + def value(self): + """ + Get the text value of the text edit. + + :rtype: unicode + """ + return six.text_type(self.widget().toPlainText()) + + def setValue(self, value): + """ + Set the text value for the text edit. + + :type value: unicode + """ + self.widget().setText(value) + super(TextFieldWidget, self).setValue(value) + + +class IntFieldWidget(FieldWidget): + + def __init__(self, *args, **kwargs): + super(IntFieldWidget, self).__init__(*args, **kwargs) + + validator = QtGui.QIntValidator(-50000000, 50000000, self) + + widget = QtWidgets.QLineEdit(self) + widget.setValidator(validator) + widget.textChanged.connect(self.emitValueChanged) + self.setWidget(widget) + + def value(self): + """ + Get the int value for the widget. + + :rtype: int + """ + value = self.widget().text() + if value.strip() == "": + value = self.default() + + if value == "-": + value = 0 + + return int(str(value)) + + def setValue(self, value): + """ + Set the int value for the widget. + + :type value: int + """ + if value == '': + value = self.default() + + self.widget().setText(str(int(value))) + + +class BoolFieldWidget(FieldWidget): + + def __init__(self, *args, **kwargs): + super(BoolFieldWidget, self).__init__(*args, **kwargs) + + widget = QtWidgets.QCheckBox(self) + widget.stateChanged.connect(self.emitValueChanged) + + self.setWidget(widget) + + def setText(self, text): + """ + Overriding this method to add support for the inline key. + + :type text: str + """ + inline = self.data().get("inline") + if inline: + self.label().setText("") + self.widget().setText(text) + else: + super(BoolFieldWidget, self).setText(text) + + def value(self): + """ + Get the value of the checkbox. + + :rtype: bool + """ + return bool(self.widget().isChecked()) + + def setValue(self, value): + """ + Set the value of the checkbox. + + :type value: bool + """ + self.widget().setChecked(value) + super(BoolFieldWidget, self).setValue(value) + + +class RangeFieldWidget(FieldWidget): + + def __init__(self, *args, **kwargs): + super(RangeFieldWidget, self).__init__(*args, **kwargs) + + widget = QtWidgets.QFrame(self) + layout = QtWidgets.QHBoxLayout() + layout.setContentsMargins(0, 0, 0, 0) + layout.setSpacing(4) + widget.setLayout(layout) + + validator = QtGui.QIntValidator(-50000000, 50000000, self) + + self._minwidget = QtWidgets.QLineEdit(self) + self._minwidget.setValidator(validator) + self._minwidget.textChanged.connect(self.emitValueChanged) + widget.layout().addWidget(self._minwidget) + + self._maxwidget = QtWidgets.QLineEdit(self) + self._maxwidget.setValidator(validator) + self._maxwidget.textChanged.connect(self.emitValueChanged) + widget.layout().addWidget(self._maxwidget) + + self.setWidget(widget) + + def value(self): + """ + Get the current range. + + :rtype: list[int] + """ + min = int(float(self._minwidget.text() or "0")) + max = int(float(self._maxwidget.text() or "0")) + + return min, max + + def setValue(self, value): + """ + Set the current range. + + :type value: list[int] + """ + minValue, maxValue = int(value[0]), int(value[1]) + + self._minwidget.setText(str(minValue)) + self._maxwidget.setText(str(maxValue)) + + super(RangeFieldWidget, self).setValue(value) + + +class StringDoubleFieldWidget(FieldWidget): + + def __init__(self, *args, **kwargs): + super(StringDoubleFieldWidget, self).__init__(*args, **kwargs) + + widget = QtWidgets.QFrame(self) + layout = QtWidgets.QHBoxLayout() + layout.setContentsMargins(0, 0, 0, 0) + layout.setSpacing(4) + widget.setLayout(layout) + + self._widget1 = QtWidgets.QLineEdit(self) + self._widget1.textChanged.connect(self.emitValueChanged) + widget.layout().addWidget(self._widget1) + + self._widget2 = QtWidgets.QLineEdit(self) + self._widget2.textChanged.connect(self.emitValueChanged) + widget.layout().addWidget(self._widget2) + + self.setWidget(widget) + + def setPlaceholder(self, value): + """ + Overriding this method to add support for passing a lists or tuple + + :type value: str or list or tuple + """ + if isinstance(value, list) or isinstance(value, tuple): + if len(value) >= 1: + self._widget1.setPlaceholderText(value[0]) + + if len(value) >= 2: + self._widget2.setPlaceholderText(value[1]) + else: + self._widget1.setPlaceholderText(str(value)) + + def value(self): + """ + Get the current string double value. + + :rtype: (str, str) + """ + value1 = self._widget1.text() or "" + value2 = self._widget2.text() or "" + + return value1, value2 + + def setValue(self, value): + """ + Set the current string double value. + + :type value: (str, str) + """ + value1, value2 = value[0], value[1] + + self._widget1.setText(str(value1)) + self._widget2.setText(str(value2)) + + super(StringDoubleFieldWidget, self).setValue(value) + + +class EnumFieldWidget(FieldWidget): + + def __init__(self, *args, **kwargs): + super(EnumFieldWidget, self).__init__(*args, **kwargs) + + widget = QtWidgets.QComboBox(self) + widget.currentIndexChanged.connect(self.emitValueChanged) + + self.setWidget(widget) + + def value(self): + """ + Get the value of the combobox. + + :rtype: unicode + """ + return six.text_type(self.widget().currentText()) + + def setState(self, state): + """ + Set the current state with support for editable. + + :type state: dict + """ + super(EnumFieldWidget, self).setState(state) + + editable = state.get('editable') + if editable is not None: + self.widget().setEditable(editable) + + def setValue(self, item): + """ + Set the current value of the combobox. + + :type item: unicode + """ + self.setCurrentText(item) + + def setCurrentText(self, text): + """ + This method supports Qt4 and Qt5 when settings the current text. + + :type text: str + """ + index = self.widget().findText(text, QtCore.Qt.MatchExactly) + if index != -1: + self.widget().setCurrentIndex(index) + else: + msg = 'Cannot set the current text to "{0}" for the field "{1}".' + msg = msg.format(text, self.name()) + logger.warning(msg) + + def setItems(self, items): + """ + Set the current items of the combobox. + + :type items: list[unicode] + """ + self.widget().clear() + self.widget().addItems(items) + + +class TagsFieldWidget(FieldWidget): + + def __init__(self, *args, **kwargs): + super(TagsFieldWidget, self).__init__(*args, **kwargs) + + widget = QtWidgets.QComboBox(self) + widget.setEditable(True) + widget.editTextChanged.connect(self.emitValueChanged) + widget.currentIndexChanged.connect(self.emitValueChanged) + + self.setWidget(widget) + + def listToString(self, data): + """ + Return a string from the given list. + + Example: + print listToString(['apple', 'pear', 'cherry']) + + # apple,pear,cherry + + :type data: list + :rtype: str + """ + # Convert all items to string and remove 'u' + data = [str(item) for item in data] + data = str(data).replace("[", "").replace("]", "") + data = data.replace("'", "").replace('"', "") + return data + + def stringToList(self, data): + """ + Return a list from the given string. + + Example: + print listToString('apple, pear, cherry') + + # ['apple', 'pear', 'cherry'] + + :type data: str + :rtype: list + """ + data = '["' + str(data) + '"]' + data = data.replace(' ', '') + data = data.replace(',', '","') + return eval(data) + + def value(self): + """ + Get the value of the combobox. + + :rtype: list[str] + """ + return self.stringToList(self.widget().currentText()) + + def setValue(self, value): + """ + Set the current value of the combobox. + + :type value: list[str] + """ + text = self.listToString(value) + self.widget().setEditText(text) + + def setItems(self, items): + """ + Set the current items of the combobox. + + :type items: list[unicode] + """ + self.widget().clear() + self.widget().addItems(items) + + +class RadioFieldWidget(FieldWidget): + + def __init__(self, *args, **kwargs): + super(RadioFieldWidget, self).__init__(*args, **kwargs) + + self._radioButtons = [] + + layout = QtWidgets.QVBoxLayout() + layout.setContentsMargins(0, 0, 0, 0) + + self._radioFrame = QtWidgets.QFrame(self) + self._radioFrame.setLayout(layout) + + self.setWidget(self._radioFrame) + + self.label().setStyleSheet("margin-top:2px;") + self.widget().setStyleSheet("margin-top:2px;") + + self.label().setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignTop) + + def value(self): + """ + Get the text of checked radio button. + + :return: str + """ + for radioButton in self._radioButtons: + if radioButton.isChecked(): + return radioButton.text() + return "" + + def setValue(self, value): + """ + Set the radio button checked with the given text. + + :type: str + """ + for radioButton in self._radioButtons: + checked = radioButton.text() == value + radioButton.setChecked(checked) + + def clear(self): + """Destroy all the radio buttons.""" + for radioButton in self._radioButtons: + radioButton.destroy() + radioButton.close() + radioButton.hide() + + def setItems(self, items): + """ + Set the items used to create the radio buttons. + + items: list[str] + """ + self.clear() + + for item in items: + widget = QtWidgets.QRadioButton(self) + widget.clicked.connect(self.emitValueChanged) + widget.setText(item) + + self._radioButtons.append(widget) + self._radioFrame.layout().addWidget(widget) + + +class ButtonGroupFieldWidget(FieldWidget): + """A simple button group field.""" + + def __init__(self, *args, **kwargs): + super(ButtonGroupFieldWidget, self).__init__(*args, **kwargs) + + self._value = "" + self._buttons = {} + + items = self.data().get('items') + + widget = QtWidgets.QFrame() + layout = QtWidgets.QHBoxLayout() + layout.setSpacing(0) + layout.setContentsMargins(0, 0, 0, 0) + widget.setLayout(layout) + + i = 0 + for item in items: + i += 1 + + button = QtWidgets.QPushButton(item, self) + button.setCheckable(True) + + callback = functools.partial(self.setValue, item) + button.clicked.connect(callback) + + self._buttons[item] = button + + if i == 1: + button.setProperty('first', True) + + if i == len(items): + button.setProperty('last', True) + + widget.layout().addWidget(button) + + self.setWidget(widget) + + def setItems(self, items): + """Overriding this method to avoid the not implemented error.""" + pass + + def setValue(self, value): + """ + Set the current value. + + :type value: str + """ + self._value = value + + self.blockSignals(True) + + for button in self._buttons.values(): + button.setChecked(False) + + if value in self._buttons: + self._buttons[value].setChecked(True) + + self.blockSignals(False) + + super(ButtonGroupFieldWidget, self).setValue(value) + + def value(self): + """ + Get the current value. + + :rtype: str + """ + return self._value + + +class SeparatorFieldWidget(FieldWidget): + + def __init__(self, *args, **kwargs): + super(SeparatorFieldWidget, self).__init__(*args, **kwargs) + + widget = QtWidgets.QLabel(self) + widget.setObjectName('widget') + widget.setSizePolicy( + QtWidgets.QSizePolicy.Expanding, + QtWidgets.QSizePolicy.Preferred + ) + + self.setWidget(widget) + + if not self.data().get("title"): + self.label().hide() + + def setValue(self, value): + """ + Set the current text of the separator. + + :type value: unicode + """ + self.widget().setText(value) + + def value(self): + """ + Get the current text of the separator. + + :rtype: unicode + """ + return self.widget().text() + + +class SliderFieldWidget(FieldWidget): + + def __init__(self, *args, **kwargs): + super(SliderFieldWidget, self).__init__(*args, **kwargs) + + widget = QtWidgets.QSlider(self) + widget.setOrientation(QtCore.Qt.Horizontal) + widget.setObjectName('widget') + widget.setSizePolicy( + QtWidgets.QSizePolicy.Expanding, + QtWidgets.QSizePolicy.Preferred + ) + widget.valueChanged.connect(self.emitValueChanged) + + self.setWidget(widget) + + def setValue(self, value): + """ + Set the current value for the slider. + + :type value: int + """ + self.widget().setValue(value) + + def value(self): + """ + Get the current value for the slider. + + :rtype: int + """ + return self.widget().value() + + +class ColorFieldWidget(FieldWidget): + + def __init__(self, *args, **kwargs): + super(ColorFieldWidget, self).__init__(*args, **kwargs) + + self._value = "rgb(100,100,100)" + + widget = colorpicker.ColorPickerWidget() + widget.setObjectName('widget') + widget.setSizePolicy( + QtWidgets.QSizePolicy.Expanding, + QtWidgets.QSizePolicy.Preferred + ) + widget.colorChanged.connect(self._colorChanged) + self.setWidget(widget) + + def setData(self, data): + """ + Overriding this method to add support for a "colors" key. + + :type data: dict + """ + colors = data.get("colors") + if colors: + self.widget().setColors(colors) + + super(ColorFieldWidget, self).setData(data) + + def _colorChanged(self, color): + """ + Triggered when the color changes from the color browser. + + :type color: QtGui.QColor + """ + if isinstance(color, QtGui.QColor): + color = studioqt.Color(color).toString() + + self.setValue(color) + self.emitValueChanged() + + def setItems(self, items): + self.widget().setColors(items) + + def setValue(self, value): + """ + Set the current value for the slider. + + :type value: str + """ + self.widget().setCurrentColor(value) + + def value(self): + """ + Get the current value for the slider. + + :rtype: str + """ + return self.widget().currentColor() + + +class IconPickerFieldWidget(FieldWidget): + + def __init__(self, *args, **kwargs): + super(IconPickerFieldWidget, self).__init__(*args, **kwargs) + + widget = iconpicker.IconPickerWidget(self) + widget.setObjectName('widget') + widget.setSizePolicy( + QtWidgets.QSizePolicy.Expanding, + QtWidgets.QSizePolicy.Preferred + ) + widget.iconChanged.connect(self._iconChanged) + self.setWidget(widget) + + def _iconChanged(self, icon): + """ + Triggered when the color changes from the color browser. + + :type icon: QtGui.QColor + """ + self.setValue(icon) + self.emitValueChanged() + + def setValue(self, value): + """ + Set the current value for the slider. + + :type value: str + """ + self.widget().setCurrentIcon(value) + + def setItems(self, items): + """ + Set the icons to be displayed in the picker. + + :type items: str + """ + self.widget().setIcons(items) + self.widget().menuButton().setVisible(False) + + def value(self): + """ + Get the current value for the slider. + + :rtype: str + """ + return self.widget().currentIcon() + + +class ImageFieldWidget(FieldWidget): + + def __init__(self, *args, **kwargs): + super(ImageFieldWidget, self).__init__(*args, **kwargs) + + self._value = "" + self._pixmap = None + + widget = QtWidgets.QLabel(self) + self.setStyleSheet("min-height: 32px;") + widget.setScaledContents(False) + widget.setObjectName('widget') + widget.setAlignment(QtCore.Qt.AlignHCenter) + + self.setWidget(widget) + self.layout().addStretch() + + def setValue(self, value): + """ + Set the path on disc for the image. + + :type value: str + """ + self._value = value + self._pixmap = QtGui.QPixmap(value) + self.update() + + def value(self): + """ + Get the path on disc for the image. + + :rtype: str + """ + return self._value + + def resizeEvent(self, event): + """ + Called when the field widget is resizing. + + :type event: QtCore.QEvent + """ + self.update() + + def update(self): + """Update the image depending on the size.""" + if self._pixmap: + width = self.widget().height() + transformation = QtCore.Qt.SmoothTransformation + + if self.widget().width() > self.widget().height(): + pixmap = self._pixmap.scaledToWidth(width, transformation) + else: + pixmap = self._pixmap.scaledToHeight(width, transformation) + + self.widget().setPixmap(pixmap) + self.widget().setAlignment(QtCore.Qt.AlignLeft) diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/filterbymenu.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/filterbymenu.py new file mode 100644 index 0000000..49f1202 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/filterbymenu.py @@ -0,0 +1,310 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +from functools import partial + +from studiovendor.Qt import QtGui +from studiovendor.Qt import QtCore +from studiovendor.Qt import QtWidgets + +import studioqt + +from .separatoraction import SeparatorAction + + +NEW_STYLE = True + + +class LabelAction(QtWidgets.QWidgetAction): + + def _triggered(self, checked=None): + """Triggered when the checkbox value has changed.""" + self.triggered.emit() + self.parent().close() + + def createWidget(self, menu): + """ + This method is called by the QWidgetAction base class. + + :type menu: QtWidgets.QMenu + """ + widget = QtWidgets.QFrame(self.parent()) + widget.setObjectName("filterByAction") + + title = self._name + + # Using a checkbox so that the text aligns with the other actions + label = QtWidgets.QCheckBox(widget) + label.setText(title) + label.setAttribute(QtCore.Qt.WA_TransparentForMouseEvents) + label.toggled.connect(self._triggered) + label.setStyleSheet(""" +#QCheckBox::indicator:checked { + image: url(none.png) +} +QCheckBox::indicator:unchecked { + image: url(none.png) +} +""") + actionLayout = QtWidgets.QHBoxLayout() + actionLayout.setContentsMargins(0, 0, 0, 0) + actionLayout.addWidget(label, stretch=1) + widget.setLayout(actionLayout) + + return widget + + +class FilterByAction(QtWidgets.QWidgetAction): + + def __init__(self, parent=None): + """ + :type parent: QtWidgets.QMenu + """ + QtWidgets.QWidgetAction.__init__(self, parent) + + self._facet = None + self._checked = False + + def setChecked(self, checked): + self._checked = checked + + def setFacet(self, facet): + self._facet = facet + + def _triggered(self, checked=None): + """Triggered when the checkbox value has changed.""" + self.triggered.emit() + self.parent().close() + + def createWidget(self, menu): + """ + This method is called by the QWidgetAction base class. + + :type menu: QtWidgets.QMenu + """ + widget = QtWidgets.QFrame(self.parent()) + widget.setObjectName("filterByAction") + + facet = self._facet + + name = facet.get("name") or "" + count = str(facet.get("count", 0)) + + title = name.replace(".", "").title() + + label = QtWidgets.QCheckBox(widget) + label.setAttribute(QtCore.Qt.WA_TransparentForMouseEvents) + label.setText(title) + label.installEventFilter(self) + label.toggled.connect(self._triggered) + label.setChecked(self._checked) + + label2 = QtWidgets.QLabel(widget) + label2.setObjectName("actionCounter") + label2.setText(count) + + layout = QtWidgets.QHBoxLayout() + layout.setSpacing(0) + layout.setContentsMargins(0, 0, 0, 0) + layout.addWidget(label, stretch=1) + layout.addWidget(label2) + widget.setLayout(layout) + + return widget + + +class FilterByMenu(QtWidgets.QMenu): + + def __init__(self, *args, **kwargs): + super(FilterByMenu, self).__init__(*args, **kwargs) + + self._facets = [] + self._dataset = None + self._options = {"field": "type"} + self._settings = {} + + def name(self): + """ + The name of the filter used by the dataset. + + :rtype: str + """ + return self._options.get("field") + "FilterMenu" + + def _actionChecked(self, name, checked): + """ + Triggered when an action has been clicked. + + :type name: str + :type checked: bool + """ + if studioqt.isControlModifier(): + self.setAllEnabled(False) + self._settings[name] = True + else: + self._settings[name] = checked + + self.dataset().search() + + def _showAllClicked(self): + """Triggered when the user clicks the show all action.""" + self.setAllEnabled(True) + self.dataset().search() + + def setAllEnabled(self, enabled): + """ + Set all the filters enabled. + + :type enabled: bool + """ + for facet in self._facets: + self._settings[facet.get("name")] = enabled + + def isShowAllEnabled(self): + """ + Check if all the current filters are enabled. + + :rtype: bool + """ + for facet in self._facets: + if not self._settings.get(facet.get("name"), True): + return False + return True + + def isActive(self): + """ + Check if there are any filters currently active using the settings. + + :rtype: bool + """ + settings = self.settings() + for name in settings: + if not settings.get(name): + return True + return False + + def setOptions(self, options): + """ + Set the options to be used by the filters menu. + + :type options: dict + """ + self._options = options + + def dataset(self): + """ + Get the dataset model for the menu. + + :rtype: studiolibrary.Dataset + """ + return self._dataset + + def settings(self): + """ + Get the settings for the filter menu. + + :rtype: dict + """ + return self._settings + + def setSettings(self, settings): + """ + Set the settings filter menu. + + :type settings: dict + """ + self._settings = settings + + def setDataset(self, dataset): + """ + Set the dataset model for the menu: + + :type dataset: studiolibrary.Dataset + """ + self._dataset = dataset + dataset.searchStarted.connect(self.searchInit) + + def searchInit(self): + """Triggered before each search to update the filter menu query.""" + filters = [] + + settings = self.settings() + field = self._options.get("field") + + for name in settings: + checked = settings.get(name, True) + if not checked: + filters.append((field, "not", name)) + + query = { + "name": self.name(), + "operator": "and", + "filters": filters + } + + self.dataset().addQuery(query) + + def show(self, point=None): + """ + Show the menu options. + + :type point: QtGui.QPoint or None + """ + self.clear() + + field = self._options.get("field") + queries = self.dataset().queries(exclude=self.name()) + + self._facets = self.dataset().distinct(field, queries=queries) + + action = SeparatorAction("Show " + field.title(), self) + self.addAction(action) + + if NEW_STYLE: + action = LabelAction(self) + action._name = "Show All" + self.addAction(action) + else: + action = self.addAction("Show All") + + action.setEnabled(not self.isShowAllEnabled()) + callback = partial(self._showAllClicked) + action.triggered.connect(callback) + + self.addSeparator() + + for facet in self._facets: + + name = facet.get("name") or "" + count = facet.get("count", 0) + checked = self.settings().get(name, True) + + title = "{name}\t({count})" + title = title.format(name=name.replace(".", "").title(), count=count) + + if NEW_STYLE: + action = FilterByAction(self) + action.setFacet(facet) + action.setChecked(checked) + self.addAction(action) + else: + action = self.addAction(title) + action.setCheckable(True) + action.setChecked(checked) + + callback = partial(self._actionChecked, name, not checked) + action.triggered.connect(callback) + + if not point: + point = QtGui.QCursor.pos() + + self.exec_(point) diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/formwidget.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/formwidget.py new file mode 100644 index 0000000..11f28b0 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/formwidget.py @@ -0,0 +1,785 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +import re +import logging +import functools + +from studiovendor.Qt import QtGui, QtCore, QtWidgets + +from . import settings +from . import fieldwidgets + + +__all__ = [ + "FormWidget", + "FormDialog", + "FIELD_WIDGET_REGISTRY" +] + + +logger = logging.getLogger(__name__) + + +FIELD_WIDGET_REGISTRY = { + "int": fieldwidgets.IntFieldWidget, + "bool": fieldwidgets.BoolFieldWidget, + "enum": fieldwidgets.EnumFieldWidget, + "text": fieldwidgets.TextFieldWidget, + "path": fieldwidgets.PathFieldWidget, + "tags": fieldwidgets.TagsFieldWidget, + "image": fieldwidgets.ImageFieldWidget, + "label": fieldwidgets.LabelFieldWidget, + "range": fieldwidgets.RangeFieldWidget, + "color": fieldwidgets.ColorFieldWidget, + "group": fieldwidgets.GroupFieldWidget, + "string": fieldwidgets.StringFieldWidget, + "radio": fieldwidgets.RadioFieldWidget, + "stringDouble": fieldwidgets.StringDoubleFieldWidget, + "slider": fieldwidgets.SliderFieldWidget, + "objects": fieldwidgets.ObjectsFieldWidget, + "separator": fieldwidgets.SeparatorFieldWidget, + "iconPicker": fieldwidgets.IconPickerFieldWidget, + "buttonGroup": fieldwidgets.ButtonGroupFieldWidget, +} + + +def toTitle(name): + """Convert camel case strings to title strings""" + s1 = re.sub("(.)([A-Z][a-z]+)", r"\1 \2", name) + return re.sub("([a-z0-9])([A-Z])", r"\1 \2", s1).title() + + +class FormWidget(QtWidgets.QFrame): + + accepted = QtCore.Signal(object) + stateChanged = QtCore.Signal() + validated = QtCore.Signal() + + def __init__(self, *args, **kwargs): + super(FormWidget, self).__init__(*args, **kwargs) + + self._schema = [] + self._widgets = [] + self._validator = None + self._validatorEnabled = True + + layout = QtWidgets.QVBoxLayout() + layout.setContentsMargins(0, 0, 0, 0) + layout.setSpacing(0) + + self.setLayout(layout) + + self._fieldsFrame = QtWidgets.QFrame(self) + self._fieldsFrame.setObjectName("optionsFrame") + + layout = QtWidgets.QVBoxLayout() + layout.setContentsMargins(0, 0, 0, 0) + layout.setSpacing(0) + + self._fieldsFrame.setLayout(layout) + + self._titleWidget = QtWidgets.QPushButton(self) + self._titleWidget.setCheckable(True) + self._titleWidget.setObjectName("titleWidget") + self._titleWidget.toggled.connect(self._titleClicked) + self._titleWidget.hide() + + self.layout().addWidget(self._titleWidget) + self.layout().addWidget(self._fieldsFrame) + + def _titleClicked(self, toggle): + """Triggered when the user clicks the title widget.""" + self.setExpanded(toggle) + self.stateChanged.emit() + + def titleWidget(self): + """ + Get the title widget. + + :rtype: QWidget + """ + return self._titleWidget + + def setTitle(self, title): + """ + Set the text for the title widget. + + :type title: str + """ + self.titleWidget().setText(title) + + def setExpanded(self, expand): + """ + Expands the options if expand is true, otherwise collapses the options. + + :type expand: bool + """ + self._titleWidget.blockSignals(True) + + try: + self._titleWidget.setChecked(expand) + self._fieldsFrame.setVisible(expand) + finally: + self._titleWidget.blockSignals(False) + + def isExpanded(self): + """ + Returns true if the item is expanded, otherwise returns false. + + :rtype: bool + """ + return self._titleWidget.isChecked() + + def setTitleVisible(self, visible): + """ + A convenience method for setting the title visible. + + :type visible: bool + """ + self.titleWidget().setVisible(visible) + + def reset(self): + """Reset all option widgets back to their default value.""" + for widget in self._widgets: + widget.reset() + self.validate() + + def savePersistentValues(self): + """ + Triggered when the user changes the options. + """ + data = {} + + for widget in self._widgets: + name = widget.data().get("name") + if name and widget.data().get("persistent"): + + key = self.objectName() or "FormWidget" + key = widget.data().get("persistentKey", key) + + data.setdefault(key, {}) + data[key][name] = widget.value() + + for key in data: + settings.set(key, data[key]) + + def loadPersistentValues(self): + """ + Get the options from the user settings. + + :rtype: dict + """ + values = {} + defaultValues = self.defaultValues() + + for field in self.schema(): + name = field.get("name") + persistent = field.get("persistent") + + if persistent: + key = self.objectName() or "FormWidget" + key = field.get("persistentKey", key) + value = settings.get(key, {}).get(name) + else: + value = defaultValues.get(name) + + if value is not None: + values[name] = value + + self.setValues(values) + + def schema(self): + """ + Get the schema for the form. + + :rtype: dict + """ + return self._schema + + def _sortSchema(self, schema): + """ + Sort the schema depending on the group order. + + :type schema: list[dict] + :rtype: list[dict] + """ + order = 0 + + for i, field in enumerate(schema): + if field.get("type") == "group": + order = field.get("order", order) + field["order"] = order + + def _key(field): + return field["order"] + + return sorted(schema, key=_key) + + def setSchema(self, schema, layout=None, errorsVisible=False): + """ + Set the schema for the widget. + + :type schema: list[dict] + :type layout: None or str + :type errorsVisible: bool + """ + self._schema = self._sortSchema(schema) + + for field in self._schema: + + cls = FIELD_WIDGET_REGISTRY.get(field.get("type", "label")) + + if not cls: + logger.warning("Cannot find widget for %s", field) + continue + + if layout and not field.get("layout"): + field["layout"] = layout + + errorVisible = field.get("errorVisible") + if errorVisible is not None: + field["errorVisible"] = errorVisible + else: + field["errorVisible"] = errorsVisible + + widget = cls(data=field, parent=self._fieldsFrame, formWidget=self) + + data_ = widget.defaultData() + data_.update(field) + + widget.setData(data_) + + value = field.get("value") + default = field.get("default") + if value is None and default is not None: + widget.setValue(default) + + self._widgets.append(widget) + + callback = functools.partial(self._fieldChanged, widget) + widget.valueChanged.connect(callback) + + self._fieldsFrame.layout().addWidget(widget) + + self.loadPersistentValues() + + def _fieldChanged(self, widget): + """ + Triggered when the given option widget changes value. + + :type widget: FieldWidget + """ + self.validate(widget=widget) + + def accept(self): + """Accept the current options""" + self.emitAcceptedCallback() + self.savePersistentValues() + + def closeEvent(self, event): + """Called when the widget is closed.""" + self.savePersistentValues() + super(FormWidget, self).closeEvent(event) + + def errors(self): + """ + Get all the errors. + + :rtype: list[str] + """ + errors = [] + for widget in self._widgets: + error = widget.data().get("error") + if error: + errors.append(error) + return errors + + def hasErrors(self): + """ + Return True if the form contains any errors. + + :rtype: bool + """ + return bool(self.errors()) + + def setValidatorEnabled(self, enabled): + self._validatorEnabled = enabled + + def setValidator(self, validator): + """ + Set the validator for the options. + + :type validator: func + """ + self._validator = validator + + def validator(self): + """ + Return the validator for the form. + + :rtype: func + """ + return self._validator + + def validate(self, widget=None): + """Validate the current options using the validator.""" + + if self._validator and self._validatorEnabled: + + logger.debug("Running validator: form.validate(widget=%s)", widget) + + values = {} + + for name, value in self.values().items(): + data = self.widget(name).data() + if data.get("validate", True): + values[name] = value + + if widget: + values["fieldChanged"] = widget.name() + + fields = self._validator(**values) + if fields is not None: + self._setState(fields) + + self.validated.emit() + + else: + logger.debug("No validator set.") + + def setData(self, name, data): + """ + Set the data for the given field name. + + :type name: str + :type data: dict + """ + widget = self.widget(name) + widget.setData(data) + + def setValue(self, name, value): + """ + Set the value for the given field name and value + + :type name: str + :type value: object + """ + widget = self.widget(name) + widget.setValue(value) + + def value(self, name): + """ + Get the value for the given widget name. + + :type name: str + :rtype: object + """ + widget = self.widget(name) + return widget.value() + + def widget(self, name): + """ + Get the widget for the given widget name. + + :type name: str + :rtype: FieldWidget + """ + for widget in self._widgets: + if widget.data().get("name") == name: + return widget + + def fields(self): + """ + Get all the field data for the form. + + :rtype: dict + """ + fields = [] + for widget in self._widgets: + fields.append(widget.data()) + return fields + + def fieldWidgets(self): + """ + Get all the field widgets. + + :rtype: list[FieldWidget] + """ + return self._widgets + + def setValues(self, values): + """ + Set the field values for the current form. + + :type values: dict + """ + state = [] + for name in values: + state.append({"name": name, "value": values[name]}) + self._setState(state) + + def values(self): + """ + Get the all the field values indexed by the field name. + + :rtype: dict + """ + values = {} + for widget in self._widgets: + name = widget.data().get("name") + if name and widget.validateEnabled(): + values[name] = widget.value() + return values + + def defaultValues(self): + """ + Get the all the default field values indexed by the field name. + + :rtype: dict + """ + values = {} + for widget in self._widgets: + name = widget.data().get("name") + if name: + values[name] = widget.default() + return values + + def state(self): + """ + Get the current state. + + :rtype: dict + """ + fields = [] + + for widget in self._widgets: + fields.append(widget.state()) + + state = { + "fields": fields, + "expanded": self.isExpanded() + } + + return state + + def setState(self, state): + """ + Set the current state. + + :type state: dict + """ + expanded = state.get("expanded") + if expanded is not None: + self.setExpanded(expanded) + + fields = state.get("fields") + if fields is not None: + self._setState(fields) + + self.validate() + + def _setState(self, fields): + """ + Set the state while blocking all signals. + + :type fields: list[dict] + """ + for widget in self._widgets: + widget.blockSignals(True) + + for widget in self._widgets: + widget.setError("") + for field in fields: + if field.get("name") == widget.data().get("name"): + widget.setData(field) + + for widget in self._widgets: + widget.blockSignals(False) + + self.stateChanged.emit() + + +class FormDialog(QtWidgets.QFrame): + + accepted = QtCore.Signal(object) + rejected = QtCore.Signal(object) + + def __init__(self, parent=None, form=None): + super(FormDialog, self).__init__(parent) + + layout = QtWidgets.QVBoxLayout() + layout.setContentsMargins(0, 0, 0, 0) + layout.setSpacing(0) + + self.setLayout(layout) + + self._widgets = [] + self._validator = None + + self._title = QtWidgets.QLabel(self) + self._title.setObjectName('title') + self._title.setText('FORM') + self.layout().addWidget(self._title) + + self._description = QtWidgets.QLabel(self) + self._description.setObjectName('description') + self.layout().addWidget(self._description) + + self._formWidget = FormWidget(self) + self._formWidget.setObjectName("formWidget") + self._formWidget.validated.connect(self._validated) + self.layout().addWidget(self._formWidget) + + self.layout().addStretch(1) + + buttonLayout = QtWidgets.QHBoxLayout() + buttonLayout.setContentsMargins(0, 0, 0, 0) + buttonLayout.setSpacing(0) + + self.layout().addLayout(buttonLayout) + + buttonLayout.addStretch(1) + + self._acceptButton = QtWidgets.QPushButton(self) + self._acceptButton.setObjectName('acceptButton') + self._acceptButton.setText('Submit') + self._acceptButton.clicked.connect(self.accept) + + self._rejectButton = QtWidgets.QPushButton(self) + self._rejectButton.setObjectName('rejectButton') + self._rejectButton.setText('Cancel') + self._rejectButton.clicked.connect(self.reject) + + buttonLayout.addWidget(self._acceptButton) + buttonLayout.addWidget(self._rejectButton) + + if form: + self.setSettings(form) + # buttonLayout.addStretch(1) + + def _validated(self): + """Triggered when the form has been validated""" + self._acceptButton.setEnabled(not self._formWidget.hasErrors()) + + def acceptButton(self): + """ + Return the accept button. + + :rtype: QWidgets.QPushButton + """ + return self._acceptButton + + def rejectButton(self): + """ + Return the reject button. + + :rtype: QWidgets.QPushButton + """ + return self._rejectButton + + def validateAccepted(self, **kwargs): + """ + Triggered when the accept button has been clicked. + + :type kwargs: The values of the fields + """ + self._formWidget.validator()(**kwargs) + + def validateRejected(self, **kwargs): + """ + Triggered when the reject button has been clicked. + + :type kwargs: The default values of the fields + """ + self._formWidget.validator()(**kwargs) + + def setSettings(self, settings): + + self._settings = settings + + title = settings.get("title") + if title is not None: + self._title.setText(title) + + callback = settings.get("accepted") + if not callback: + self._settings["accepted"] = self.validateAccepted + + callback = settings.get("rejected") + if not callback: + self._settings["rejected"] = self.validateRejected + + description = settings.get("description") + if description is not None: + self._description.setText(description) + + validator = settings.get("validator") + if validator is not None: + self._formWidget.setValidator(validator) + + layout = settings.get("layout") + + schema = settings.get("schema") + if schema is not None: + self._formWidget.setSchema(schema, layout=layout) + + def accept(self): + """Call this method to accept the dialog.""" + callback = self._settings.get("accepted") + if callback: + callback(**self._formWidget.values()) + self.close() + + def reject(self): + """Call this method to rejected the dialog.""" + callback = self._settings.get("rejected") + if callback: + callback(**self._formWidget.defaultValues()) + self.close() + + +STYLE = """ + +FormWidget QWidget { + /*font-size: 12px;*/ + text-align: left; +} + +FieldWidget { + min-height: 16px; + margin-bottom: 3px; +} + +FieldWidget[layout=vertical] #label { + margin-bottom: 4px; +} + +FieldWidget[layout=horizontal] #label { + margin-left: 4px; +} + +FieldWidget #menuButton { + margin-left: 4px; + border-radius: 2px; + min-width: 25px; + max-height: 25px; + text-align: center; + background-color: rgba(0,0,0,20); +} + +FieldWidget #label { + min-width: 72px; + color: rgba(FOREGROUND_COLOR_R, FOREGROUND_COLOR_G, FOREGROUND_COLOR_B, 100); +} + +FormWidget #titleWidget { + font-size: 12px; + padding: 2px; + padding-left: 5px; + background-color: rgba(255, 255, 255, 20); + border-bottom: 0px solid rgba(255, 255, 255, 20); +} + +FormWidget #titleWidget:checked { + background-color: rgba(255, 255, 255, 5); +} + +FormWidget #optionsFrame { + margin: 2px; +} + +FieldWidget QComboBox { + border: 1px solid transparent; +} +""" + + +def example(): + """ + import studiolibrary + studiolibrary.reload() + + import studiolibrary + studiolibrary.widgets.formwidget.example() + """ + import studiolibrary + image = studiolibrary.resource.get("icons", "icon.png") + + schema = [ + { + "name": "name", + "value": "Face.anim", + "type": "string", + }, + { + "name": "objects", + "value": "125 objects", + "type": "label", + }, + { + "name": "sep1", + "type": "separator", + }, + { + "name": "color", + "type": "color", + }, + { + "name": "blend", + "type": "slider", + }, + { + "name": "Bake", + "type": "bool", + }, + { + "name": "image", + "type": "image", + "value": image + }, + { + "name": "frameRange", + "type": "range" + }, + { + "name": "option", + "type": "enum", + "items": ["Test1", "Test2", "Test4"] + }, + { + "name": "comment", + "value": "this is a comment", + "type": "text", + "layout": "vertical" + }, + ] + + def validator(**fields): + print(fields) + + w = FormWidget() + w.setValidator(validator) + w.setSchema(schema) + w.setStyleSheet(STYLE) + w.show() + + return w + + +if __name__ == "__main__": + import studioqt + with studioqt.app(): + w = example() + + + diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/groupboxwidget.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/groupboxwidget.py new file mode 100644 index 0000000..179c703 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/groupboxwidget.py @@ -0,0 +1,150 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +import logging + +from studiovendor.Qt import QtCore +from studiovendor.Qt import QtWidgets + +from . import settings + +import studioqt +import studiolibrary + + +logger = logging.getLogger(__name__) + + +class GroupBoxWidget(QtWidgets.QFrame): + + toggled = QtCore.Signal(bool) + + def __init__(self, title, widget, persistent=False, *args, **kwargs): + super(GroupBoxWidget, self).__init__(*args, **kwargs) + + self._widget = None + self._persistent = None + + layout = QtWidgets.QVBoxLayout() + layout.setContentsMargins(0, 0, 0, 0) + layout.setSpacing(0) + + self.setLayout(layout) + + self._titleWidget = QtWidgets.QPushButton(self) + self._titleWidget.setCheckable(True) + self._titleWidget.setText(title) + self._titleWidget.setObjectName("title") + self._titleWidget.toggled.connect(self._toggled) + + on_path = studiolibrary.resource.get("icons", "caret-down.svg") + off_path = studiolibrary.resource.get("icons", "caret-right.svg") + icon = studioqt.Icon.fa(on_path, color="rgba(255,255,255,200)", off=off_path) + self._titleWidget.setIcon(icon) + + self.layout().addWidget(self._titleWidget) + + self._widgetFrame = QtWidgets.QFrame(self) + self._widgetFrame.setObjectName("frame") + + layout = QtWidgets.QVBoxLayout() + layout.setContentsMargins(0, 0, 0, 0) + layout.setSpacing(0) + + self._widgetFrame.setLayout(layout) + + self.layout().addWidget(self._widgetFrame) + + if widget: + self.setWidget(widget) + + self.setPersistent(persistent) + + def setPersistent(self, persistent): + """ + Save and load the state of the widget to disk. + + :type persistent: bool + """ + self._persistent = persistent + self.loadSettings() + + def title(self): + """ + Get the title for the group box. + + :rtype: str + """ + return self._titleWidget.text() + + def setWidget(self, widget): + """ + Set the widget to hide when the user clicks the title. + + :type widget: QWidgets.QWidget + """ + self._widget = widget + # self._widget.setParent(self._widgetFrame) + # self._widgetFrame.layout().addWidget(self._widget) + + def _toggled(self, visible): + """ + Triggered when the user clicks the title. + + :type visible: bool + """ + self.saveSettings() + self.setChecked(visible) + self.toggled.emit(visible) + + def isChecked(self): + """ + Check the checked state for the group box. + + :rtype: bool + """ + return self._titleWidget.isChecked() + + def setChecked(self, checked): + """ + Overriding this method to hide the widget when the state changes. + + :type checked: bool + """ + self._titleWidget.setChecked(checked) + if self._widget: + self._widget.setVisible(checked) + + def saveSettings(self): + """Save the state to disc.""" + if self._persistent: + + if not self.objectName(): + raise NameError("No object name set for persistent widget.") + + data = {self.objectName(): {"checked": self.isChecked()}} + settings.save(data) + + def loadSettings(self): + """Load the state to disc.""" + if self._persistent: + + if not self.objectName(): + raise NameError("No object name set for persistent widget.") + + data = settings.read() + data = data.get(self.objectName(), {}) + + if isinstance(data, dict): + checked = data.get("checked", True) + self.setChecked(checked) + diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/groupbymenu.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/groupbymenu.py new file mode 100644 index 0000000..4f52c78 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/groupbymenu.py @@ -0,0 +1,121 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +from functools import partial + +from studiovendor.Qt import QtGui +from studiovendor.Qt import QtWidgets + +from .separatoraction import SeparatorAction + + +class GroupByMenu(QtWidgets.QMenu): + + def __init__(self, name, parent, dataset): + super(GroupByMenu, self).__init__(name, parent) + + self._dataset = dataset + self.aboutToShow.connect(self.populateMenu) + + def setDataset(self, dataset): + """ + Set the dataset model for the menu: + + :type dataset: studiolibrary.Dataset + """ + self._dataset = dataset + + def dataset(self): + """ + Get the dataset model for the menu. + + :rtype: studiolibrary.Dataset + """ + return self._dataset + + def setGroupBy(self, groupName, groupOrder): + """ + Set the group by value for the dataset. + + :type groupName: str + :type groupOrder: str + """ + if groupName: + value = [groupName + ":" + groupOrder] + else: + value = None + + self.dataset().setGroupBy(value) + self.dataset().search() + + def populateMenu(self): + """ + Show the menu options. + """ + self.clear() + + groupBy = self.dataset().groupBy() + if groupBy: + currentField = groupBy[0].split(":")[0] + currentOrder = "dsc" if "dsc" in groupBy[0] else "asc" + else: + currentField = "" + currentOrder = "" + + action = SeparatorAction("Group By", self) + self.addAction(action) + + action = self.addAction("None") + action.setCheckable(True) + + if not currentField: + action.setChecked(True) + + callback = partial(self.setGroupBy, None, None) + action.triggered.connect(callback) + + fields = self.dataset().fields() + + for field in fields: + + if not field.get("groupable"): + continue + + name = field.get("name") + + action = self.addAction(name.title()) + action.setCheckable(True) + + if currentField == name: + action.setChecked(True) + else: + action.setChecked(False) + + callback = partial(self.setGroupBy, name, currentOrder) + action.triggered.connect(callback) + + action = SeparatorAction("Group Order", self) + self.addAction(action) + + action = self.addAction("Ascending") + action.setCheckable(True) + action.setChecked(currentOrder == "asc") + + callback = partial(self.setGroupBy, currentField, "asc") + action.triggered.connect(callback) + + action = self.addAction("Descending") + action.setCheckable(True) + action.setChecked(currentOrder == "dsc") + + callback = partial(self.setGroupBy, currentField, "dsc") + action.triggered.connect(callback) diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/iconpicker.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/iconpicker.py new file mode 100644 index 0000000..fa0f54a --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/iconpicker.py @@ -0,0 +1,324 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +from functools import partial + +from studiovendor.Qt import QtCore +from studiovendor.Qt import QtWidgets + +import studioqt + +from studiolibrary import resource + + +class IconButton(QtWidgets.QToolButton): + + def __init__(self, *args): + super(IconButton, self).__init__(*args) + + self.setObjectName('iconButton') + + self._iconPath = None + + self.setCheckable(True) + self.setCursor(QtCore.Qt.PointingHandCursor) + + def setIconPath(self, path): + """ + Set the path for the button. + + :type path: str + """ + self._iconPath = path + self.updateIcon() + + def updateIcon(self): + + self.setToolTip(self._iconPath) + self.setStatusTip(self._iconPath) + + color = self.palette().color(self.foregroundRole()) + color = studioqt.Color.fromColor(color) + + icon = resource.icon(self._iconPath, color=color) + self.setIcon(icon) + + def iconPath(self): + """ + Get the color for the button. + + :rtype: str + """ + return self._iconPath + + +class IconPickerAction(QtWidgets.QWidgetAction): + + def __init__(self, *args): + super(IconPickerAction, self).__init__(*args) + + self._picker = IconPickerWidget() + self._picker.setMouseTracking(True) + self._picker.setObjectName("iconPickerAction") + self._picker.iconChanged.connect(self._triggered) + + def picker(self): + """ + Get the picker widget instance. + + :rtype: IconPickerWidget + """ + return self._picker + + def _triggered(self): + """Triggered when the checkbox value has changed.""" + self.trigger() + + if isinstance(self.parent().parent(), QtWidgets.QMenu): + self.parent().parent().close() + + elif isinstance(self.parent(), QtWidgets.QMenu): + self.parent().close() + + def createWidget(self, menu): + """ + This method is called by the QWidgetAction base class. + + :type menu: QtWidgets.QMenu + """ + widget = QtWidgets.QFrame(menu) + widget.setObjectName("iconPickerAction") + + self.picker().setParent(widget) + + actionLayout = QtWidgets.QHBoxLayout() + actionLayout.setContentsMargins(0, 0, 0, 0) + actionLayout.addWidget(self.picker(), stretch=1) + widget.setLayout(actionLayout) + + return widget + + +class IconPickerWidget(QtWidgets.QFrame): + + BUTTON_CLASS = IconButton + + iconChanged = QtCore.Signal(object) + + def __init__(self, *args): + QtWidgets.QFrame.__init__(self, *args) + + self._buttons = [] + self._currentIcon = None + self._menuButton = None + + layout = QtWidgets.QGridLayout() + layout.setSpacing(0) + layout.setContentsMargins(0, 0, 0, 0) + self.setLayout(layout) + + def enterEvent(self, event): + """ + Overriding this method to fix a bug with custom actions. + + :type event: QtCore.QEvent + """ + if self.parent(): + menu = self.parent().parent() + if isinstance(menu, QtWidgets.QMenu): + menu.setActiveAction(None) + + def _iconChanged(self, iconPath): + """ + Triggered when the user clicks or browses for a color. + + :type iconPath: str + :rtype: None + """ + self.setCurrentIcon(iconPath) + self.iconChanged.emit(iconPath) + + def menuButton(self): + """ + Get the menu button used for browsing for custom colors. + + :rtype: QtGui.QWidget + """ + return self._menuButton + + def deleteButtons(self): + """ + Delete all the color buttons. + + :rtype: None + """ + layout = self.layout() + while layout.count(): + item = layout.takeAt(0) + item.widget().deleteLater() + + def currentIcon(self): + """ + Return the current color. + + :rtype: studioqt.Color + """ + return self._currentIcon + + def setCurrentIcon(self, color): + """ + Set the current color. + + :type color: studioqt.Color + """ + self._currentIcon = color + self.refresh() + + def refresh(self): + """Update the current state of the selected color.""" + for button in self._buttons: + button.setChecked(button.iconPath() == self.currentIcon()) + + def updateTheme(self): + for button in self._buttons: + button.updateIcon() + + def setIcons(self, icons): + """ + Set the colors for the color bar. + + :type icons: list[str] or list[studioqt.Icon] + """ + self.deleteButtons() + + i = 0 + first = True + last = False + + positions = [(i, j) for i in range(5) for j in range(5)] + for position, iconPath in zip(positions, icons): + i += 1 + + if i == len(icons) - 1: + last = True + + callback = partial(self._iconChanged, iconPath) + + button = self.BUTTON_CLASS(self) + button.setIconPath(iconPath) + # button.setIconSize(QtCore.QSize(16, 16)) + + button.setSizePolicy( + QtWidgets.QSizePolicy.Expanding, + QtWidgets.QSizePolicy.Preferred + ) + + button.setProperty("first", first) + button.setProperty("last", last) + + button.clicked.connect(callback) + + self.layout().addWidget(button, *position) + + self._buttons.append(button) + + first = False + + self._menuButton = QtWidgets.QPushButton("...", self) + self._menuButton.setObjectName('menuButton') + self._menuButton.setSizePolicy( + QtWidgets.QSizePolicy.Expanding, + QtWidgets.QSizePolicy.Preferred + ) + + self._menuButton.clicked.connect(self.browseColor) + self.layout().addWidget(self._menuButton) + + self.refresh() + self.updateTheme() + + @QtCore.Slot() + def blankSlot(self): + """Blank slot to fix an issue with PySide2.QColorDialog.open()""" + pass + + def browseColor(self): + """ + Show the color dialog. + + :rtype: None + """ + pass + # color = self.currentColor() + # if color: + # color = studioqt.Color.fromString(color) + # + # d = QtWidgets.QColorDialog(self) + # d.setCurrentColor(color) + # + # d.currentColorChanged.connect(self._colorChanged) + # + # if d.exec_(): + # self._colorChanged(d.selectedColor()) + # else: + # self._colorChanged(color) + + +def example(): + """ + Example: + + import studiolibrary.widgets.colorpicker + reload(studiolibrary.widgets.colorpicker) + studiolibrary.widgets.colorpicker.example() + """ + + def _iconChanged(icon): + print("iconChanged:", icon) + + style = """ + #iconButton { + margin: 2px; + min-width: 18px; + min-height: 18px; + background-color: rgba(0,0,0,0); + } + """ + + from studiolibrary import resource + + icons = [] + names = [ + "folder.svg", + "user.svg", + "character.svg", + "users.svg", + "inbox.svg", + "favorite.svg", + "shot.svg", + "asset.svg", + "assets.svg", + ] + + for name in names: + icons.append(resource.icon(name, color="rgb(255,255,255)")) + + picker = IconPickerWidget() + picker.setStyleSheet(style) + picker.setIcons(icons) + picker.iconChanged.connect(_iconChanged) + picker.show() + + +if __name__ == "__main__": + with studioqt.app(): + example() diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/itemswidget/__init__.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/itemswidget/__init__.py new file mode 100644 index 0000000..fa43df4 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/itemswidget/__init__.py @@ -0,0 +1,11 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/itemswidget/groupitem.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/itemswidget/groupitem.py new file mode 100644 index 0000000..6ee2d3b --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/itemswidget/groupitem.py @@ -0,0 +1,216 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +from studiovendor.Qt import QtGui +from studiovendor.Qt import QtCore +from studiovendor.Qt import QtWidgets + +from .item import Item + + +class GroupItem(Item): + + DEFAULT_FONT_SIZE = 18 + PADDING_LEFT = 2 + PADDING_RIGHT = 20 + HEIGHT = 28 + + def __init__(self, *args): + super(GroupItem, self).__init__(*args) + + self._children = [] + + self._font = self.font(0) + self._font.setBold(True) + + self.setFont(0, self._font) + self.setFont(1, self._font) + self.setDragEnabled(False) + + def setChildren(self, children): + """ + Set the children for the group. + + :type children: list[Item] + :rtype: None + """ + self._children = children + + def children(self): + """ + Return the children for the group. + + :rtype: list[Item] + """ + return self._children + + def childrenHidden(self): + """ + Return True if all children are hidden. + + :rtype: bool + """ + for child in self.children(): + if not child.isHidden(): + return False + return True + + def updateChildren(self): + """ + Update the visibility if all children are hidden. + + :rtype: bool + """ + if self.childrenHidden(): + self.setHidden(True) + else: + self.setHidden(False) + + def textAlignment(self, column): + """ + Return the font alignment for the given column. + + :type column: int + """ + return QtWidgets.QTreeWidgetItem.textAlignment(self, column) + + def sizeHint(self, column=0): + """ + Return the size of the item. + + :rtype: QtCore.QSize + """ + padding = self.PADDING_RIGHT * self.dpi() + width = self.itemsWidget().width() - padding + return QtCore.QSize(width, self.HEIGHT * self.dpi()) + + def visualRect(self, option): + """ + Return the visual rect for the item. + + :type option: QtWidgets.QStyleOptionViewItem + :rtype: QtCore.QRect + """ + rect = QtCore.QRect(option.rect) + rect.setX(self.PADDING_LEFT * self.dpi()) + rect.setWidth(self.sizeHint().width()) + return rect + + def isTextVisible(self): + """ + Return True if the text is visible. + + :rtype: bool + """ + return True + + def textSelectedColor(self): + """ + Return the selected text color for the item. + + :rtype: QtWidgets.QtColor + """ + return self.itemsWidget().textColor() + + def backgroundColor(self): + """ + Return the background color for the item. + + :rtype: QtWidgets.QtColor + """ + return QtGui.QColor(0, 0, 0, 0) + + def backgroundHoverColor(self): + """ + Return the background color when the mouse is over the item. + + :rtype: QtWidgets.QtColor + """ + return QtGui.QColor(0, 0, 0, 0) + + def backgroundSelectedColor(self): + """ + Return the background color when the item is selected. + + :rtype: QtWidgets.QtColor + """ + return QtGui.QColor(0, 0, 0, 0) + + def paintRow(self, painter, option, index): + """ + Paint performs low-level painting for the item. + + :type painter: QtWidgets.QPainter + :type option: QtWidgets.QStyleOptionViewItem + :type index: QtCore.QModelIndex + :rtype: None + """ + self.setRect(QtCore.QRect(option.rect)) + + painter.save() + + try: + self.paintBackground(painter, option, index) + + if self.isTextVisible(): + self._paintText(painter, option, 1) + + finally: + painter.restore() + + def isLabelOverItem(self): + """Overriding this method to ignore this feature for group items.""" + return False + + def isLabelUnderItem(self): + """Overriding this method to ignore this feature for group items.""" + return False + + def icon(self, *args): + """ + Overriding the icon method, so that an icon is not displayed. + """ + return None + + def paintBackground(self, painter, option, index): + """ + Draw the background for the item. + + :type painter: QtWidgets.QPainter + :type option: QtWidgets.QStyleOptionViewItem + :type index: QtCore.QModelIndex + :rtype: None + """ + super(GroupItem, self).paintBackground(painter, option, index) + + painter.setPen(QtGui.QPen(QtCore.Qt.NoPen)) + visualRect = self.visualRect(option) + + text = self.name() + metrics = QtGui.QFontMetricsF(self._font) + textWidth = metrics.boundingRect(text).width() + + padding = (25 * self.dpi()) + + visualRect.setX(textWidth + padding) + visualRect.setY(visualRect.y() + (visualRect.height() / 2)) + visualRect.setHeight(2 * self.dpi()) + visualRect.setWidth(visualRect.width() - padding) + + color = QtGui.QColor( + self.textColor().red(), + self.textColor().green(), + self.textColor().blue(), 10 + ) + painter.setBrush(QtGui.QBrush(color)) + + painter.drawRect(visualRect) diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/itemswidget/item.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/itemswidget/item.py new file mode 100644 index 0000000..f040023 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/itemswidget/item.py @@ -0,0 +1,1513 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +import os +import math +import logging + +from studiovendor import six +from studiovendor.Qt import QtGui +from studiovendor.Qt import QtCore +from studiovendor.Qt import QtWidgets + +import studioqt +import studiolibrary + + +logger = logging.getLogger(__name__) + + +class GlobalSignals(QtCore.QObject): + """""" + sliderChanged = QtCore.Signal(float) + + +class WorkerSignals(QtCore.QObject): + triggered = QtCore.Signal(object) + + +class LabelDisplayOption: + + Hide = "hide label" + Over = "label over item" + Under = "label under item" + + @staticmethod + def values(): + return [ + LabelDisplayOption.Hide, + LabelDisplayOption.Over, + LabelDisplayOption.Under, + ] + + +class ImageWorker(QtCore.QRunnable): + """A convenience class for loading an image in a thread.""" + + def __init__(self, *args): + QtCore.QRunnable.__init__(self, *args) + + self._path = None + self.signals = WorkerSignals() + + def setPath(self, path): + """ + Set the image path to be processed. + + :type path: str + """ + self._path = path + + def run(self): + """The starting point for the thread.""" + try: + if self._path: + image = QtGui.QImage(six.text_type(self._path)) + self.signals.triggered.emit(image) + except Exception as error: + logger.exception("Cannot load thumbnail image.") + + +class Item(QtWidgets.QTreeWidgetItem): + """The Item is used to hold rows of information for an item view.""" + + ICON_PATH = None + TYPE_ICON_PATH = None + + ThreadPool = QtCore.QThreadPool() + THUMBNAIL_PATH = "" + + MAX_ICON_SIZE = 256 + + DEFAULT_FONT_SIZE = 12 + DEFAULT_PLAYHEAD_COLOR = QtGui.QColor(255, 255, 255, 220) + + THUMBNAIL_COLUMN = 0 + ENABLE_THUMBNAIL_THREAD = True + PAINT_SLIDER = False + + _TYPE_PIXMAP_CACHE = {} + + _globalSignals = GlobalSignals() + sliderChanged = _globalSignals.sliderChanged + + def __init__(self, *args): + QtWidgets.QTreeWidgetItem.__init__(self, *args) + + self._url = None + self._path = None + self._size = None + self._rect = None + self._textColumnOrder = [] + + self._data = {} + self._itemData = {} + + self._icon = {} + self._fonts = {} + self._thread = None + self._pixmap = {} + self._pixmapRect = None + self._pixmapScaled = None + + self._iconPath = None + self._typePixmap = None + + self._thumbnailIcon = None + + self._underMouse = False + self._searchText = None + self._infoWidget = None + + self._groupItem = None + self._groupColumn = 0 + + self._mimeText = None + self._itemsWidget = None + self._stretchToWidget = None + + self._dragEnabled = True + + self._imageSequence = None + self._imageSequencePath = "" + + self._sliderDown = False + self._sliderValue = 0.0 + self._sliderPreviousValue = 0.0 + self._sliderPosition = None + self._sliderEnabled = False + + self._worker = ImageWorker() + self._worker.setAutoDelete(False) + self._worker.signals.triggered.connect(self._thumbnailFromImage) + self._workerStarted = False + + def __eq__(self, other): + return id(other) == id(self) + + def __ne__(self, other): + return id(other) != id(self) + + def __hash__(self): + return hash(id(self)) + + def __del__(self): + """ + Make sure the sequence is stopped when deleted. + + :rtype: None + """ + self.stop() + + def columnFromLabel(self, label): + if self.treeWidget(): + return self.treeWidget().columnFromLabel(label) + else: + return None + + def labelFromColumn(self, column): + if self.treeWidget(): + return self.treeWidget().labelFromColumn(column) + else: + return None + + def mimeText(self): + """ + Return the mime text for drag and drop. + + :rtype: str + """ + return self._mimeText or self.text(0) + + def setMimeText(self, text): + """ + Set the mime text for drag and drop. + + :type text: str + :rtype: None + """ + self._mimeText = text + + def setHidden(self, value): + """ + Set the item hidden. + + :type value: bool + :rtype: None + """ + QtWidgets.QTreeWidgetItem.setHidden(self, value) + row = self.treeWidget().indexFromItem(self).row() + self.itemsWidget().listView().setRowHidden(row, value) + + def setDragEnabled(self, value): + """ + Set True if the item can be dragged. + + :type value: bool + :rtype: None + """ + self._dragEnabled = value + + def dragEnabled(self): + """ + Return True if the item can be dragged. + + :rtype: bool + """ + return self._dragEnabled + + def setIcon(self, column, icon, color=None): + """ + Set the icon to be displayed in the given column. + + :type column: int or str + :type icon: QtGui.QIcon + :type color: QtGui.QColor or None + :rtype: None + """ + # Safe guard for when the class is being used without the gui. + isAppRunning = bool(QtWidgets.QApplication.instance()) + if not isAppRunning: + return + + if isinstance(icon, six.string_types): + if not os.path.exists(icon): + color = color or studioqt.Color(255, 255, 255, 20) + icon = studiolibrary.resource.icon("image", color=color) + else: + icon = QtGui.QIcon(icon) + + if isinstance(column, six.string_types): + self._icon[column] = icon + else: + self._pixmap[column] = None + QtWidgets.QTreeWidgetItem.setIcon(self, column, icon) + + self.updateIcon() + + def setItemData(self, data): + """ + Set the given dictionary as the data for the item. + + :type data: dict + :rtype: None + """ + self._itemData = data + + def itemData(self): + """ + Return the item data for this item. + + :rtype: dict + """ + return self._itemData + + def setName(self, text): + """ + Set the name that is shown under the icon and in the Name column. + + :type text: str + :rtype: None + """ + itemData = self.itemData() + itemData['icon'] = text + itemData['name'] = text + + def name(self): + """ + Return text for the Name column. + + :rtype: str + """ + return self.itemData().get("name") + + def displayText(self, label): + """ + Return the sort data for the given column. + + :type label: str + :rtype: str + """ + return six.text_type(self.itemData().get(label, '')) + + def sortText(self, label): + """ + Return the sort data for the given column. + + :type label: str + :rtype: str + """ + return six.text_type(self.itemData().get(label, '')) + + def update(self): + """ + Refresh the visual state of the icon. + + :rtype: None + """ + self.updateIcon() + self.updateFrame() + + def updateIcon(self): + """ + Clear the pixmap cache for the item. + + :rtype: None + """ + self.clearCache() + + def clearCache(self): + """Clear the thumbnail cache.""" + self._pixmap = {} + self._pixmapRect = None + self._pixmapScaled = None + self._thumbnailIcon = None + + def dpi(self): + """ + Used for high resolution devices. + + :rtype: int + """ + if self.itemsWidget(): + return self.itemsWidget().dpi() + else: + return 1 + + def clicked(self): + """ + Triggered when an item is clicked. + + :rtype: None + """ + pass + + def takeFromTree(self): + """ + Takes this item from the tree. + """ + tree = self.treeWidget() + parent = self.parent() + + if parent: + parent.takeChild(parent.indexOfChild(self)) + else: + tree.takeTopLevelItem(tree.indexOfTopLevelItem(self)) + + def selectionChanged(self): + """ + Triggered when an item has been either selected or deselected. + + :rtype: None + """ + self.resetSlider() + + def doubleClicked(self): + """ + Triggered when an item is double clicked. + + :rtype: None + """ + pass + + def setGroupItem(self, groupItem): + """ + Set the group item that this item is a child to. + + :type groupItem: groupitem.GroupItem + """ + self._groupItem = groupItem + + def groupItem(self): + """ + Get the group item that this item is a child to. + + :rtype: groupitem.GroupItem + """ + return self._groupItem + + def itemsWidget(self): + """ + Returns the items widget that contains the items. + + :rtype: ItemsWidget + """ + itemsWidget = None + + if self.treeWidget(): + itemsWidget = self.treeWidget().parent() + + return itemsWidget + + def url(self): + """ + Return the url object for the given item. + + :rtype: QtCore.QUrl or None + """ + if not self._url: + self._url = QtCore.QUrl(self.text(0)) + return self._url + + def setUrl(self, url): + """ + Set the url object for the item. + + :type: QtCore.QUrl or None + :rtype: None + """ + self._url = url + + def searchText(self): + """ + Return the search string used for finding the item. + + :rtype: str + """ + if not self._searchText: + self._searchText = six.text_type(self._data) + + return self._searchText + + def setStretchToWidget(self, widget): + """ + Set the width of the item to the width of the given widget. + + :type widget: QtWidgets.QWidget + :rtype: None + """ + self._stretchToWidget = widget + + def stretchToWidget(self): + """ + Return the sretchToWidget. + + :rtype: QtWidgets.QWidget + """ + return self._stretchToWidget + + def setSize(self, size): + """ + Set the size for the item. + + :type size: QtCore.QSize + :rtype: None + """ + self._size = size + + def sizeHint(self, column=0): + """ + Return the current size of the item. + + :type column: int + :rtype: QtCore.QSize + """ + if self.stretchToWidget(): + if self._size: + size = self._size + else: + size = self.itemsWidget().iconSize() + + w = self.stretchToWidget().width() + h = size.height() + return QtCore.QSize(w - 20, h) + + if self._size: + return self._size + else: + iconSize = self.itemsWidget().iconSize() + + if self.isLabelUnderItem(): + w = iconSize.width() + h = iconSize.width() + self.textHeight() + iconSize = QtCore.QSize(w, h) + + return iconSize + + def setPixmap(self, column, pixmap): + """ + Set the pixmap to be displayed in the given column. + + :type column: int + :type pixmap: QtWidgets.QPixmap + :rtype: None + """ + self._pixmap[column] = pixmap + + def thumbnailPath(self): + """ + Return the thumbnail path on disk. + + :rtype: None or str + """ + return "" + + def _thumbnailFromImage(self, image): + """ + Called after the given image object has finished loading. + + :type image: QtGui.QImage + :rtype: None + """ + self.clearCache() + + pixmap = QtGui.QPixmap() + pixmap.convertFromImage(image) + icon = QtGui.QIcon(pixmap) + + self._thumbnailIcon = icon + if self.itemsWidget(): + self.itemsWidget().update() + + def defaultThumbnailPath(self): + """ + Get the default thumbnail path. + + :rtype: str + """ + return self.THUMBNAIL_PATH + + def defaultThumbnailIcon(self): + """ + Get the default thumbnail icon. + + :rtype: QtGui.QIcon + """ + return QtGui.QIcon(self.defaultThumbnailPath()) + + def thumbnailIcon(self): + """ + Return the thumbnail icon. + + :rtype: QtGui.QIcon + """ + thumbnailPath = self.thumbnailPath() + + if not self._thumbnailIcon: + if self.ENABLE_THUMBNAIL_THREAD and not self._workerStarted: + self._workerStarted = True + self._worker.setPath(thumbnailPath) + + self.ThreadPool.start(self._worker) + + self._thumbnailIcon = self.defaultThumbnailIcon() + else: + self._thumbnailIcon = QtGui.QIcon(thumbnailPath) + + return self._thumbnailIcon + + def icon(self, column): + """ + Overriding the icon method to add support for the thumbnail icon. + + :type column: int + :rtype: QtGui.QIcon + """ + icon = QtWidgets.QTreeWidgetItem.icon(self, column) + + if not icon and column == self.THUMBNAIL_COLUMN: + icon = self.thumbnailIcon() + + return icon + + def pixmap(self, column): + """ + Return the pixmap for the given column. + + :type column: int + :rtype: QtWidgets.QPixmap + """ + + if not self._pixmap.get(column): + + icon = self.icon(column) + if icon: + size = QtCore.QSize(self.MAX_ICON_SIZE, self.MAX_ICON_SIZE) + iconSize = icon.actualSize(size) + self._pixmap[column] = icon.pixmap(iconSize) + + return self._pixmap.get(column) + + def padding(self): + """ + Return the padding/border size for the item. + + :rtype: int + """ + return self.itemsWidget().padding() + + def textHeight(self): + """ + Return the height of the text for the item. + + :rtype: int + """ + return self.itemsWidget().itemTextHeight() + + def isTextVisible(self): + """ + Check if the label should be displayed. + + :rtype: bool + """ + return self.labelDisplayOption() != LabelDisplayOption.Hide + + def isLabelOverItem(self): + """ + Check if the label should be displayed over the item. + + :rtype: bool + """ + return self.labelDisplayOption() == LabelDisplayOption.Over + + def isLabelUnderItem(self): + """ + Check if the label should be displayed under the item. + + :rtype: bool + """ + return self.labelDisplayOption() == LabelDisplayOption.Under + + def labelDisplayOption(self): + """ + Return True if the text is visible. + + :rtype: bool + """ + return self.itemsWidget().labelDisplayOption() + + def textAlignment(self, column): + """ + Return the text alignment for the label in the given column. + + :type column: int + :rtype: QtCore.Qt.AlignmentFlag + """ + if self.itemsWidget().isIconView(): + return QtCore.Qt.AlignCenter + else: + return QtWidgets.QTreeWidgetItem.textAlignment(self, column) + + # ----------------------------------------------------------------------- + # Support for mouse and key events + # ----------------------------------------------------------------------- + + def underMouse(self): + """Return True if the item is under the mouse cursor.""" + return self._underMouse + + def contextMenu(self, menu): + """ + Return the context menu for the item. + + Reimplement in a subclass to return a custom context menu for the item. + + :rtype: QtWidgets.QMenu + """ + pass + + def dropEvent(self, event): + """ + Reimplement in a subclass to receive drop events for the item. + + :type event: QtWidgets.QDropEvent + :rtype: None + """ + + def mouseLeaveEvent(self, event): + """ + Reimplement in a subclass to receive mouse leave events for the item. + + :type event: QtWidgets.QMouseEvent + :rtype: None + """ + self._underMouse = False + self.stop() + + def mouseEnterEvent(self, event): + """ + Reimplement in a subclass to receive mouse enter events for the item. + + :type event: QtWidgets.QMouseEvent + :rtype: None + """ + self._underMouse = True + self.play() + + def mouseMoveEvent(self, event): + """ + Reimplement in a subclass to receive mouse move events for the item. + + :type event: QtWidgets.QMouseEvent + :rtype: None + """ + self.sliderEvent(event) + self.imageSequenceEvent(event) + + def mousePressEvent(self, event): + """ + Reimplement in a subclass to receive mouse press events for the item. + + :type event: QtWidgets.QMouseEvent + :rtype: None + """ + if event.button() == QtCore.Qt.MiddleButton: + if self.isSliderEnabled(): + self.setSliderDown(True) + self._sliderPosition = event.pos() + + def mouseReleaseEvent(self, event): + """ + Reimplement in a subclass to receive mouse release events for the item. + + :type event: QtWidgets.QMouseEvent + :rtype: None + """ + if self.isSliderDown(): + self._sliderPreviousValue = self.sliderValue() + self._sliderPosition = None + + self.treeWidget()._itemSliderReleased(self, self.sliderValue()) + self.setSliderDown(False) + + def keyPressEvent(self, event): + """ + Reimplement in a subclass to receive key press events for the item. + + :type event: QtWidgets.QKeyEvent + :rtype: None + """ + pass + + def keyReleaseEvent(self, event): + """ + Reimplement in a subclass to receive key release events for the item. + + :type event: QtWidgets.QKeyEvent + :rtype: None + """ + pass + + # ----------------------------------------------------------------------- + # Support for custom painting + # ----------------------------------------------------------------------- + + def textColor(self): + """ + Return the text color for the item. + + :rtype: QtWidgets.QtColor + """ + # This will be changed to use the palette soon. + # Note: There were problems with older versions of Qt's palette (Maya 2014). + # Eg: + # return self.itemsWidget().palette().color(self.itemsWidget().foregroundRole()) + return self.itemsWidget().textColor() + + def textSelectedColor(self): + """ + Return the selected text color for the item. + + :rtype: QtWidgets.QtColor + """ + return self.itemsWidget().textSelectedColor() + + def backgroundColor(self): + """ + Return the background color for the item. + + :rtype: QtWidgets.QtColor + """ + return self.itemsWidget().itemBackgroundColor() + + def backgroundHoverColor(self): + """ + Return the background color when the mouse is over the item. + + :rtype: QtWidgets.QtColor + """ + return self.itemsWidget().backgroundHoverColor() + + def backgroundSelectedColor(self): + """ + Return the background color when the item is selected. + + :rtype: QtWidgets.QtColor + """ + return self.itemsWidget().backgroundSelectedColor() + + def rect(self): + """ + Return the rect for the current paint frame. + + :rtype: QtCore.QRect + """ + return self._rect + + def setRect(self, rect): + """ + Set the rect for the current paint frame. + + :type rect: QtCore.QRect + :rtype: None + """ + self._rect = rect + + def visualRect(self, option): + """ + Return the visual rect for the item. + + :type option: QtWidgets.QStyleOptionViewItem + :rtype: QtCore.QRect + """ + return QtCore.QRect(option.rect) + + def paintRow(self, painter, option, index): + """ + Paint performs low-level painting for the item. + + :type painter: QtWidgets.QPainter + :type option: QtWidgets.QStyleOptionViewItem + :type index: QtCore.QModelIndex + :rtype: None + """ + QtWidgets.QTreeWidget.drawRow( + self.treeWidget(), + painter, + option, + index + ) + + def paint(self, painter, option, index): + """ + Paint performs low-level painting for the item. + + :type painter: QtWidgets.QPainter + :type option: QtWidgets.QStyleOptionViewItem + :type index: QtCore.QModelIndex + :rtype: None + """ + self.setRect(QtCore.QRect(option.rect)) + + painter.save() + + try: + self.paintBackground(painter, option, index) + + self.paintIcon(painter, option, index) + + if index.column() == 0 and self.sliderValue() != 0: + self.paintSlider(painter, option, index) + + if self.isTextVisible(): + self.paintText(painter, option, index) + + if index.column() == 0: + self.paintTypeIcon(painter, option) + + if index.column() == 0 and self.imageSequence(): + self.paintPlayhead(painter, option) + + finally: + painter.restore() + + def paintBackground(self, painter, option, index): + """ + Draw the background for the item. + + :type painter: QtWidgets.QPainter + :type option: QtWidgets.QStyleOptionViewItem + :type index: QtCore.QModelIndex + """ + isSelected = option.state & QtWidgets.QStyle.State_Selected + isMouseOver = option.state & QtWidgets.QStyle.State_MouseOver + painter.setPen(QtGui.QPen(QtCore.Qt.NoPen)) + + visualRect = self.visualRect(option) + + if isSelected: + color = self.backgroundSelectedColor() + painter.setBrush(QtGui.QBrush(color)) + elif isMouseOver: + color = self.backgroundHoverColor() + painter.setBrush(QtGui.QBrush(color)) + else: + color = self.backgroundColor() + painter.setBrush(QtGui.QBrush(color)) + + if not self.itemsWidget().isIconView(): + spacing = 1 * self.dpi() + height = visualRect.height() - spacing + visualRect.setHeight(height) + + painter.drawRect(visualRect) + + def paintSlider(self, painter, option, index): + """ + Draw the virtual slider for the item. + + :type painter: QtWidgets.QPainter + :type option: QtWidgets.QStyleOptionViewItem + :type index: QtCore.QModelIndex + """ + if not self.PAINT_SLIDER: + return + + if not self.itemsWidget().isIconView(): + return + + # Draw slider background + painter.setPen(QtGui.QPen(QtCore.Qt.NoPen)) + + rect = self.visualRect(option) + + color = self.itemsWidget().backgroundColor().toRgb() + color.setAlpha(75) + painter.setBrush(QtGui.QBrush(color)) + + height = rect.height() + + ratio = self.sliderValue() + + if ratio < 0: + width = 0 + elif ratio > 100: + width = rect.width() + else: + width = rect.width() * (float(ratio) / 100) + + rect.setWidth(width) + rect.setHeight(height) + + painter.drawRect(rect) + + # Draw slider value + rect = self.visualRect(option) + rect.setY(rect.y() + (4 * self.dpi())) + + color = self.itemsWidget().textColor().toRgb() + color.setAlpha(220) + pen = QtGui.QPen(color) + align = QtCore.Qt.AlignTop | QtCore.Qt.AlignHCenter + + painter.setPen(pen) + painter.drawText(rect, align, str(self.sliderValue()) + "%") + + def iconRect(self, option): + """ + Return the icon rect for the item. + + :type option: QtWidgets.QStyleOptionViewItem + :rtype: QtCore.QRect + """ + padding = self.padding() + rect = self.visualRect(option) + width = rect.width() + height = rect.height() + + if self.isLabelUnderItem(): + height -= self.textHeight() + + width -= padding + height -= padding + + rect.setWidth(width) + rect.setHeight(height) + + x = 0 + x += float(padding) / 2 + x += float((width - rect.width())) / 2 + + y = float((height - rect.height())) / 2 + y += float(padding) / 2 + + rect.translate(x, y) + return rect + + def scalePixmap(self, pixmap, rect): + """ + Scale the given pixmap to the give rect size. + + This method will cache the scaled pixmap if called with the same size. + + :type pixmap: QtGui.QPixmap + :type rect: QtCore.QRect + :rtype: QtGui.QPixmap + """ + rectChanged = True + + if self._pixmapRect: + widthChanged = self._pixmapRect.width() != rect.width() + heightChanged = self._pixmapRect.height() != rect.height() + + rectChanged = widthChanged or heightChanged + + if not self._pixmapScaled or rectChanged: + + self._pixmapScaled = pixmap.scaled( + rect.width(), + rect.height(), + QtCore.Qt.KeepAspectRatio, + QtCore.Qt.SmoothTransformation, + ) + + self._pixmapRect = rect + + return self._pixmapScaled + + def paintIcon(self, painter, option, index, align=None): + """ + Draw the icon for the item. + + :type painter: QtWidgets.QPainter + :type option: QtWidgets.QStyleOptionViewItem + :rtype: None + """ + column = index.column() + pixmap = self.pixmap(column) + + if not pixmap: + return + + rect = self.iconRect(option) + pixmap = self.scalePixmap(pixmap, rect) + + pixmapRect = QtCore.QRect(rect) + pixmapRect.setWidth(pixmap.width()) + pixmapRect.setHeight(pixmap.height()) + + align = QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter + + x, y = 0, 0 + + isAlignBottom = align == QtCore.Qt.AlignBottom | QtCore.Qt.AlignLeft \ + or align == QtCore.Qt.AlignBottom | QtCore.Qt.AlignHCenter \ + or align == QtCore.Qt.AlignBottom | QtCore.Qt.AlignRight + + isAlignHCenter = align == QtCore.Qt.AlignHCenter \ + or align == QtCore.Qt.AlignCenter \ + or align == QtCore.Qt.AlignHCenter | QtCore.Qt.AlignBottom \ + or align == QtCore.Qt.AlignHCenter | QtCore.Qt.AlignTop + + isAlignVCenter = align == QtCore.Qt.AlignVCenter \ + or align == QtCore.Qt.AlignCenter \ + or align == QtCore.Qt.AlignVCenter | QtCore.Qt.AlignLeft \ + or align == QtCore.Qt.AlignVCenter | QtCore.Qt.AlignRight + + if isAlignHCenter: + x += float(rect.width() - pixmap.width()) / 2 + + if isAlignVCenter: + y += float(rect.height() - pixmap.height()) / 2 + + elif isAlignBottom: + y += float(rect.height() - pixmap.height()) + + pixmapRect.translate(x, y) + painter.drawPixmap(pixmapRect, pixmap) + + def drawIconBorder(self, painter, pixmapRect): + """ + Draw a border around the icon. + + :type painter: QtWidgets.QPainter + :type pixmapRect: QtWidgets.QRect + :rtype: None + """ + pixmapRect = QtCore.QRect(pixmapRect) + pixmapRect.setX(pixmapRect.x() - 5) + pixmapRect.setY(pixmapRect.y() - 5) + pixmapRect.setWidth(pixmapRect.width() + 5) + pixmapRect.setHeight(pixmapRect.height() + 5) + + color = QtGui.QColor(255, 255, 255, 10) + painter.setPen(QtGui.QPen(QtCore.Qt.NoPen)) + painter.setBrush(QtGui.QBrush(color)) + + painter.drawRect(pixmapRect) + + def fontSize(self): + """ + Return the font size for the item. + + :rtype: int + """ + return self.DEFAULT_FONT_SIZE + + def font(self, column): + """ + Return the font for the given column. + + :type column: int + :rtype: QtWidgets.QFont + """ + default = QtWidgets.QTreeWidgetItem.font(self, column) + + font = self._fonts.get(column, default) + + font.setPixelSize(self.fontSize() * self.dpi()) + return font + + def setFont(self, column, font): + """ + Set the font for the given column. + + :type column: int + :type font: QtWidgets.QFont + :rtype: Noen + """ + self._fonts[column] = font + + def paintText(self, painter, option, index): + """ + Draw the text for the item. + + :type painter: QtWidgets.QPainter + :type option: QtWidgets.QStyleOptionViewItem + :rtype: None + """ + column = index.column() + + if column == 0 and self.itemsWidget().isTableView(): + return + + self._paintText(painter, option, column) + + def textWidth(self, column): + text = self.text(column) + + font = self.font(column) + metrics = QtGui.QFontMetricsF(font) + textWidth = metrics.width(text) + return textWidth + + def _paintText(self, painter, option, column): + + if self.itemsWidget().isIconView(): + text = self.name() + else: + label = self.labelFromColumn(column) + text = self.displayText(label) + + isSelected = option.state & QtWidgets.QStyle.State_Selected + + if isSelected: + color = self.textSelectedColor() + else: + color = self.textColor() + + visualRect = self.visualRect(option) + + width = visualRect.width() + height = visualRect.height() + + padding = self.padding() + x = padding / 2 + y = padding / 2 + + visualRect.translate(x, y) + visualRect.setWidth(width - padding) + visualRect.setHeight(height - padding) + + font = self.font(column) + align = self.textAlignment(column) + metrics = QtGui.QFontMetricsF(font) + + if text: + textWidth = metrics.boundingRect(text).width() + else: + textWidth = 1 + + # # Check if the current text fits within the rect. + if textWidth > visualRect.width() - padding: + visualWidth = visualRect.width() + text = metrics.elidedText(text, QtCore.Qt.ElideRight, visualWidth) + align = QtCore.Qt.AlignLeft + + align = align | QtCore.Qt.AlignVCenter + + rect = QtCore.QRect(visualRect) + + if self.itemsWidget().isIconView(): + + if self.isLabelOverItem() or self.isLabelUnderItem(): + padding = 8 if padding < 8 else padding + + height = metrics.height() + (padding / 2) + y = (rect.y() + rect.height()) - height + + rect.setY(y) + rect.setHeight(height) + + if self.isLabelOverItem(): + color2 = self.itemsWidget().backgroundColor().toRgb() + color2.setAlpha(200) + + painter.setPen(QtCore.Qt.NoPen) + painter.setBrush(QtGui.QBrush(color2)) + painter.drawRect(rect) + + pen = QtGui.QPen(color) + painter.setPen(pen) + painter.setFont(font) + painter.drawText(rect, align, text) + + # ------------------------------------------------------------------------ + # Support for middle mouse slider + # ------------------------------------------------------------------------ + + def setSliderEnabled(self, enabled): + """ + Set if middle mouse slider is enabled. + + :type enabled: bool + """ + self._sliderEnabled = enabled + + def isSliderEnabled(self): + """ + Return true if middle mouse slider is enabled. + + :rtype: bool + """ + return self._sliderEnabled + + def sliderEvent(self, event): + """ + Called when the mouse moves while the middle mouse button is held down. + + :param event: QtGui.QMouseEvent + """ + if self.isSliderDown() and self.sliderPosition(): + value = (event.pos().x() - self.sliderPosition().x()) / 1.5 + value = math.ceil(value) + self.sliderPreviousValue() + if value != self.sliderValue(): + try: + self.setSliderValue(value) + except Exception: + self.setSliderDown(False) + + def resetSlider(self): + """Reset the slider value to zero.""" + self._sliderValue = 0.0 + self._sliderPreviousValue = 0.0 + + def setSliderDown(self, down): + """Called when the middle mouse button is released.""" + self._sliderDown = down + if not down: + self._sliderPosition = None + self._sliderPreviousValue = self.sliderValue() + + def isSliderDown(self): + """ + Return True if blending. + + :rtype: bool + """ + return self._sliderDown + + def setSliderValue(self, value): + """ + Set the blend value. + + :type value: float + :rtype: bool + """ + if self.isSliderEnabled(): + + if self._sliderValue == None: + return + + if value == self.sliderValue(): + return + + self._sliderValue = value + + if self.PAINT_SLIDER: + self.update() + + self.sliderChanged.emit(value) + + if self.treeWidget(): + self.treeWidget()._itemSliderMoved(self, value) + + if self.PAINT_SLIDER: + self.update() + + logger.debug("Blending:" + str(value)) + + def sliderValue(self): + """ + Return the blend value. + + :rtype: float + """ + return self._sliderValue + + def sliderPreviousValue(self): + """ + :rtype: float + """ + return self._sliderPreviousValue + + def sliderPosition(self): + """ + :rtype: QtGui.QPoint + """ + return self._sliderPosition + + # ------------------------------------------------------------------------ + # Support animated image sequence + # ------------------------------------------------------------------------ + + def imageSequenceEvent(self, event): + """ + :type event: QtCore.QEvent + :rtype: None + """ + if self.imageSequence(): + if studioqt.isControlModifier(): + if self.rect(): + x = event.pos().x() - self.rect().x() + width = self.rect().width() + percent = 1.0 - (float(width - x) / float(width)) + frame = int(self.imageSequence().frameCount() * percent) + self.imageSequence().jumpToFrame(frame) + self.updateFrame() + + def resetImageSequence(self): + self._imageSequence = None + + def imageSequence(self): + """ + :rtype: studioqt.ImageSequence + """ + return self._imageSequence + + def setImageSequence(self, value): + """ + :type value: studioqt.ImageSequence + """ + self._imageSequence = value + + def setImageSequencePath(self, path): + """ + :type path: str + """ + self._imageSequencePath = path + + def imageSequencePath(self): + """ + :rtype: str + """ + return self._imageSequencePath + + def stop(self): + """Stop playing the image sequence movie.""" + if self.imageSequence(): + self.imageSequence().stop() + + def play(self): + """Start playing the image sequence movie.""" + self.resetImageSequence() + path = self.imageSequencePath() or self.thumbnailPath() + + movie = None + + if os.path.isfile(path) and path.lower().endswith(".gif"): + + movie = QtGui.QMovie(path) + movie.setCacheMode(QtGui.QMovie.CacheAll) + movie.frameChanged.connect(self._frameChanged) + + elif os.path.isdir(path): + + if not self.imageSequence(): + movie = studioqt.ImageSequence(path) + movie.frameChanged.connect(self._frameChanged) + + if movie: + self.setImageSequence(movie) + self.imageSequence().start() + + def _frameChanged(self, frame=None): + """Triggered when the movie object updates to the given frame.""" + if not studioqt.isControlModifier(): + self.updateFrame() + + def updateFrame(self): + """Triggered when the movie object updates the current frame.""" + if self.imageSequence(): + pixmap = self.imageSequence().currentPixmap() + self.setIcon(0, pixmap) + + def playheadColor(self): + """ + Return the playhead color. + + :rtype: QtGui.Color + """ + return self.DEFAULT_PLAYHEAD_COLOR + + def paintPlayhead(self, painter, option): + """ + Paint the playhead if the item has an image sequence. + + :type painter: QtWidgets.QPainter + :type option: QtWidgets.QStyleOptionViewItem + :rtype: None + """ + imageSequence = self.imageSequence() + + if imageSequence and self.underMouse(): + + count = imageSequence.frameCount() + current = imageSequence.currentFrameNumber() + + if count > 0: + percent = float((count + current) + 1) / count - 1 + else: + percent = 0 + + r = self.iconRect(option) + c = self.playheadColor() + + painter.setPen(QtCore.Qt.NoPen) + painter.setBrush(QtGui.QBrush(c)) + + if percent <= 0: + width = 0 + elif percent >= 1: + width = r.width() + else: + width = (percent * r.width()) - 1 + + height = 3 * self.dpi() + y = r.y() + r.height() - (height - 1) + + painter.drawRect(r.x(), y, width, height) + + def typeIconPath(self): + """ + Return the type icon path on disc. + + :rtype: path or None + """ + if self.TYPE_ICON_PATH is None: + return self.ICON_PATH + + return self.TYPE_ICON_PATH + + def typePixmap(self): + """ + Return the type pixmap for the plugin. + + :rtype: QtWidgets.QPixmap + """ + path = self.typeIconPath() + pixmap = self._TYPE_PIXMAP_CACHE.get(path) + + if not pixmap and path and os.path.exists(path): + self._TYPE_PIXMAP_CACHE[path] = QtGui.QPixmap(path) + + return self._TYPE_PIXMAP_CACHE.get(path) + + def typeIconRect(self, option): + """ + Return the type icon rect. + + :rtype: QtGui.QRect + """ + padding = 2 * self.dpi() + r = self.iconRect(option) + + x = r.x() + padding + y = r.y() + padding + rect = QtCore.QRect(x, y, 13 * self.dpi(), 13 * self.dpi()) + + return rect + + def paintTypeIcon(self, painter, option): + """ + Draw the item type icon at the top left. + + :type painter: QtWidgets.QPainter + :type option: QtWidgets.QStyleOptionViewItem + :rtype: None + """ + rect = self.typeIconRect(option) + typePixmap = self.typePixmap() + if typePixmap: + painter.setOpacity(0.5) + painter.drawPixmap(rect, typePixmap) + painter.setOpacity(1) diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/itemswidget/itemdelegate.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/itemswidget/itemdelegate.py new file mode 100644 index 0000000..da1a9af --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/itemswidget/itemdelegate.py @@ -0,0 +1,71 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +from studiovendor.Qt import QtWidgets + +from .groupitem import GroupItem + + +class ItemDelegate(QtWidgets.QStyledItemDelegate): + + def __init__(self): + """ + This class is used to display data for the items in a ItemsWidget. + """ + QtWidgets.QStyledItemDelegate.__init__(self) + + self._itemsWidget = None + + def itemsWidget(self): + """ + Return the ItemsWidget that contains the item delegate. + + :rtype: studioqt.ItemsWidget + """ + return self._itemsWidget + + def setItemsWidget(self, itemsWidget): + """ + Set the ItemsWidget for the delegate. + + :type itemsWidget: studioqt.ItemsWidget + :rtype: None + """ + self._itemsWidget = itemsWidget + + def sizeHint(self, option, index): + """ + Return the size for the given index. + + :type option: QtWidgets.QStyleOptionViewItem + :type index: QtCore.QModelIndex + :rtype: QtCore.QSize + """ + #This will be called for each row. + item = self.itemsWidget().itemFromIndex(index) + + if isinstance(item, GroupItem): + return item.sizeHint() + + return self.itemsWidget().itemSizeHint(index) + + def paint(self, painter, option, index): + """ + Paint performs low-level painting for the given model index. + + :type painter: QtWidgets.QPainter + :type option: QtWidgets.QStyleOptionViewItem + :type index: QtCore.QModelIndex + :rtype: None + """ + item = self.itemsWidget().itemFromIndex(index) + item.paint(painter, option, index) diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/itemswidget/itemswidget.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/itemswidget/itemswidget.py new file mode 100644 index 0000000..6b3edb5 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/itemswidget/itemswidget.py @@ -0,0 +1,1160 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +import logging +import functools + +from studiovendor.Qt import QtGui +from studiovendor.Qt import QtCore +from studiovendor.Qt import QtWidgets + +from .item import Item +from .item import LabelDisplayOption +from .listview import ListView +from .groupitem import GroupItem +from .treewidget import TreeWidget +from .itemdelegate import ItemDelegate +from ..toastwidget import ToastWidget +from ..slideraction import SliderAction +from ..separatoraction import SeparatorAction + +logger = logging.getLogger(__name__) + + +class ItemsWidget(QtWidgets.QWidget): + + IconMode = "icon" + TableMode = "table" + + DEFAULT_PADDING = 5 + + DEFAULT_ZOOM_AMOUNT = 90 + DEFAULT_TEXT_HEIGHT = 20 + DEFAULT_WHEEL_SCROLL_STEP = 2 + + DEFAULT_MIN_SPACING = 0 + DEFAULT_MAX_SPACING = 50 + + DEFAULT_MIN_LIST_SIZE = 25 + DEFAULT_MIN_ICON_SIZE = 50 + + LABEL_DISPLAY_OPTION = LabelDisplayOption.Under + + keyPressed = QtCore.Signal(object) + + itemClicked = QtCore.Signal(object) + itemDoubleClicked = QtCore.Signal(object) + + zoomChanged = QtCore.Signal(object) + spacingChanged = QtCore.Signal(object) + + groupClicked = QtCore.Signal(object) + + itemSliderMoved = QtCore.Signal(object) + itemSliderReleased = QtCore.Signal() + + def __init__(self, *args): + QtWidgets.QWidget.__init__(self, *args) + + self._dpi = 1 + self._padding = self.DEFAULT_PADDING + + w, h = self.DEFAULT_ZOOM_AMOUNT, self.DEFAULT_ZOOM_AMOUNT + + self._iconSize = QtCore.QSize(w, h) + self._itemSizeHint = QtCore.QSize(w, h) + + self._zoomAmount = self.DEFAULT_ZOOM_AMOUNT + self._labelDisplayOption = self.LABEL_DISPLAY_OPTION + + self._dataset = None + self._treeWidget = TreeWidget(self) + + self._listView = ListView(self) + self._listView.setTreeWidget(self._treeWidget) + self._listView.installEventFilter(self) + + self._delegate = ItemDelegate() + self._delegate.setItemsWidget(self) + + self._listView.setItemDelegate(self._delegate) + self._treeWidget.setItemDelegate(self._delegate) + self._treeWidget.installEventFilter(self) + + self._toastWidget = ToastWidget(self) + self._toastWidget.hide() + self._toastEnabled = True + + self._textColor = QtGui.QColor(255, 255, 255, 200) + self._textSelectedColor = QtGui.QColor(255, 255, 255, 200) + self._itemBackgroundColor = QtGui.QColor(255, 255, 255, 30) + self._backgroundHoverColor = QtGui.QColor(255, 255, 255, 35) + self._backgroundSelectedColor = QtGui.QColor(30, 150, 255) + + layout = QtWidgets.QHBoxLayout() + layout.setContentsMargins(0, 0, 0, 0) + layout.addWidget(self._treeWidget) + layout.addWidget(self._listView) + + header = self.treeWidget().header() + header.sortIndicatorChanged.connect(self._sortIndicatorChanged) + + self.setLayout(layout) + + self.listView().itemClicked.connect(self._itemClicked) + self.listView().itemDoubleClicked.connect(self._itemDoubleClicked) + + self.treeWidget().itemClicked.connect(self._itemClicked) + self.treeWidget().itemDoubleClicked.connect(self._itemDoubleClicked) + self.treeWidget().itemSliderMoved.connect(self._itemSliderMoved) + self.treeWidget().itemSliderReleased.connect(self._itemSliderReleased) + + self.itemMoved = self._listView.itemMoved + self.itemDropped = self._listView.itemDropped + self.itemSelectionChanged = self._treeWidget.itemSelectionChanged + + def _itemSliderMoved(self, item, value): + self.itemSliderMoved.emit(value) + + def _itemSliderReleased(self, item, value): + self.itemSliderReleased.emit() + + def eventFilter(self, obj, event): + if event.type() == QtCore.QEvent.KeyPress: + self.keyPressed.emit(event) + + return super(ItemsWidget, self).eventFilter(obj, event) + + def _sortIndicatorChanged(self): + """ + Triggered when the sort indicator changes. + + :rtype: None + """ + pass + + def _itemClicked(self, item): + """ + Triggered when the given item has been clicked. + + :type item: studioqt.ItemsWidget + :rtype: None + """ + if isinstance(item, GroupItem): + self.groupClicked.emit(item) + else: + self.itemClicked.emit(item) + + def _itemDoubleClicked(self, item): + """ + Triggered when the given item has been double clicked. + + :type item: studioqt.Item + :rtype: None + """ + self.itemDoubleClicked.emit(item) + + def setDataset(self, dataset): + self._dataset = dataset + self.setColumnLabels(dataset.fieldNames()) + dataset.searchFinished.connect(self.updateItems) + + def dataset(self): + return self._dataset + + def updateItems(self): + """Sets the items to the widget.""" + selectedItems = self.selectedItems() + + self.treeWidget().blockSignals(True) + + try: + self.clearSelection() + + results = self.dataset().groupedResults() + + items = [] + + for group in results: + if group != "None": + groupItem = self.createGroupItem(group) + items.append(groupItem) + items.extend(results[group]) + + self.treeWidget().setItems(items) + + if selectedItems: + self.selectItems(selectedItems) + self.scrollToSelectedItem() + + finally: + self.treeWidget().blockSignals(False) + self.itemSelectionChanged.emit() + + def createGroupItem(self, text, children=None): + """ + Create a new group item for the given text and children. + + :type text: str + :type children: list[studioqt.Item] + + :rtype: GroupItem + """ + groupItem = GroupItem() + groupItem.setName(text) + groupItem.setStretchToWidget(self) + groupItem.setChildren(children) + + return groupItem + + def setToastEnabled(self, enabled): + """ + :type enabled: bool + :rtype: None + """ + self._toastEnabled = enabled + + def toastEnabled(self): + """ + :rtype: bool + """ + return self._toastEnabled + + def showToastMessage(self, text, duration=500): + """ + Show a toast with the given text for the given duration. + + :type text: str + :type duration: None or int + :rtype: None + """ + if self.toastEnabled(): + self._toastWidget.setDuration(duration) + self._toastWidget.setText(text) + self._toastWidget.show() + + def columnFromLabel(self, *args): + """ + Reimplemented for convenience. + + :return: int + """ + return self.treeWidget().columnFromLabel(*args) + + def setColumnHidden(self, column, hidden): + """ + Reimplemented for convenience. + + Calls self.treeWidget().setColumnHidden(column, hidden) + """ + self.treeWidget().setColumnHidden(column, hidden) + + def setLocked(self, value): + """ + Disables drag and drop. + + :Type value: bool + :rtype: None + """ + self.listView().setDragEnabled(not value) + self.listView().setDropEnabled(not value) + + def verticalScrollBar(self): + """ + Return the active vertical scroll bar. + + :rtype: QtWidget.QScrollBar + """ + if self.isTableView(): + return self.treeWidget().verticalScrollBar() + else: + return self.listView().verticalScrollBar() + + def visualItemRect(self, item): + """ + Return the visual rect for the item. + + :type item: QtWidgets.QTreeWidgetItem + :rtype: QtCore.QRect + """ + if self.isTableView(): + visualRect = self.treeWidget().visualItemRect(item) + else: + index = self.treeWidget().indexFromItem(item) + visualRect = self.listView().visualRect(index) + + return visualRect + + def isItemVisible(self, item): + """ + Return the visual rect for the item. + + :type item: QtWidgets.QTreeWidgetItem + :rtype: bool + """ + height = self.height() + itemRect = self.visualItemRect(item) + scrollBarY = self.verticalScrollBar().value() + + y = (scrollBarY - itemRect.y()) + height + return y > scrollBarY and y < scrollBarY + height + + def scrollToItem(self, item): + """ + Ensures that the item is visible. + + :type item: QtWidgets.QTreeWidgetItem + :rtype: None + """ + position = QtWidgets.QAbstractItemView.PositionAtCenter + + if self.isTableView(): + self.treeWidget().scrollToItem(item, position) + elif self.isIconView(): + self.listView().scrollToItem(item, position) + + def scrollToSelectedItem(self): + """ + Ensures that the item is visible. + + :rtype: None + """ + item = self.selectedItem() + if item: + self.scrollToItem(item) + + def dpi(self): + """ + return the zoom multiplier. + + Used for high resolution devices. + + :rtype: int + """ + return self._dpi + + def setDpi(self, dpi): + """ + Set the zoom multiplier. + + Used for high resolution devices. + + :type dpi: int + """ + self._dpi = dpi + self.refreshSize() + + def itemAt(self, pos): + """ + Return the current item at the given pos. + + :type pos: QtWidgets.QPoint + :rtype: studioqt.Item + """ + if self.isIconView(): + return self.listView().itemAt(pos) + else: + return self.treeView().itemAt(pos) + + def insertItems(self, items, itemAt=None): + """ + Insert the given items at the given itemAt position. + + :type items: list[studioqt.Item] + :type itemAt: studioqt.Item + :rtype: Nones + """ + self.addItems(items) + self.moveItems(items, itemAt=itemAt) + self.treeWidget().setItemsSelected(items, True) + + def moveItems(self, items, itemAt=None): + """ + Move the given items to the given itemAt position. + + :type items: list[studioqt.Item] + :type itemAt: studioqt.Item + :rtype: None + """ + self.listView().moveItems(items, itemAt=itemAt) + + def listView(self): + """ + Return the list view that contains the items. + + :rtype: ListView + """ + return self._listView + + def treeWidget(self): + """ + Return the tree widget that contains the items. + + :rtype: TreeWidget + """ + return self._treeWidget + + def clear(self): + """ + Reimplemented for convenience. + + Calls self.treeWidget().clear() + """ + self.treeWidget().clear() + + def refresh(self): + """Refresh the item size.""" + self.refreshSize() + + def refreshSize(self): + """ + Refresh the size of the items. + + :rtype: None + """ + self.setZoomAmount(self.zoomAmount() + 1) + self.setZoomAmount(self.zoomAmount() - 1) + self.repaint() + + def itemFromIndex(self, index): + """ + Return a pointer to the QTreeWidgetItem assocated with the given index. + + :type index: QtCore.QModelIndex + :rtype: QtWidgets.QTreeWidgetItem + """ + return self._treeWidget.itemFromIndex(index) + + def textFromItems(self, *args, **kwargs): + """ + Return all data for the given items and given column. + + :rtype: list[str] + """ + return self.treeWidget().textFromItems(*args, **kwargs) + + def textFromColumn(self, *args, **kwargs): + """ + Return all data for the given column. + + :rtype: list[str] + """ + return self.treeWidget().textFromColumn(*args, **kwargs) + + def setLabelDisplayOption(self, value): + """ + Set the label display option. + + :type value: LabelDisplayOption + """ + self._labelDisplayOption = value + self.refreshSize() + + def labelDisplayOption(self): + """ + Return the visibility of the item text. + + :rtype: LabelDisplayOption + """ + if self.isIconView(): + return self._labelDisplayOption + + def itemTextHeight(self): + """ + Return the height of the item text. + + :rtype: int + """ + return self.DEFAULT_TEXT_HEIGHT * self.dpi() + + def itemDelegate(self): + """ + Return the item delegate for the views. + + :rtype: ItemDelegate + """ + return self._delegate + + def settings(self): + """ + Return the current state of the widget. + + :rtype: dict + """ + settings = {} + + settings["columnLabels"] = self.columnLabels() + settings["padding"] = self.padding() + settings["spacing"] = self.spacing() + settings["zoomAmount"] = self.zoomAmount() + settings["selectedPaths"] = self.selectedPaths() + settings["labelDisplayOption"] = self._labelDisplayOption + settings.update(self.treeWidget().settings()) + + return settings + + def setSettings(self, settings): + """ + Set the current state of the widget. + + :type settings: dict + :rtype: None + """ + self.setToastEnabled(False) + + padding = settings.get("padding", 5) + self.setPadding(padding) + + spacing = settings.get("spacing", 2) + self.setSpacing(spacing) + + zoomAmount = settings.get("zoomAmount", 100) + self.setZoomAmount(zoomAmount) + + selectedPaths = settings.get("selectedPaths", []) + self.selectPaths(selectedPaths) + + value = settings.get("labelDisplayOption", self.LABEL_DISPLAY_OPTION) + self.setLabelDisplayOption(value) + + self.treeWidget().setSettings(settings) + + self.setToastEnabled(True) + + return settings + + def createCopyTextMenu(self): + return self.treeWidget().createCopyTextMenu() + + def createSettingsMenu(self): + + menu = QtWidgets.QMenu("Item View", self) + + action = SeparatorAction("View Settings", menu) + menu.addAction(action) + + action = SliderAction("Size", menu) + action.slider().setMinimum(10) + action.slider().setMaximum(200) + action.slider().setValue(self.zoomAmount()) + action.slider().valueChanged.connect(self.setZoomAmount) + menu.addAction(action) + + action = SliderAction("Border", menu) + action.slider().setMinimum(0) + action.slider().setMaximum(20) + action.slider().setValue(self.padding()) + action.slider().valueChanged.connect(self.setPadding) + menu.addAction(action) + # + action = SliderAction("Spacing", menu) + action.slider().setMinimum(self.DEFAULT_MIN_SPACING) + action.slider().setMaximum(self.DEFAULT_MAX_SPACING) + action.slider().setValue(self.spacing()) + action.slider().valueChanged.connect(self.setSpacing) + menu.addAction(action) + + action = SeparatorAction("Label Options", menu) + menu.addAction(action) + + for option in LabelDisplayOption.values(): + action = QtWidgets.QAction(option.title(), menu) + action.setCheckable(True) + action.setChecked(option == self.labelDisplayOption()) + callback = functools.partial(self.setLabelDisplayOption, option) + action.triggered.connect(callback) + menu.addAction(action) + + return menu + + def createItemsMenu(self, items=None): + """ + Create the item menu for given item. + + :rtype: QtWidgets.QMenu + """ + item = items or self.selectedItem() + + menu = QtWidgets.QMenu(self) + + if item: + try: + item.contextMenu(menu) + except Exception as error: + logger.exception(error) + else: + action = QtWidgets.QAction(menu) + action.setText("No Item selected") + action.setDisabled(True) + + menu.addAction(action) + + return menu + + def createContextMenu(self): + """ + Create and return the context menu for the widget. + + :rtype: QtWidgets.QMenu + """ + menu = self.createItemsMenu() + + settingsMenu = self.createSettingsMenu() + menu.addMenu(settingsMenu) + + return menu + + def contextMenuEvent(self, event): + """ + Show the context menu. + + :type event: QtCore.QEvent + :rtype: None + """ + menu = self.createContextMenu() + point = QtGui.QCursor.pos() + return menu.exec_(point) + + # ------------------------------------------------------------------------ + # Support for saving the current item order. + # ------------------------------------------------------------------------ + + def itemData(self, columnLabels): + """ + Return all column data for the given column labels. + + :type columnLabels: list[str] + :rtype: dict + + """ + data = {} + + for item in self.items(): + key = item.id() + + for columnLabel in columnLabels: + column = self.treeWidget().columnFromLabel(columnLabel) + value = item.data(column, QtCore.Qt.EditRole) + + data.setdefault(key, {}) + data[key].setdefault(columnLabel, value) + + return data + + def setItemData(self, data): + """ + Set the item data for all the current items. + + :type data: dict + :rtype: None + """ + for item in self.items(): + key = item.id() + if key in data: + item.setItemData(data[key]) + + def updateColumns(self): + """ + Update the column labels with the current item data. + + :rtype: None + """ + self.treeWidget().updateHeaderLabels() + + def columnLabels(self): + """ + Set all the column labels. + + :rtype: list[str] + """ + return self.treeWidget().columnLabels() + + def _removeDuplicates(self, labels): + """ + Removes duplicates from a list in Python, whilst preserving order. + + :type labels: list[str] + :rtype: list[str] + """ + s = set() + sadd = s.add + return [x for x in labels if x.strip() and not (x in s or sadd(x))] + + def setColumnLabels(self, labels): + """ + Set the columns for the widget. + + :type labels: list[str] + :rtype: None + """ + labels = self._removeDuplicates(labels) + + if "Custom Order" not in labels: + labels.append("Custom Order") + + # if "Search Order" not in labels: + # labels.append("Search Order") + + self.treeWidget().setHeaderLabels(labels) + + self.setColumnHidden("Custom Order", True) + # self.setColumnHidden("Search Order", True) + + def items(self): + """ + Return all the items in the widget. + + :rtype: list[studioqt.Item] + """ + return self._treeWidget.items() + + def addItems(self, items): + """ + Add the given items to the items widget. + + :type items: list[studioqt.Item] + :rtype: None + """ + self._treeWidget.addTopLevelItems(items) + + def addItem(self, item): + """ + Add the item to the tree widget. + + :type item: Item + :rtype: None + """ + self.addItems([item]) + + def columnLabelsFromItems(self): + """ + Return the column labels from all the items. + + :rtype: list[str] + """ + seq = [] + for item in self.items(): + seq.extend(item._textColumnOrder) + + seen = set() + return [x for x in seq if x not in seen and not seen.add(x)] + + def refreshColumns(self): + self.setColumnLabels(self.columnLabelsFromItems()) + + def padding(self): + """ + Return the item padding. + + :rtype: int + """ + return self._padding + + def setPadding(self, value): + """ + Set the item padding. + + :type: int + :rtype: None + """ + if value % 2 == 0: + self._padding = value + else: + self._padding = value + 1 + self.repaint() + + self.showToastMessage("Border: " + str(value)) + + def spacing(self): + """ + Return the spacing between the items. + + :rtype: int + """ + return self._listView.spacing() + + def setSpacing(self, spacing): + """ + Set the spacing between the items. + + :type spacing: int + :rtype: None + """ + self._listView.setSpacing(spacing) + self.scrollToSelectedItem() + + self.showToastMessage("Spacing: " + str(spacing)) + + def itemSizeHint(self, index=None): + """ + Get the item size hint. + + :type index: QtWidgets.QModelIndex + :rtype: QtCore.QSize + """ + return self._itemSizeHint + + def iconSize(self): + """ + Return the icon size for the views. + + :rtype: QtCore.QSize + """ + return self._iconSize + + def setIconSize(self, size): + """ + Set the icon size for the views. + + :type size: QtCore.QSize + :rtype: None + """ + self._iconSize = size + + if self.labelDisplayOption() == LabelDisplayOption.Under: + w = size.width() + h = size.width() + self.itemTextHeight() + self._itemSizeHint = QtCore.QSize(w, h) + elif size.height() < self.itemTextHeight(): + self._itemSizeHint = QtCore.QSize(size.width(), self.itemTextHeight()) + else: + self._itemSizeHint = size + + self._listView.setIconSize(size) + self._treeWidget.setIconSize(size) + + def clearSelection(self): + """ + Clear the user selection. + + :rtype: None + """ + self._treeWidget.clearSelection() + + def wheelScrollStep(self): + """ + Return the wheel scroll step amount. + + :rtype: int + """ + return self.DEFAULT_WHEEL_SCROLL_STEP + + def model(self): + """ + Return the model that this view is presenting. + + :rtype: QAbstractItemModel + """ + return self._treeWidget.model() + + def indexFromItem(self, item): + """ + Return the QModelIndex assocated with the given item. + + :type item: QtWidgets.QTreeWidgetItem. + :rtype: QtCore.QModelIndex + """ + return self._treeWidget.indexFromItem(item) + + def selectionModel(self): + """ + Return the current selection model. + + :rtype: QtWidgets.QItemSelectionModel + """ + return self._treeWidget.selectionModel() + + def selectedItem(self): + """ + Return the last selected non-hidden item. + + :rtype: QtWidgets.QTreeWidgetItem + """ + return self._treeWidget.selectedItem() + + def selectedItems(self): + """ + Return a list of all selected non-hidden items. + + :rtype: list[QtWidgets.QTreeWidgetItem] + """ + return self._treeWidget.selectedItems() + + def setItemHidden(self, item, value): + """ + Set the visibility of given item. + + :type item: QtWidgets.QTreeWidgetItem + :type value: bool + :rtype: None + """ + item.setHidden(value) + + def setItemsHidden(self, items, value): + """ + Set the visibility of given items. + + :type items: list[QtWidgets.QTreeWidgetItem] + :type value: bool + :rtype: None + """ + for item in items: + self.setItemHidden(item, value) + + def selectedPaths(self): + """ + Return the selected item paths. + + :rtype: list[str] + """ + paths = [] + for item in self.selectedItems(): + path = item.url().toLocalFile() + paths.append(path) + return paths + + def selectPaths(self, paths): + """ + Selected the items that have the given paths. + + :type paths: list[str] + :rtype: None + """ + for item in self.items(): + path = item.id() + if path in paths: + item.setSelected(True) + + def selectItems(self, items): + """ + Select the given items. + + :type items: list[studiolibrary.LibraryItem] + :rtype: None + """ + paths = [item.id() for item in items] + self.selectPaths(paths) + + def isIconView(self): + """ + Return True if widget is in Icon mode. + + :rtype: bool + """ + return not self._listView.isHidden() + + def isTableView(self): + """ + Return True if widget is in List mode. + + :rtype: bool + """ + return not self._treeWidget.isHidden() + + def setViewMode(self, mode): + """ + Set the view mode for this widget. + + :type mode: str + :rtype: None + """ + if mode == self.IconMode: + self.setZoomAmount(self.DEFAULT_MIN_ICON_SIZE) + elif mode == self.TableMode: + self.setZoomAmount(self.DEFAULT_MIN_ICON_SIZE) + + def _setViewMode(self, mode): + """ + Set the view mode for this widget. + + :type mode: str + :rtype: None + """ + if mode == self.IconMode: + self.setIconMode() + elif mode == self.TableMode: + self.setListMode() + + def setListMode(self): + """ + Set the tree widget visible. + + :rtype: None + """ + self._listView.hide() + self._treeWidget.show() + self._treeWidget.setFocus() + + def setIconMode(self): + """ + Set the list view visible. + + :rtype: None + """ + self._treeWidget.hide() + self._listView.show() + self._listView.setFocus() + + def zoomAmount(self): + """ + Return the zoom amount for the widget. + + :rtype: int + """ + return self._zoomAmount + + def setZoomAmount(self, value): + """ + Set the zoom amount for the widget. + + :type value: int + :rtype: None + """ + if value < self.DEFAULT_MIN_LIST_SIZE: + value = self.DEFAULT_MIN_LIST_SIZE + + self._zoomAmount = value + size = QtCore.QSize(value * self.dpi(), value * self.dpi()) + self.setIconSize(size) + + if value >= self.DEFAULT_MIN_ICON_SIZE: + self._setViewMode(self.IconMode) + else: + self._setViewMode(self.TableMode) + + columnWidth = value * self.dpi() + self.itemTextHeight() + + self._treeWidget.setIndentation(0) + self._treeWidget.setColumnWidth(0, columnWidth) + self.scrollToSelectedItem() + + msg = "Size: {0}%".format(value) + self.showToastMessage(msg) + + def wheelEvent(self, event): + """ + Triggered on any wheel events for the current viewport. + + :type event: QtWidgets.QWheelEvent + :rtype: None + """ + modifier = QtWidgets.QApplication.keyboardModifiers() + + validModifiers = ( + QtCore.Qt.AltModifier, + QtCore.Qt.ControlModifier, + ) + + if modifier in validModifiers: + numDegrees = event.angleDelta().y() / 8 + numSteps = numDegrees / 15 + + delta = (numSteps * self.wheelScrollStep()) + value = self.zoomAmount() + delta + self.setZoomAmount(value) + + def setTextColor(self, color): + """ + Set the item text color. + + :type color: QtWidgets.QtColor + """ + self._textColor = color + + def setTextSelectedColor(self, color): + """ + Set the text color when an item is selected. + + :type color: QtWidgets.QtColor + """ + self._textSelectedColor = color + + def setBackgroundColor(self, color): + """ + Set the item background color. + + :type color: QtWidgets.QtColor + """ + self._backgroundColor = color + + def setItemBackgroundColor(self, color): + """ + Set the item background color. + + :type color: QtWidgets.QtColor + """ + self._itemBackgroundColor = color + + def setBackgroundHoverColor(self, color): + """ + Set the background color when the mouse hovers over the item. + + :type color: QtWidgets.QtColor + """ + self._backgroundHoverColor = color + + def setBackgroundSelectedColor(self, color): + """ + Set the background color when an item is selected. + + :type color: QtWidgets.QtColor + """ + self._backgroundSelectedColor = color + self._listView.setRubberBandColor(QtGui.QColor(200, 200, 200, 255)) + + def textColor(self): + """ + Return the item text color. + + :rtype: QtGui.QColor + """ + return self._textColor + + def textSelectedColor(self): + """ + Return the item text color when selected. + + :rtype: QtGui.QColor + """ + return self._textSelectedColor + + def backgroundColor(self): + """ + Return the item background color. + + :rtype: QtWidgets.QtColor + """ + return self._backgroundColor + + def itemBackgroundColor(self): + """ + Return the item background color. + + :rtype: QtWidgets.QtColor + """ + return self._itemBackgroundColor + + def backgroundHoverColor(self): + """ + Return the background color for when the mouse is over an item. + + :rtype: QtWidgets.QtColor + """ + return self._backgroundHoverColor + + def backgroundSelectedColor(self): + """ + Return the background color when an item is selected. + + :rtype: QtWidgets.QtColor + """ + return self._backgroundSelectedColor diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/itemswidget/itemviewmixin.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/itemswidget/itemviewmixin.py new file mode 100644 index 0000000..ad6f550 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/itemswidget/itemviewmixin.py @@ -0,0 +1,306 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +import logging + +from studiovendor.Qt import QtCore +from studiovendor.Qt import QtWidgets + +import studioqt + + +logger = logging.getLogger(__name__) + + +class ItemViewMixin(object): + + """ + The ItemViewMixin class is a mixin for any widgets that + inherit from the QAbstractItemView class. This class should be used + for similar methods between views. + """ + + def __init__(self, *args): + self._hoverItem = None + self._mousePressButton = None + self._currentItem = None + self._currentSelection = [] + + def cleanDirtyObjects(self): + """ + Remove any objects that may have been deleted. + + :rtype: None + """ + if self._currentItem: + try: + self._currentItem.text(0) + except RuntimeError: + self._hoverItem = None + self._currentItem = None + self._currentSelection = None + + def itemsWidget(self): + """ + Return True if a control modifier is currently active. + + :rtype: studioqt.ItemsWidget + """ + return self.parent() + + def isControlModifier(self): + """ + Return True if a control modifier is currently active. + + :rtype: bool + """ + modifiers = QtWidgets.QApplication.keyboardModifiers() + isAltModifier = modifiers == QtCore.Qt.AltModifier + isControlModifier = modifiers == QtCore.Qt.ControlModifier + return isAltModifier or isControlModifier + + def itemsFromIndexes(self, indexes): + """ + Return a list of Tree Widget Items assocated with the given indexes. + + :type indexes: list[QtCore.QModelIndex] + :rtype: list[QtWidgets.QTreeWidgetItem] + """ + items = {} + for index in indexes: + item = self.itemFromIndex(index) + items[id(item)] = item + + return items.values() + + def selectionChanged(self, selected, deselected): + """ + Triggered when the current item has been selected or deselected. + + :type selected: QtWidgets.QItemSelection + :type deselected: QtWidgets.QItemSelection + """ + selectedItems_ = self.selectedItems() + + if self._currentSelection != selectedItems_: + self._currentSelection = selectedItems_ + + indexes1 = selected.indexes() + selectedItems = self.itemsFromIndexes(indexes1) + + indexes2 = deselected.indexes() + deselectedItems = self.itemsFromIndexes(indexes2) + + items = list(selectedItems) + list(deselectedItems) + for item in items: + item.selectionChanged() + # + QtWidgets.QAbstractItemView.selectionChanged(self, selected, deselected) + + def mousePressButton(self): + """ + Return the mouse button that has been pressed. + + :rtype: None or QtCore.Qt.MouseButton + """ + return self._mousePressButton + + def wheelEvent(self, event): + """ + Triggered on any wheel events for the current viewport. + + :type event: QtWidgets.QWheelEvent + :rtype: None + """ + if self.isControlModifier(): + event.ignore() + else: + QtWidgets.QAbstractItemView.wheelEvent(self, event) + + item = self.itemAt(QtCore.QPoint(event.position().toPoint())) + self.itemUpdateEvent(item, event) + + def keyPressEvent(self, event): + """ + Triggered on user key press events for the current viewport. + + :type event: QtCore.QKeyEvent + :rtype: None + """ + item = self.selectedItem() + if item: + self.itemKeyPressEvent(item, event) + + validKeys = [ + QtCore.Qt.Key_Up, + QtCore.Qt.Key_Left, + QtCore.Qt.Key_Down, + QtCore.Qt.Key_Right, + ] + + if event.isAccepted(): + if event.key() in validKeys: + QtWidgets.QAbstractItemView.keyPressEvent(self, event) + + def mousePressEvent(self, event): + """ + Triggered on user mouse press events for the current viewport. + + :type event: QtWidgets.QMouseEvent + :rtype: None + """ + self._mousePressButton = event.button() + + item = self.itemAt(event.pos()) + + if item: + self.itemMousePressEvent(item, event) + + QtWidgets.QAbstractItemView.mousePressEvent(self, event) + + def mouseReleaseEvent(self, event): + """ + Triggered on user mouse release events for the current viewport. + + :type event: QtWidgets.QMouseEvent + :rtype: None + """ + self._mousePressButton = None + + item = self.selectedItem() + if item: + self.itemMouseReleaseEvent(item, event) + + def mouseMoveEvent(self, event): + """ + Triggered on user mouse move events for the current viewport. + + :type event: QtCore.QMouseEvent + :rtype: None + """ + if self._mousePressButton == QtCore.Qt.MiddleButton: + item = self.selectedItem() + else: + item = self.itemAt(event.pos()) + + self.itemUpdateEvent(item, event) + + def leaveEvent(self, event): + """ + Triggered when the mouse leaves the widget. + + :type event: QtCore.QMouseEvent + :rtype: None + """ + if self._mousePressButton != QtCore.Qt.MiddleButton: + self.itemUpdateEvent(None, event) + + QtWidgets.QAbstractItemView.leaveEvent(self, event) + + def itemUpdateEvent(self, item, event): + """ + Triggered on user key press events for the current viewport. + + :type item: studioqt.Item + :type event: QtCore.QKeyEvent + :rtype: None + """ + self.cleanDirtyObjects() + + if id(self._currentItem) != id(item): + + if self._currentItem: + self.itemMouseLeaveEvent(self._currentItem, event) + self._currentItem = None + + if item and not self._currentItem: + self._currentItem = item + self.itemMouseEnterEvent(item, event) + + if self._currentItem: + self.itemMouseMoveEvent(item, event) + + def itemMouseEnterEvent(self, item, event): + """ + Triggered when the mouse enters the given item. + + :type item: QtWidgets.QTreeWidgetItem + :type event: QtWidgets.QMouseEvent + :rtype: None + """ + item.mouseEnterEvent(event) + logger.debug("Mouse Enter: " + item.text(0)) + + def itemMouseLeaveEvent(self, item, event): + """ + Triggered when the mouse leaves the given item. + + :type item: QtWidgets.QTreeWidgetItem + :type event: QtWidgets.QMouseEvent + :rtype: None + """ + item.mouseLeaveEvent(event) + logger.debug("Mouse Leave: " + item.text(0)) + + def itemMouseMoveEvent(self, item, event): + """ + Triggered when the mouse moves within the given item. + + :type item: QtWidgets.QTreeWidgetItem + :type event: QtWidgets.QMouseEvent + :rtype: None + """ + item.mouseMoveEvent(event) + + def itemMousePressEvent(self, item, event): + """ + Triggered when the mouse is pressed on the given item. + + :type item: QtWidgets.QTreeWidgetItem + :type event: QtWidgets.QMouseEvent + :rtype: None + """ + item.mousePressEvent(event) + logger.debug("Mouse Press: " + item.text(0)) + + def itemMouseReleaseEvent(self, item, event): + """ + Triggered when the mouse is released on the given item. + + :type item: QtWidgets.QTreeWidgetItem + :type event: QtWidgets.QMouseEvent + :rtype: None + """ + item.mouseReleaseEvent(event) + logger.debug("Mouse Released: " + item.text(0)) + + def itemKeyPressEvent(self, item, event): + """ + Triggered when a key is pressed for the selected item. + + :type item: QtWidgets.QTreeWidgetItem + :type event: QtWidgets.QKeyEvent + :rtype: None + """ + item.keyPressEvent(event) + logger.debug("Key Press: " + item.text(0)) + + def itemKeyReleaseEvent(self, item, event): + """ + Triggered when a key is released for the selected item. + + :type item: QtWidgets.QTreeWidgetItem + :type event: QtWidgets.QKeyEvent + :rtype: None + """ + item.keyReleaseEvent(event) + logger.debug("Key Release: " + item.text(0)) diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/itemswidget/listview.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/itemswidget/listview.py new file mode 100644 index 0000000..c58bd80 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/itemswidget/listview.py @@ -0,0 +1,630 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +import logging + +from studiovendor.Qt import QtGui +from studiovendor.Qt import QtCore +from studiovendor.Qt import QtWidgets + + +from .itemviewmixin import ItemViewMixin + + +logger = logging.getLogger(__name__) + + +class ListView(ItemViewMixin, QtWidgets.QListView): + + itemMoved = QtCore.Signal(object) + itemDropped = QtCore.Signal(object) + itemClicked = QtCore.Signal(object) + itemDoubleClicked = QtCore.Signal(object) + + DEFAULT_DRAG_THRESHOLD = 10 + + def __init__(self, *args): + QtWidgets.QListView.__init__(self, *args) + ItemViewMixin.__init__(self) + + self._treeWidget = None + self._rubberBand = None + self._rubberBandStartPos = None + self._rubberBandColor = QtGui.QColor(QtCore.Qt.white) + self._customSortOrder = [] + + self._drag = None + self._dragStartPos = None + self._dragStartIndex = None + self._dropEnabled = True + + self.setSpacing(5) + + self.setMouseTracking(True) + self.setSelectionRectVisible(True) + self.setViewMode(QtWidgets.QListView.IconMode) + self.setResizeMode(QtWidgets.QListView.Adjust) + self.setSelectionMode(QtWidgets.QListWidget.ExtendedSelection) + self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) + + self.setAcceptDrops(True) + self.setDragEnabled(True) + self.setDragDropMode(QtWidgets.QAbstractItemView.DragDrop) + + self.clicked.connect(self._indexClicked) + self.doubleClicked.connect(self._indexDoubleClicked) + + def _indexClicked(self, index): + """ + Triggered when the user clicks on an index. + + :type index: QtCore.QModelIndex + :rtype: None + """ + item = self.itemFromIndex(index) + item.clicked() + self.setItemsSelected([item], True) + self.itemClicked.emit(item) + + def _indexDoubleClicked(self, index): + """ + Triggered when the user double clicks on an index. + + :type index: QtCore.QModelIndex + :rtype: None + """ + item = self.itemFromIndex(index) + self.setItemsSelected([item], True) + item.doubleClicked() + self.itemDoubleClicked.emit(item) + + def treeWidget(self): + """ + Return the tree widget that contains the item. + + :rtype: QtWidgets.QTreeWidget + """ + return self._treeWidget + + def setTreeWidget(self, treeWidget): + """ + Set the tree widget that contains the item. + + :type treeWidget: QtWidgets.QTreeWidget + :rtype: None + """ + self._treeWidget = treeWidget + self.setModel(treeWidget.model()) + self.setSelectionModel(treeWidget.selectionModel()) + + def scrollToItem(self, item, pos=None): + """ + Ensures that the item is visible. + + :type item: QtWidgets.QTreeWidgetItem + :type pos: QtCore.QPoint or None + :rtype: None + """ + index = self.indexFromItem(item) + pos = pos or QtWidgets.QAbstractItemView.PositionAtCenter + + self.scrollTo(index, pos) + + def items(self): + """ + Return all the items. + + :rtype: list[QtWidgets.QTreeWidgetItem] + """ + return self.treeWidget().items() + + def itemAt(self, pos): + """ + Return a pointer to the item at the coordinates p. + + The coordinates are relative to the tree widget's viewport(). + + :type pos: QtCore.QPoint + :rtype: QtWidgets.QTreeWidgetItem + """ + index = self.indexAt(pos) + return self.itemFromIndex(index) + + def indexFromItem(self, item): + """ + Return the QModelIndex assocated with the given item. + + :type item: QtWidgets.QTreeWidgetItem. + :rtype: QtCore.QModelIndex + """ + return self.treeWidget().indexFromItem(item) + + def itemFromIndex(self, index): + """ + Return a pointer to the QTreeWidgetItem assocated with the given index. + + :type index: QtCore.QModelIndex + :rtype: QtWidgets.QTreeWidgetItem + """ + return self.treeWidget().itemFromIndex(index) + + def insertItem(self, row, item): + """ + Inserts the item at row in the top level in the view. + + :type row: int + :type item: QtWidgets.QTreeWidgetItem + :rtype: None + """ + self.treeWidget().insertTopLevelItem(row, item) + + def takeItems(self, items): + """ + Removes and returns the items from the view + + :type items: list[QtWidgets.QTreeWidgetItem] + :rtype: list[QtWidgets.QTreeWidgetItem] + """ + for item in items: + row = self.treeWidget().indexOfTopLevelItem(item) + self.treeWidget().takeTopLevelItem(row) + + return items + + def selectedItem(self): + """ + Return the last selected non-hidden item. + + :rtype: QtWidgets.QTreeWidgetItem + """ + return self.treeWidget().selectedItem() + + def selectedItems(self): + """ + Return a list of all selected non-hidden items. + + :rtype: list[QtWidgets.QTreeWidgetItem] + """ + return self.treeWidget().selectedItems() + + def setIndexesSelected(self, indexes, value): + """ + Set the selected state for the given indexes. + + :type indexes: list[QtCore.QModelIndex] + :type value: bool + :rtype: None + """ + items = self.itemsFromIndexes(indexes) + self.setItemsSelected(items, value) + + def setItemsSelected(self, items, value): + """ + Set the selected state for the given items. + + :type items: list[studioqt.WidgetItem] + :type value: bool + :rtype: None + """ + self.treeWidget().blockSignals(True) + for item in items: + item.setSelected(value) + self.treeWidget().blockSignals(False) + + def moveItems(self, items, itemAt): + """ + Move the given items to the position of the destination row. + + :type items: list[studioqt.Item] + :type itemAt: studioqt.Item + :rtype: None + """ + scrollValue = self.verticalScrollBar().value() + + self.treeWidget().moveItems(items, itemAt) + self.itemMoved.emit(items[-1]) + + self.verticalScrollBar().setValue(scrollValue) + + # --------------------------------------------------------------------- + # Support for a custom colored rubber band. + # --------------------------------------------------------------------- + + def createRubberBand(self): + """ + Create a new instance of the selection rubber band. + + :rtype: QtWidgets.QRubberBand + """ + rubberBand = QtWidgets.QRubberBand(QtWidgets.QRubberBand.Rectangle, self) + palette = QtGui.QPalette() + color = self.rubberBandColor() + palette.setBrush(QtGui.QPalette.Highlight, QtGui.QBrush(color)) + rubberBand.setPalette(palette) + return rubberBand + + def setRubberBandColor(self, color): + """ + Set the color for the rubber band. + + :type color: QtGui.QColor + :rtype: None + """ + self._rubberBand = None + self._rubberBandColor = color + + def rubberBandColor(self): + """ + Return the rubber band color for this widget. + + :rtype: QtGui.QColor + """ + return self._rubberBandColor + + def rubberBand(self): + """ + Return the selection rubber band for this widget. + + :rtype: QtWidgets.QRubberBand + """ + if not self._rubberBand: + self.setSelectionRectVisible(False) + self._rubberBand = self.createRubberBand() + + return self._rubberBand + + # --------------------------------------------------------------------- + # Events + # --------------------------------------------------------------------- + + def validateDragEvent(self, event): + """ + Validate the drag event. + + :type event: QtWidgets.QMouseEvent + :rtype: bool + """ + return QtCore.Qt.LeftButton == event.mouseButtons() + + def mousePressEvent(self, event): + """ + Triggered when the user presses the mouse button for the viewport. + + :type event: QtWidgets.QMouseEvent + :rtype: None + """ + item = self.itemAt(event.pos()) + if not item: + self.clearSelection() + + ItemViewMixin.mousePressEvent(self, event) + if event.isAccepted(): + QtWidgets.QListView.mousePressEvent(self, event) + if item: + item.setSelected(True) + + self.endDrag() + self._dragStartPos = event.pos() + + isLeftButton = self.mousePressButton() == QtCore.Qt.LeftButton + isItemDraggable = item and item.dragEnabled() + isSelectionEmpty = not self.selectedItems() + + if isLeftButton and (isSelectionEmpty or not isItemDraggable): + self.rubberBandStartEvent(event) + + def mouseMoveEvent(self, event): + """ + Triggered when the user moves the mouse over the current viewport. + + :type event: QtWidgets.QMouseEvent + :rtype: None + """ + if not self.isDraggingItems(): + + isLeftButton = self.mousePressButton() == QtCore.Qt.LeftButton + + if isLeftButton and self.rubberBand().isHidden() and self.selectedItems(): + self.startDrag(event) + else: + ItemViewMixin.mouseMoveEvent(self, event) + QtWidgets.QListView.mouseMoveEvent(self, event) + + if isLeftButton: + self.rubberBandMoveEvent(event) + + def mouseReleaseEvent(self, event): + """ + Triggered when the user releases the mouse button for this viewport. + + :type event: QtWidgets.QMouseEvent + :rtype: None + """ + item = self.itemAt(event.pos()) + items = self.selectedItems() + + ItemViewMixin.mouseReleaseEvent(self, event) + + if item not in items: + if event.button() != QtCore.Qt.MiddleButton: + QtWidgets.QListView.mouseReleaseEvent(self, event) + elif not items: + QtWidgets.QListView.mouseReleaseEvent(self, event) + + self.endDrag() + self.rubberBand().hide() + + def rubberBandStartEvent(self, event): + """ + Triggered when the user presses an empty area. + + :type event: QtWidgets.QMouseEvent + :rtype: None + """ + self._rubberBandStartPos = event.pos() + rect = QtCore.QRect(self._rubberBandStartPos, QtCore.QSize()) + + rubberBand = self.rubberBand() + rubberBand.setGeometry(rect) + rubberBand.show() + + def rubberBandMoveEvent(self, event): + """ + Triggered when the user moves the mouse over the current viewport. + + :type event: QtWidgets.QMouseEvent + :rtype: None + """ + if self.rubberBand() and self._rubberBandStartPos: + rect = QtCore.QRect(self._rubberBandStartPos, event.pos()) + rect = rect.normalized() + self.rubberBand().setGeometry(rect) + + # ----------------------------------------------------------------------- + # Support for drag and drop + # ----------------------------------------------------------------------- + + def rowAt(self, pos): + """ + Return the row for the given pos. + + :type pos: QtCore.QPoint + :rtype: int + """ + return self.treeWidget().rowAt(pos) + + def itemsFromUrls(self, urls): + """ + Return items from the given url objects. + + :type urls: list[QtCore.QUrl] + :rtype: list[studioqt.Item] + """ + items = [] + for url in urls: + item = self.itemFromUrl(url) + if item: + items.append(item) + return items + + def itemFromUrl(self, url): + """ + Return the item from the given url object. + + :type url: QtCore.QUrl + :rtype: studioqt.Item + """ + return self.itemFromPath(url.path()) + + def itemsFromPaths(self, paths): + """ + Return the items from the given paths. + + :type paths: list[str] + :rtype: list[studioqt.Item] + """ + items = [] + for path in paths: + item = self.itemFromPath(path) + if item: + items.append(item) + return items + + def itemFromPath(self, path): + """ + Return the item from the given path. + + :type path: str + :rtype: studioqt.Item + """ + for item in self.items(): + path_ = item.url().path() + if path_ and path_ == path: + return item + + def setDropEnabled(self, value): + """ + :type value: bool + :rtype: None + """ + self._dropEnabled = value + + def dropEnabled(self): + """ + :rtype: bool + """ + return self._dropEnabled + + def dragThreshold(self): + """ + :rtype: int + """ + return self.DEFAULT_DRAG_THRESHOLD + + def mimeData(self, items): + """ + :type items: list[studioqt.Item] + :rtype: QtCore.QMimeData + """ + mimeData = QtCore.QMimeData() + + urls = [item.url() for item in items] + text = "\n".join([item.mimeText() for item in items]) + + mimeData.setUrls(urls) + mimeData.setText(text) + + return mimeData + + def dropEvent(self, event): + """ + This event handler is called when the drag is dropped on this widget. + + :type event: QtWidgets.QDropEvent + :rtype: None + """ + item = self.itemAt(event.pos()) + selectedItems = self.selectedItems() + + if selectedItems and item: + if self.treeWidget().isSortByCustomOrder(): + self.moveItems(selectedItems, item) + else: + msg = "You can only re-order items when sorting by custom order." + logger.info(msg) + + if item: + item.dropEvent(event) + + self.itemDropped.emit(event) + + def dragMoveEvent(self, event): + """ + This event handler is called if a drag is in progress. + + :type event: QtGui.QDragMoveEvent + :rtype: None + """ + mimeData = event.mimeData() + + if (mimeData.hasText() or mimeData.hasUrls()) and self.dropEnabled(): + event.accept() + else: + event.ignore() + + def dragEnterEvent(self, event): + """ + This event handler is called when the mouse enters this widget + while a drag is in pregress. + + :type event: QtGui.QDragEnterEvent + :rtype: None + """ + mimeData = event.mimeData() + + if (mimeData.hasText() or mimeData.hasUrls()) and self.dropEnabled(): + event.accept() + else: + event.ignore() + + def isDraggingItems(self): + """ + Return true if the user is currently dragging items. + + :rtype: bool + """ + return bool(self._drag) + + def startDrag(self, event): + """ + Starts a drag using the given event. + + :type event: QtCore.QEvent + :rtype: None + """ + if not self.dragEnabled(): + return + + if self._dragStartPos and hasattr(event, "pos"): + + item = self.itemAt(event.pos()) + + if item and item.dragEnabled(): + + self._dragStartIndex = self.indexAt(event.pos()) + + point = self._dragStartPos - event.pos() + dt = self.dragThreshold() + + if point.x() > dt or point.y() > dt or point.x() < -dt or point.y() < -dt: + + items = self.selectedItems() + mimeData = self.mimeData(items) + + pixmap = self.dragPixmap(item, items) + hotSpot = QtCore.QPoint(pixmap.width() / 2, pixmap.height() / 2) + + self._drag = QtGui.QDrag(self) + self._drag.setPixmap(pixmap) + self._drag.setHotSpot(hotSpot) + self._drag.setMimeData(mimeData) + self._drag.exec_(QtCore.Qt.MoveAction) + + def endDrag(self): + """ + Ends the current drag. + + :rtype: None + """ + logger.debug("End Drag") + self._dragStartPos = None + self._dragStartIndex = None + if self._drag: + del self._drag + self._drag = None + + def dragPixmap(self, item, items): + """ + Show the drag pixmap for the given item. + + :type item: studioqt.Item + :type items: list[studioqt.Item] + + :rtype: QtGui.QPixmap + """ + rect = self.visualRect(self.indexFromItem(item)) + + # pixmap = QtGui.QPixmap() + pixmap = self.grab(rect) + + if len(items) > 1: + cWidth = 35 + cPadding = 5 + cText = str(len(items)) + cX = pixmap.rect().center().x() - float(cWidth / 2) + cY = pixmap.rect().top() + cPadding + cRect = QtCore.QRect(cX, cY, cWidth, cWidth) + + painter = QtGui.QPainter(pixmap) + painter.setRenderHint(QtGui.QPainter.Antialiasing) + + painter.setPen(QtCore.Qt.NoPen) + painter.setBrush(self.itemsWidget().backgroundSelectedColor()) + painter.drawEllipse(cRect.center(), float(cWidth / 2), + float(cWidth / 2)) + + font = QtGui.QFont('Serif', 12, QtGui.QFont.Light) + painter.setFont(font) + painter.setPen(self.itemsWidget().textSelectedColor()) + painter.drawText(cRect, QtCore.Qt.AlignCenter, str(cText)) + + return pixmap diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/itemswidget/treewidget.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/itemswidget/treewidget.py new file mode 100644 index 0000000..61b8fa5 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/itemswidget/treewidget.py @@ -0,0 +1,685 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +import logging +from functools import partial + +from studiovendor.Qt import QtGui +from studiovendor.Qt import QtCore +from studiovendor.Qt import QtWidgets +from studiovendor import six + +import studioqt + +from .groupitem import GroupItem +from .itemviewmixin import ItemViewMixin + + +logger = logging.getLogger(__name__) + + +class TreeWidget(ItemViewMixin, QtWidgets.QTreeWidget): + + itemSliderMoved = QtCore.Signal(object, object) + itemSliderReleased = QtCore.Signal(object, object) + + def __init__(self, *args): + QtWidgets.QTreeWidget.__init__(self, *args) + ItemViewMixin.__init__(self) + + self._headerLabels = [] + self._hiddenColumns = {} + + self.setAutoScroll(False) + self.setMouseTracking(True) + self.setSortingEnabled(False) + self.setSelectionMode(QtWidgets.QListWidget.ExtendedSelection) + self.setVerticalScrollMode(QtWidgets.QAbstractItemView.ScrollPerPixel) + + header = self.header() + header.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) + header.customContextMenuRequested.connect(self.showHeaderMenu) + + self.itemClicked.connect(self._itemClicked) + self.itemDoubleClicked.connect(self._itemDoubleClicked) + + def _itemSliderMoved(self, item, value): + self.itemSliderMoved.emit(item, value) + + def _itemSliderReleased(self, item, value): + self.itemSliderReleased.emit(item, value) + + def drawRow(self, painter, options, index): + item = self.itemFromIndex(index) + item.paintRow(painter, options, index) + + def settings(self): + """ + Return the current state of the widget. + + :rtype: dict + """ + settings = {} + + # settings["headerState"] = self.header().saveState() + + settings["columnSettings"] = self.columnSettings() + + return settings + + def setSettings(self, settings): + """ + Set the current state of the widget. + + :type settings: dict + :rtype: None + """ + columnSettings = settings.get("columnSettings", {}) + self.setColumnSettings(columnSettings) + + return settings + + def _itemClicked(self, item): + """ + Triggered when the user clicks on an item. + + :type item: QtWidgets.QTreeWidgetItem + :rtype: None + """ + item.clicked() + + def _itemDoubleClicked(self, item): + """ + Triggered when the user double clicks on an item. + + :type item: QtWidgets.QTreeWidgetItem + :rtype: None + """ + item.doubleClicked() + + def clear(self, *args): + """ + Reimplementing so that all dirty objects can be removed. + + :param args: + :rtype: None + """ + QtWidgets.QTreeWidget.clear(self, *args) + self.cleanDirtyObjects() + + def setItems(self, items): + selectedItems = self.selectedItems() + self.takeTopLevelItems() + self.addTopLevelItems(items) + self.setItemsSelected(selectedItems, True) + + def setItemsSelected(self, items, value, scrollTo=True): + """ + Select the given items. + + :type items: list[studioqt.ItemsWidget] + :type value: bool + :type scrollTo: bool + + :rtype: None + """ + for item in items: + item.setSelected(value) + + if scrollTo: + self.itemsWidget().scrollToSelectedItem() + + def selectedItem(self): + """ + Return the last selected non-hidden item. + + :rtype: studioqt.Item + """ + items = self.selectedItems() + + if items: + return items[-1] + + return None + + def selectedItems(self): + """ + Return all the selected items. + + :rtype: list[studioqt.Item] + """ + items = [] + items_ = QtWidgets.QTreeWidget.selectedItems(self) + + for item in items_: + if not isinstance(item, GroupItem): + items.append(item) + + return items + + def rowAt(self, pos): + """ + Return the row for the given pos. + + :type pos: QtCore.QPoint + :rtype: int + """ + item = self.itemAt(pos) + return self.itemRow(item) + + def itemRow(self, item): + """ + Return the row for the given item. + + :type item: studioqt.TreeWidgetItem + :rtype: int + """ + index = self.indexFromItem(item) + return index.row() + + def items(self): + """ + Return a list of all the items in the tree widget. + + :rtype: lsit[studioqt.TreeWidgetItem] + """ + items = [] + + for item in self._items(): + if not isinstance(item, GroupItem): + items.append(item) + + return items + + def _items(self): + """ + Return a list of all the items in the tree widget. + + :rtype: lsit[studioqt.TreeWidgetItem] + """ + return self.findItems( + "*", + QtCore.Qt.MatchWildcard | QtCore.Qt.MatchRecursive + ) + + def takeTopLevelItems(self): + """ + Take all items from the tree widget. + + :rtype: list[QtWidgets.QTreeWidgetItem] + """ + items = [] + for item in self._items(): + # For some reason its faster to take from index 1. + items.append(self.takeTopLevelItem(1)) + items.append(self.takeTopLevelItem(0)) + return items + + def textFromColumn(self, column, split=None, duplicates=False): + """ + Return all the data for the given column + + :type column: int or str + :type split: str + :type duplicates: bool + :rtype: list[str] + """ + items = self.items() + results = self.textFromItems( + items, + column, + split=split, + duplicates=duplicates, + ) + return results + + def textFromItems(self, items, column, split=None, duplicates=False): + """ + Return all the text data for the given items and given column + + :type items: list[Item] + :type column: int or str + :type split: str + :type duplicates: bool + :rtype: list[str] + """ + results = [] + + for item in items: + text = item.text(column) + + if text and split: + results.extend(text.split(split)) + elif text: + results.append(text) + + if not duplicates: + results = list(set(results)) + + return results + + def columnLabels(self): + """ + Return all header labels for the tree widget. + + :rtype: list[str] + """ + return self.headerLabels() + + def labelFromColumn(self, column): + """ + Return the column label for the given column. + + :type column: int + :rtype: str + """ + if column is not None: + return self.headerItem().text(column) + + def headerLabels(self): + """ + Return all the header labels. + + :rtype: str + """ + return self._headerLabels + + def isHeaderLabel(self, label): + """ + Return True if the given label is a valid header label. + + :type label: str + :rtype: None + """ + return label in self._headerLabels + + def _removeDuplicates(self, labels): + """ + Removes duplicates from a list in Python, whilst preserving order. + + :type labels: list[str] + :rtype: list[str] + """ + s = set() + sadd = s.add + return [x for x in labels if x.strip() and not (x in s or sadd(x))] + + def setHeaderLabels(self, labels): + """ + Set the header for each item in the given label list. + + :type labels: list[str] + :rtype: None + """ + labels = self._removeDuplicates(labels) + + if "Custom Order" not in labels: + labels.append("Custom Order") + + self.setColumnHidden("Custom Order", True) + + columnSettings = self.columnSettings() + + QtWidgets.QTreeWidget.setHeaderLabels(self, labels) + + self._headerLabels = labels + self.updateColumnHidden() + + self.setColumnSettings(columnSettings) + + def columnFromLabel(self, label): + """ + Return the column for the given label. + + :type label: str + :rtype: int + """ + try: + return self._headerLabels.index(label) + except ValueError: + return -1 + + def showAllColumns(self): + """ + Show all available columns. + + :rtype: None + """ + for column in range(self.columnCount()): + self.setColumnHidden(column, False) + + def hideAllColumns(self): + """ + Hide all available columns. + + :rtype: None + """ + for column in range(1, self.columnCount()): + self.setColumnHidden(column, True) + + def updateColumnHidden(self): + """ + Update the hidden state for all the current columns. + + :rtype: None + """ + self.showAllColumns() + columnLabels = self._hiddenColumns.keys() + + for columnLabel in columnLabels: + self.setColumnHidden(columnLabel, self._hiddenColumns[columnLabel]) + + def setColumnHidden(self, column, value): + """ + Set the give column to show or hide depending on the specified value. + + :type column: int or str + :type value: bool + :rtype: None + """ + if isinstance(column, six.string_types): + column = self.columnFromLabel(column) + + label = self.labelFromColumn(column) + self._hiddenColumns[label] = value + + QtWidgets.QTreeWidget.setColumnHidden(self, column, value) + + # Make sure the column is not collapsed + width = self.columnWidth(column) + if width < 5: + width = 100 + self.setColumnWidth(column, width) + + def resizeColumnToContents(self, column): + """ + Resize the given column to the data of that column. + + :type column: int or text + :rtype: None + """ + width = 0 + for item in self.items(): + text = item.text(column) + font = item.font(column) + metrics = QtGui.QFontMetricsF(font) + textWidth = metrics.width(text) + item.padding() + width = max(width, textWidth) + + self.setColumnWidth(column, width) + + # ---------------------------------------------------------------------- + # Support for custom orders + # ---------------------------------------------------------------------- + + def isSortByCustomOrder(self): + """ + Return true if items are currently sorted by custom order. + + :rtype: bool + """ + return "Custom Order" in str(self.itemsWidget().dataset().sortBy()) + + def setItemsCustomOrder(self, items, row=1, padding=5): + """ + Set the custom order for the given items by their list order. + + :rtype: None + """ + for item in items: + item.itemData()["Custom Order"] = str(row).zfill(padding) + row += 1 + + # def updateCustomOrder(self): + # """ + # Update any empty custom orders. + # + # :rtype: None + # """ + # row = 1 + # padding = 5 + # + # items = self.items() + # columnLabel = "Custom Order" + # + # for item in items: + # customOrder = item.text(columnLabel) + # + # if not customOrder: + # item.setText(columnLabel, str(row).zfill(padding)) + # row += 1 + + def itemsCustomOrder(self): + """ + Return the items sorted by the custom order data. + + :rtype: list[studioqt.Item] + """ + items = self.items() + + def sortKey(item): + return item.itemData().get("Custom Order", "00000") + + customOrder = sorted(items, key=sortKey) + + return customOrder + + def moveItems(self, items, itemAt): + """ + Move the given items to the position of the destination row. + + :type items: list[studioqt.Item] + :type itemAt: studioqt.Item + :rtype: None + """ + row = 0 + orderedItems = self.itemsCustomOrder() + + if itemAt: + row = orderedItems.index(itemAt) + + removedItems = [] + for item in items: + index = orderedItems.index(item) + removedItems.append(orderedItems.pop(index)) + + for item in removedItems: + orderedItems.insert(row, item) + + self.setItemsCustomOrder(orderedItems) + + for item in items: + item.setSelected(True) + + self.itemsWidget().scrollToSelectedItem() + + # ---------------------------------------------------------------------- + # Support for menus + # ---------------------------------------------------------------------- + + def showHeaderMenu(self, pos): + """ + Creates and show the header menu at the cursor pos. + + :rtype: QtWidgets.QMenu + """ + header = self.header() + column = header.logicalIndexAt(pos) + + menu = self.createHeaderMenu(column) + + menu.addSeparator() + + submenu = self.createHideColumnMenu() + menu.addMenu(submenu) + + point = QtGui.QCursor.pos() + menu.exec_(point) + + def createHeaderMenu(self, column): + """ + Creates a new header menu. + + :rtype: QtWidgets.QMenu + """ + menu = QtWidgets.QMenu(self) + label = self.labelFromColumn(column) + + action = menu.addAction("Hide '{0}'".format(label)) + callback = partial(self.setColumnHidden, column, True) + action.triggered.connect(callback) + + menu.addSeparator() + + action = menu.addAction('Resize to Contents') + callback = partial(self.resizeColumnToContents, column) + action.triggered.connect(callback) + + return menu + + def columnSettings(self): + """ + Return the settings for each column. + + :rtype: dict + """ + columnSettings = {} + + for column in range(self.columnCount()): + + label = self.labelFromColumn(column) + hidden = self.isColumnHidden(column) + width = self.columnWidth(column) + + columnSettings[label] = { + "hidden": hidden, + "width": width, + "index": column, + } + + return columnSettings + + def setColumnSettings(self, settings): + """ + Set the settings for each column. + + :type settings: dict + :type: None + """ + for label in settings: + if self.isHeaderLabel(label): + column = self.columnFromLabel(label) + + width = settings[label].get("width", 100) + if width < 5: + width = 100 + self.setColumnWidth(column, width) + + hidden = settings[label].get("hidden", False) + self.setColumnHidden(column, hidden) + else: + msg = 'Cannot set the column setting for the header label "%s"' + logger.debug(msg, label) + + def createHideColumnMenu(self): + """ + Create the hide column menu. + + :rtype: QtWidgets.QMenu + """ + menu = QtWidgets.QMenu("Show/Hide Column", self) + + action = menu.addAction("Show All") + action.triggered.connect(self.showAllColumns) + + action = menu.addAction("Hide All") + action.triggered.connect(self.hideAllColumns) + + menu.addSeparator() + + for column in range(self.columnCount()): + + label = self.labelFromColumn(column) + isHidden = self.isColumnHidden(column) + + action = menu.addAction(label) + action.setCheckable(True) + action.setChecked(not isHidden) + + callback = partial(self.setColumnHidden, column, not isHidden) + action.triggered.connect(callback) + + return menu + + # ---------------------------------------------------------------------- + # Support for copying item data to the clipboard. + # ---------------------------------------------------------------------- + + def createCopyTextMenu(self): + """ + Create a menu to copy the selected items data to the clipboard. + + :rtype: QtWidgets.QMenu + """ + menu = QtWidgets.QMenu("Copy Text", self) + + if self.selectedItems(): + + for column in range(self.columnCount()): + label = self.labelFromColumn(column) + action = menu.addAction(label) + callback = partial(self.copyText, column) + action.triggered.connect(callback) + + else: + action = menu.addAction("No items selected") + action.setEnabled(False) + + return menu + + def copyText(self, column): + """ + Copy the given column text to clipboard. + + :type column: int or text + :rtype: None + """ + items = self.selectedItems() + text = "\n".join([item.text(column) for item in items]) + + clipBoard = QtWidgets.QApplication.clipboard() + clipBoard.setText(text, QtGui.QClipboard.Clipboard) + + # ---------------------------------------------------------------------- + # Override events for mixin. + # ---------------------------------------------------------------------- + + def mouseMoveEvent(self, event): + """ + Triggered when the user moves the mouse over the current viewport. + + :type event: QtWidgets.QMouseEvent + :rtype: None + """ + ItemViewMixin.mouseMoveEvent(self, event) + QtWidgets.QTreeWidget.mouseMoveEvent(self, event) + + def mouseReleaseEvent(self, event): + """ + Triggered when the user releases the mouse button on the viewport. + + :type event: QtWidgets.QMouseEvent + :rtype: None + """ + ItemViewMixin.mouseReleaseEvent(self, event) + QtWidgets.QTreeWidget.mouseReleaseEvent(self, event) + diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/librariesmenu.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/librariesmenu.py new file mode 100644 index 0000000..7a02536 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/librariesmenu.py @@ -0,0 +1,67 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . +""" +Example: + + from PySide2 import QtGui + import studiolibrary.widgets + menu = studiolibrary.widgets.LibrariesMenu() + point = QtGui.QCursor.pos() + menu.exec_(point) +""" +from functools import partial + +from studiovendor.Qt import QtWidgets + +import studiolibrary + + +class LibrariesMenu(QtWidgets.QMenu): + + def __init__(self, libraryWindow=None): + super(LibrariesMenu, self).__init__(libraryWindow) + + self.setTitle('Libraries') + + libraries = studiolibrary.readSettings() + default = studiolibrary.defaultLibrary() + + for name in libraries: + + library = libraries[name] + + path = library.get('path', '') + kwargs = library.get('kwargs', {}) + + enabled = True + if libraryWindow: + enabled = name != libraryWindow.name() + + text = name + if name == default and name.lower() != "default": + text = name + " (default)" + + action = QtWidgets.QAction(text, self) + action.setEnabled(enabled) + callback = partial(self.showLibrary, name, path, **kwargs) + action.triggered.connect(callback) + self.addAction(action) + + def showLibrary(self, name, path, **kwargs): + """ + Show the library window which has given name and path. + + :type name: str + :type path: str + :type kwargs: dict + """ + studiolibrary.main(name, path, **kwargs) diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/lightbox.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/lightbox.py new file mode 100644 index 0000000..5df1694 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/lightbox.py @@ -0,0 +1,228 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +from studiovendor.Qt import QtCore +from studiovendor.Qt import QtWidgets + +import studioqt + + +class Lightbox(QtWidgets.QFrame): + + DEFAULT_DURATION = 400 + + def __init__( + self, + parent, + widget=None, + duration=DEFAULT_DURATION, + ): + + super(Lightbox, self).__init__(parent) + self.setObjectName("lightbox") + + self._widget = None + self._accepted = False + self._rejected = False + self._animation = None + self._duration = duration + + layout = QtWidgets.QGridLayout(self) + self.setLayout(layout) + + layout.setRowStretch(0, 1) + layout.setRowStretch(1, 5) + layout.setRowStretch(2, 1) + + layout.setColumnStretch(0, 1) + layout.setColumnStretch(1, 5) + layout.setColumnStretch(2, 1) + + layout.addWidget(QtWidgets.QWidget(), 0, 0) + layout.addWidget(QtWidgets.QWidget(), 0, 1) + layout.addWidget(QtWidgets.QWidget(), 0, 2) + + layout.addWidget(QtWidgets.QWidget(), 1, 0) + layout.addWidget(QtWidgets.QWidget(), 1, 2) + + layout.addWidget(QtWidgets.QWidget(), 2, 0) + layout.addWidget(QtWidgets.QWidget(), 2, 1) + layout.addWidget(QtWidgets.QWidget(), 2, 2) + + if widget: + self.setWidget(widget) + + parent = self.parent() + parent.installEventFilter(self) + + def widget(self): + """ + Get the current widget for the light box. + + :rtype: QtWidgets.QWidget + """ + return self._widget + + def setWidget(self, widget): + """ + Set the widget for the lightbox. + + :type widget: QWidgets.QWidget + """ + if self._widget: + self.layout().removeWidget(self._widget) + + widget.setParent(self) + widget.accept = self.accept + widget.reject = self.reject + + self.layout().addWidget(widget, 1, 1) + + self._widget = widget + + def mousePressEvent(self, event): + """ + Hide the light box if the user clicks on it. + + :type event: QEvent + """ + if not self.widget().underMouse(): + self.reject() + + def eventFilter(self, object, event): + """ + Update the geometry when the parent widget changes size. + + :type object: QtWidget.QWidget + :type event: QtCore.QEvent + :rtype: bool + """ + if event.type() == QtCore.QEvent.Resize: + self.updateGeometry() + + return super(Lightbox, self).eventFilter(object, event) + + def showEvent(self, event): + """ + Fade in the dialog on show. + + :type event: QtCore.QEvent + :rtype: None + """ + self.updateGeometry() + self.fadeIn(self._duration) + + def updateGeometry(self): + """ + Update the geometry to be in the center of it's parent. + + :rtype: None + """ + self.setGeometry(self.parent().geometry()) + self.move(0, 0) + + geometry = self.geometry() + centerPoint = self.geometry().center() + geometry.moveCenter(centerPoint) + geometry.setY(geometry.y()) + + self.move(geometry.topLeft()) + + def fadeIn(self, duration=200): + """ + Fade in the dialog using the opacity effect. + + :type duration: int + :rtype: QtCore.QPropertyAnimation + """ + self._animation = studioqt.fadeIn(self, duration=duration) + return self._animation + + def fadeOut(self, duration=200): + """ + Fade out the dialog using the opacity effect. + + :type duration: int + :rtype: QtCore.QPropertyAnimation + """ + self._animation = studioqt.fadeOut(self, duration=duration) + return self._animation + + def accept(self): + """ + Triggered when the DialogButtonBox has been accepted. + + :rtype: None + """ + if not self._accepted: + self._accepted = True + animation = self.fadeOut(self._duration) + + if animation: + animation.finished.connect(self._acceptAnimationFinished) + else: + self._acceptAnimationFinished() + + def reject(self): + """ + Triggered when the DialogButtonBox has been rejected. + + :rtype: None + """ + if not self._rejected: + self._rejected = True + animation = self.fadeOut(self._duration) + + if animation: + animation.finished.connect(self._rejectAnimationFinished) + else: + self._rejectAnimationFinished() + + def _acceptAnimationFinished(self): + """ + Triggered when the animation has finished on accepted. + + :rtype: None + """ + try: + self.widget().__class__.accept(self.widget()) + finally: + self.close() + + def _rejectAnimationFinished(self): + """ + Triggered when the animation has finished on rejected. + + :rtype: None + """ + try: + self.widget().__class__.reject(self.widget()) + finally: + self.close() + + +def example(): + + widget = QtWidgets.QFrame() + widget.setStyleSheet("border-radius:3px;background-color:white;") + widget.setMinimumWidth(300) + widget.setMinimumHeight(300) + widget.setMaximumWidth(500) + + lightbox = Lightbox() + lightbox.setWidget(widget) + lightbox.show() + + +if __name__ == "__main__": + with studioqt.app(): + w = example() diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/lineedit.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/lineedit.py new file mode 100644 index 0000000..b9fa71d --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/lineedit.py @@ -0,0 +1,183 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +import logging + +from studiovendor.Qt import QtGui +from studiovendor.Qt import QtCore +from studiovendor.Qt import QtWidgets + +import studioqt +import studiolibrary + +logger = logging.getLogger(__name__) + + +class LineEdit(QtWidgets.QLineEdit): + + def __init__(self, *args): + QtWidgets.QLineEdit.__init__(self, *args) + + icon = studiolibrary.resource.icon("search.svg") + self._iconButton = QtWidgets.QPushButton(self) + self._iconButton.setObjectName("icon") + self._iconButton.clicked.connect(self._iconClicked) + self._iconButton.setIcon(icon) + self._iconButton.setStyleSheet("QPushButton{background-color: transparent;}") + + icon = studiolibrary.resource.icon("times.svg") + + self._clearButton = QtWidgets.QPushButton(self) + self._clearButton.setObjectName("clear") + self._clearButton.setCursor(QtCore.Qt.ArrowCursor) + self._clearButton.setIcon(icon) + self._clearButton.setToolTip("Clear all search text") + self._clearButton.clicked.connect(self._clearClicked) + self._clearButton.setStyleSheet("QPushButton{background-color: transparent;}") + + self.textChanged.connect(self._textChanged) + + color = studioqt.Color.fromString("rgba(250,250,250,115)") + self.setIconColor(color) + + self.update() + + def update(self): + self.updateIconColor() + self.updateClearButton() + + def _textChanged(self, text): + """ + Triggered when the text changes. + + :type text: str + :rtype: None + """ + self.updateClearButton() + + def _clearClicked(self): + """ + Triggered when the user clicks the cross icon. + + :rtype: None + """ + self.setText("") + self.setFocus() + + def _iconClicked(self): + """ + Triggered when the user clicks on the icon. + + :rtype: None + """ + if not self.hasFocus(): + self.setFocus() + + def updateClearButton(self): + """ + Update the clear button depending on the current text. + + :rtype: None + """ + text = self.text() + if text: + self._clearButton.show() + else: + self._clearButton.hide() + + def contextMenuEvent(self, event): + """ + Triggered when the user right clicks on the search widget. + + :type event: QtCore.QEvent + :rtype: None + """ + self.showContextMenu() + + def setIcon(self, icon): + """ + Set the icon for the search widget. + + :type icon: QtWidgets.QIcon + :rtype: None + """ + self._iconButton.setIcon(icon) + + def setIconColor(self, color): + """ + Set the icon color for the search widget icon. + + :type color: QtGui.QColor + :rtype: None + """ + icon = self._iconButton.icon() + icon = studioqt.Icon(icon) + icon.setColor(color) + self._iconButton.setIcon(icon) + + icon = self._clearButton.icon() + icon = studioqt.Icon(icon) + icon.setColor(color) + self._clearButton.setIcon(icon) + + def updateIconColor(self): + """ + Update the icon colors to the current foregroundRole. + + :rtype: None + """ + color = self.palette().color(self.foregroundRole()) + color = studioqt.Color.fromColor(color) + self.setIconColor(color) + + def settings(self): + """ + Return a dictionary of the current widget state. + + :rtype: dict + """ + settings = { + "text": self.text(), + } + return settings + + def setSettings(self, settings): + """ + Restore the widget state from a settings dictionary. + + :type settings: dict + :rtype: None + """ + text = settings.get("text", "") + self.setText(text) + + def resizeEvent(self, event): + """ + Reimplemented so the icon maintains the same height as the widget. + + :type event: QtWidgets.QResizeEvent + :rtype: None + """ + QtWidgets.QLineEdit.resizeEvent(self, event) + + height = self.height() + size = QtCore.QSize(16, 16) + + self.setTextMargins(20, 0, 0, 0) + + self._iconButton.setIconSize(size) + self._iconButton.setGeometry(0, 0, height, height) + + x = self.width() - height + + self._clearButton.setIconSize(size) + self._clearButton.setGeometry(x, 0, height, height) diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/menubarwidget.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/menubarwidget.py new file mode 100644 index 0000000..288905e --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/menubarwidget.py @@ -0,0 +1,274 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +import logging + +from studiovendor import six +from studiovendor.Qt import QtGui +from studiovendor.Qt import QtCore +from studiovendor.Qt import QtWidgets + +import studioqt +import studiolibrary + + +logger = logging.getLogger(__name__) + + +class MenuBarWidget(QtWidgets.QToolBar): + + DEFAULT_EXPANDED_HEIGHT = 32 + DEFAULT_COLLAPSED_HEIGHT = 10 + ICON_SIZE = 28 + + def __init__(self, parent=None): + QtWidgets.QToolBar.__init__(self, parent) + + self._dpi = 1 + self._isExpanded = True + self._expandHeight = self.DEFAULT_EXPANDED_HEIGHT + self._collapseHeight = self.DEFAULT_COLLAPSED_HEIGHT + + def dpi(self): + """ + Return the zoom multiplier. + + :rtype: float + """ + return self._dpi + + def setDpi(self, dpi): + """ + Set the zoom multiplier. + + Used for high resolution devices. + + :type dpi: float + :rtype: None + """ + self._dpi = dpi + if self.isExpanded(): + self.expand() + else: + self.collapse() + + def mousePressEvent(self, *args): + if not self.isExpanded(): + self.expand() + + def isExpanded(self): + """ + Return True if the menuBarWidget is expanded. + + :rtype: bool + """ + return self._isExpanded + + def expandHeight(self): + """ + Return the height of widget when expanded. + + :rtype: int + """ + return int(self._expandHeight * self.dpi()) + + def collapseHeight(self): + """ + Return the height of widget when collapsed. + + :rtype: int + """ + return int(self._collapseHeight * self.dpi()) + + def setFixedHeight(self, value): + """ + Overriding this method to also set the height for all child widgets. + + :type value: bool + :rtype: None + """ + self.setChildrenHeight(value) + QtWidgets.QToolBar.setFixedHeight(self, value) + + def setChildrenHidden(self, value): + """ + Set all child widgets to hidden. + + :type value: bool + :rtype: None + """ + for w in self.widgets(): + w.setHidden(value) + + def setChildrenHeight(self, height): + """ + Set the height of all the child widgets to the given height. + + :type height: int + :rtype: None + """ + for w in self.widgets(): + w.setFixedHeight(height) + + def expand(self): + """ + Expand the MenuBar to the expandHeight. + + :rtype: None + """ + self._isExpanded = True + height = self.expandHeight() + self.setFixedHeight(height) + self.setChildrenHidden(False) + + def collapse(self): + """ + Collapse the MenuBar to the collapseHeight. + + :rtype: None + """ + self._isExpanded = False + height = self.collapseHeight() + self.setFixedHeight(height) + self.setChildrenHeight(0) + self.setChildrenHidden(True) + + def updateIconColor(self): + color = self.palette().color(self.foregroundRole()) + color = studioqt.Color.fromColor(color) + + for action in self.actions(): + + icon = studioqt.Icon(action.icon()) + + try: + icon.setBadgeColor(action._badgeColor) + icon.setBadgeEnabled(action._badgeEnabled) + except AttributeError as error: + pass + + icon.setColor(color) + action.setIcon(icon) + + def widgets(self): + """ + Return all the widget that are a child of the MenuBarWidget. + + :rtype: list[QtWidgets.QWidget] + """ + widgets = [] + + for i in range(0, self.layout().count()): + w = self.layout().itemAt(i).widget() + if isinstance(w, QtWidgets.QWidget): + widgets.append(w) + + return widgets + + def actions(self): + """ + Return all the actions that are a child of the MenuBarWidget. + + :rtype: list[QtWidgets.QAction] + """ + actions = [] + + for child in self.children(): + if isinstance(child, QtWidgets.QAction): + actions.append(child) + + return actions + + def findAction(self, text): + """ + Find the action with the given text. + + :rtype: QtWidgets.QAction or None + """ + for child in self.children(): + if isinstance(child, QtWidgets.QAction): + if child.text() == text: + return child + + def findToolButton(self, text): + """ + Find the QToolButton with the given text. + + :rtype: QtWidgets.QToolButton or None + """ + for child in self.children(): + if isinstance(child, QtWidgets.QAction): + if child.text() == text: + return self.widgetForAction(child) + + def insertAction(self, before, action): + """ + Overriding this method to support the before argument as string. + + :type before: QtWidgets.QAction or str + :type action: QtWidgets.QAction + :rtype: QtWidgets.QAction + """ + action.setParent(self) + + if isinstance(before, six.string_types): + before = self.findAction(before) + + action = QtWidgets.QToolBar.insertAction(self, before, action) + + return action + + +def showExample(): + """ + Run a simple example of the widget. + + :rtype: QtWidgets.QWidget + """ + + with studioqt.app(): + + menuBarWidget = MenuBarWidget(None) + + def setIconColor(): + menuBarWidget.setIconColor(QtGui.QColor(255, 255, 0)) + + def collapse(): + menuBarWidget.collapse() + + menuBarWidget.show() + + action = menuBarWidget.addAction("Collapse") + action.triggered.connect(collapse) + + w = QtWidgets.QLineEdit() + menuBarWidget.addWidget(w) + + icon = studiolibrary.resource.icon("add") + menuBarWidget.addAction(icon, "Plus") + menuBarWidget.setStyleSheet(""" +background-color: rgb(0,200,100); +spacing:5px; + """) + + menuBarWidget.setChildrenHeight(50) + + action = QtWidgets.QAction("Yellow", None) + action.triggered.connect(setIconColor) + menuBarWidget.insertAction("Plus", action) + menuBarWidget.setGeometry(400, 400, 400, 100) + + menuBarWidget.expand() + + +if __name__ == "__main__": + showExample() diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/messagebox.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/messagebox.py new file mode 100644 index 0000000..392cd21 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/messagebox.py @@ -0,0 +1,778 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +from .themesmenu import Theme + +from studiovendor import six +from studiovendor.Qt import QtCore +from studiovendor.Qt import QtWidgets + +import studioqt +import studiolibrary + +from . import settings + + +def createMessageBox( + parent, + title, + text, + width=None, + height=None, + buttons=None, + headerIcon=None, + headerColor=None, + enableInputEdit=False, + enableDontShowCheckBox=False +): + """ + Open a question message box with the given options. + + :type parent: QWidget + :type title: str + :type text: str + :type buttons: list[QMessageBox.StandardButton] + :type headerIcon: str + :type headerColor: str + :type enableDontShowCheckBox: bool + + :rtype: MessageBox + """ + mb = MessageBox( + parent, + width=width, + height=height, + enableInputEdit=enableInputEdit, + enableDontShowCheckBox=enableDontShowCheckBox + ) + + mb.setText(text) + + buttons = buttons or [QtWidgets.QDialogButtonBox.Ok] + mb.setButtons(buttons) + + if headerIcon: + p = studiolibrary.resource.pixmap(headerIcon) + mb.setPixmap(p) + + try: + theme = parent.theme() + except AttributeError: + theme = Theme() + + mb.setStyleSheet(theme.styleSheet()) + + headerColor = headerColor or theme.accentColor().toString() + headerColor = headerColor or "rgb(50, 150, 200)" + + mb.setHeaderColor(headerColor) + + mb.setWindowTitle(title) + mb.setTitleText(title) + + return mb + + +def showMessageBox( + parent, + title, + text, + width=None, + height=None, + buttons=None, + headerIcon=None, + headerColor=None, + enableDontShowCheckBox=False, + force=False +): + """ + Open a question message box with the given options. + + :type parent: QWidget + :type title: str + :type text: str + :type buttons: list[QMessageBox.StandardButton] + :type headerIcon: str + :type headerColor: str + :type enableDontShowCheckBox: bool + :type force: bool + + :rtype: MessageBox + """ + key = '{0}MessageBox'.format(title.replace(" ", "")) + data = settings.get(key, {}) + + clickedButton = data.get("clickedButton", -1) + dontShowAgain = data.get("dontShowAgain", False) + + # Force show the dialog if the user is holding the ctrl key down + if studioqt.isControlModifier() or studioqt.isAltModifier(): + force = True + + if force or not dontShowAgain or not enableDontShowCheckBox: + + mb = createMessageBox( + parent, + title, + text, + width=width, + height=height, + buttons=buttons, + headerIcon=headerIcon, + headerColor=headerColor, + enableDontShowCheckBox=enableDontShowCheckBox + ) + + mb.exec_() + mb.close() + + clickedButton = mb.clickedStandardButton() + if clickedButton != QtWidgets.QDialogButtonBox.Cancel: + + # Save the button that was clicked by the user + settings.set(key, + { + "clickedButton": mb.clickedIndex(), + "dontShowAgain": bool(mb.isDontShowCheckboxChecked()), + } + ) + + return clickedButton + + +class MessageBox(QtWidgets.QDialog): + + @staticmethod + def input( + parent, + title, + text, + inputText="", + width=None, + height=None, + buttons=None, + headerIcon=None, + headerColor=None, + ): + """ + Convenience dialog to get a single text value from the user. + + :type parent: QWidget + :type title: str + :type text: str + :type width: int + :type height: int + :type buttons: list[QMessageBox.StandardButton] + :type headerIcon: str + :type headerColor: str + :rtype: QMessageBox.StandardButton + """ + buttons = buttons or [ + QtWidgets.QDialogButtonBox.Ok, + QtWidgets.QDialogButtonBox.Cancel + ] + + dialog = createMessageBox( + parent, + title, + text, + width=width, + height=height, + buttons=buttons, + headerIcon=headerIcon, + headerColor=headerColor, + enableInputEdit=True, + ) + + dialog.setInputText(inputText) + dialog.exec_() + + return dialog.inputText(), dialog.clickedText() + + @staticmethod + def question( + parent, + title, + text, + width=None, + height=None, + buttons=None, + headerIcon=None, + headerColor=None, + enableDontShowCheckBox=False + ): + """ + Open a question message box with the given options. + + :type parent: QWidget + :type title: str + :type text: str + :type headerIcon: str + :type headerColor: str + :type buttons: list[QMessageBox.StandardButton] + + :rtype: QMessageBox.StandardButton + """ + buttons = buttons or [ + QtWidgets.QDialogButtonBox.Yes, + QtWidgets.QDialogButtonBox.No, + QtWidgets.QDialogButtonBox.Cancel + ] + + clickedButton = showMessageBox( + parent, + title, + text, + width=width, + height=height, + buttons=buttons, + headerIcon=headerIcon, + headerColor=headerColor, + enableDontShowCheckBox=enableDontShowCheckBox, + ) + + return clickedButton + + @staticmethod + def warning( + parent, + title, + text, + width=None, + height=None, + buttons=None, + headerIcon=None, + headerColor="rgb(250, 160, 0)", + enableDontShowCheckBox=False, + force=False, + ): + """ + Open a warning message box with the given options. + + :type parent: QWidget + :type title: str + :type text: str + :type buttons: list[QMessageBox.StandardButton] + :type headerIcon: str + :type headerColor: str + :type enableDontShowCheckBox: bool + :type force: bool + + :rtype: (QMessageBox.StandardButton, bool) + """ + buttons = buttons or [ + QtWidgets.QDialogButtonBox.Yes, + QtWidgets.QDialogButtonBox.No + ] + + clickedButton = showMessageBox( + parent, + title, + text, + width=width, + height=height, + buttons=buttons, + headerIcon=headerIcon, + headerColor=headerColor, + enableDontShowCheckBox=enableDontShowCheckBox, + force=force + ) + + return clickedButton + + @staticmethod + def critical( + parent, + title, + text, + width=None, + height=None, + buttons=None, + headerIcon=None, + headerColor="rgb(230, 80, 80)" + ): + """ + Open a critical message box with the given options. + + :type parent: QWidget + :type title: str + :type text: str + :type headerIcon: str + :type headerColor: str + :type buttons: list[QMessageBox.StandardButton] + + :rtype: QMessageBox.StandardButton + """ + buttons = buttons or [QtWidgets.QDialogButtonBox.Ok] + + clickedButton = showMessageBox( + parent, + title, + text, + width=width, + height=height, + buttons=buttons, + headerIcon=headerIcon, + headerColor=headerColor + ) + + return clickedButton + + def __init__( + self, + parent=None, + width=None, + height=None, + enableInputEdit=False, + enableDontShowCheckBox=False + ): + super(MessageBox, self).__init__(parent) + self.setObjectName("messageBox") + + self._frame = None + self._animation = None + self._dontShowCheckbox = False + self._clickedButton = None + self._clickedStandardButton = None + + if width: + self.setMinimumWidth(width) + + if height: + self.setMinimumHeight(height) + + parent = self.parent() + + if parent: + parent.installEventFilter(self) + self._frame = QtWidgets.QFrame(parent) + self._frame.setObjectName("messageBoxFrame") + self._frame.show() + self.setParent(self._frame) + + self._header = QtWidgets.QFrame(self) + self._header.setObjectName("messageBoxHeaderFrame") + self._header.setSizePolicy(QtWidgets.QSizePolicy.Expanding, + QtWidgets.QSizePolicy.Fixed) + + self._icon = QtWidgets.QLabel(self._header) + self._icon.setObjectName("messageBoxIcon") + self._icon.hide() + self._icon.setScaledContents(True) + self._icon.setAlignment(QtCore.Qt.AlignTop) + self._icon.setSizePolicy(QtWidgets.QSizePolicy.Preferred, + QtWidgets.QSizePolicy.Preferred) + + self._title = QtWidgets.QLabel(self._header) + self._title.setObjectName("messageBoxHeaderLabel") + self._title.setSizePolicy(QtWidgets.QSizePolicy.Expanding, + QtWidgets.QSizePolicy.Expanding) + + hlayout = QtWidgets.QHBoxLayout() + hlayout.setContentsMargins(15, 7, 15, 10) + hlayout.setSpacing(10) + hlayout.addWidget(self._icon) + hlayout.addWidget(self._title) + + self._header.setLayout(hlayout) + + bodyLayout = QtWidgets.QVBoxLayout() + + self._body = QtWidgets.QFrame(self) + self._body.setObjectName("messageBoxBody") + self._body.setLayout(bodyLayout) + + self._message = QtWidgets.QLabel(self._body) + self._message.setWordWrap(True) + self._message.setMinimumHeight(15) + self._message.setAlignment(QtCore.Qt.AlignLeft) + self._message.setTextInteractionFlags(QtCore.Qt.TextSelectableByMouse) + self._message.setSizePolicy(QtWidgets.QSizePolicy.Expanding, + QtWidgets.QSizePolicy.Expanding) + + bodyLayout.addWidget(self._message) + bodyLayout.setContentsMargins(15, 15, 15, 15) + + if enableInputEdit: + self._inputEdit = QtWidgets.QLineEdit(self._body) + self._inputEdit.setObjectName("messageBoxInputEdit") + self._inputEdit.setFocus() + + bodyLayout.addStretch(1) + bodyLayout.addWidget(self._inputEdit) + bodyLayout.addStretch(10) + + if enableDontShowCheckBox: + msg = "Don't show this message again" + self._dontShowCheckbox = QtWidgets.QCheckBox(msg, self._body) + + bodyLayout.addStretch(10) + bodyLayout.addWidget(self._dontShowCheckbox) + bodyLayout.addStretch(2) + + self._buttonBox = QtWidgets.QDialogButtonBox(None, QtCore.Qt.Horizontal, self) + self._buttonBox.clicked.connect(self._clicked) + self._buttonBox.accepted.connect(self._accept) + self._buttonBox.rejected.connect(self._reject) + + vlayout1 = QtWidgets.QVBoxLayout() + vlayout1.setContentsMargins(0, 0, 0, 0) + + vlayout1.addWidget(self._header) + vlayout1.addWidget(self._body) + bodyLayout.addWidget(self._buttonBox) + + self.setLayout(vlayout1) + self.updateGeometry() + + def buttonBox(self): + """ + Return the button box widget for the dialog. + + :rtype: QtGui.QDialogButtonBox + """ + return self._buttonBox + + def addButton(self, *args): + """Create a push button with the given text and role""" + self.buttonBox().addButton(*args) + + def eventFilter(self, object, event): + """ + Update the geometry when the parent widget changes size. + + :type object: QtWidget.QWidget + :type event: QtCore.QEvent + :rtype: bool + """ + if event.type() == QtCore.QEvent.Resize: + self.updateGeometry() + return super(MessageBox, self).eventFilter(object, event) + + def showEvent(self, event): + """ + Fade in the dialog on show. + + :type event: QtCore.QEvent + :rtype: None + """ + self.updateGeometry() + self.fadeIn() + + def updateGeometry(self): + """ + Update the geometry to be in the center of it's parent. + + :rtype: None + """ + frame = self._frame + + if frame: + frame.setGeometry(self._frame.parent().geometry()) + frame.move(0, 0) + + geometry = self.geometry() + centerPoint = frame.geometry().center() + geometry.moveCenter(centerPoint) + geometry.setY(geometry.y() - 50) + self.move(geometry.topLeft()) + + def fadeIn(self, duration=400): + """ + Fade in the dialog using the opacity effect. + + :type duration: int + :rtype: QtCore.QPropertyAnimation + """ + if self._frame: + self._animation = studioqt.fadeIn(self._frame, duration=duration) + return self._animation + + def fadeOut(self, duration=400): + """ + Fade out the dialog using the opacity effect. + + :type duration: int + :rtype: QtCore.QPropertyAnimation + """ + if self._frame: + self._animation = studioqt.fadeOut(self._frame, duration=duration) + return self._animation + + def _accept(self): + """ + Triggered when the DialogButtonBox has been accepted. + + :rtype: None + """ + animation = self.fadeOut() + + if animation: + animation.finished.connect(self._acceptAnimationFinished) + else: + self._acceptAnimationFinished() + + def _reject(self): + """ + Triggered when the DialogButtonBox has been rejected. + + :rtype: None + """ + animation = self.fadeOut() + + if animation: + animation.finished.connect(self._rejectAnimationFinished) + else: + self._rejectAnimationFinished() + + def _acceptAnimationFinished(self): + """ + Triggered when the animation has finished on accepted. + + :rtype: None + """ + parent = self._frame or self + parent.close() + self.accept() + + def _rejectAnimationFinished(self): + """ + Triggered when the animation has finished on rejected. + + :rtype: None + """ + parent = self._frame or self + parent.close() + self.reject() + + def header(self): + """ + Return the header frame. + + :rtype: QtWidgets.QFrame + """ + return self._header + + def setTitleText(self, text): + """ + Set the title text to be displayed. + + :type text: str + :rtype: None + """ + self._title.setText(text) + + def setText(self, text): + """ + Set the text message to be displayed. + + :type text: str + :rtype: None + """ + text = six.text_type(text) + self._message.setText(text) + + def inputText(self): + """ + Return the text that the user has given the input edit. + + :rtype: str + """ + return self._inputEdit.text() + + def setInputText(self, text): + """ + Set the input text. + + :type text: str + """ + self._inputEdit.setText(text) + + def setButtons(self, buttons): + """ + Set the buttons to be displayed in message box. + + :type buttons: QMessageBox.StandardButton + :rtype: None + """ + for button in buttons: + if isinstance(button, list) or isinstance(button, tuple): + self.buttonBox().addButton(button[0], button[1]) + else: + self.buttonBox().addButton(button) + + def setHeaderColor(self, color): + """ + Set the header color for the message box. + + :type color: str + :rtype: None + """ + self.header().setStyleSheet("background-color:" + color) + + def setPixmap(self, pixmap): + """ + Set the pixmap for the message box. + + :type pixmap: QWidgets.QPixmap + :rtype: None + """ + self._icon.setPixmap(pixmap) + self._icon.show() + + def _clicked(self, button): + """ + Triggered when the user clicks a button. + + :type button: QWidgets.QPushButton + :rtype: None + """ + self._clickedButton = button + self._clickedStandardButton = self.buttonBox().standardButton(button) + + def clickedIndex(self): + """ + Return the button that was clicked by its index. + + :rtype: int or None + """ + for i, button in enumerate(self.buttonBox().buttons()): + if button == self.clickedButton(): + return i + + def clickedButton(self): + """ + Return the button that was clicked. + + :rtype: QtWidgets.QPushButton or None + """ + return self._clickedButton + + def clickedText(self): + return self._clickedButton.text() + + def clickedStandardButton(self): + """ + Return the button that was clicked by the user. + + :rtype: QMessageBox.StandardButton or None + """ + return self._clickedStandardButton + + def isDontShowCheckboxChecked(self): + """ + Return the checked state of the Dont show again checkbox. + + :rtype: bool + """ + if self._dontShowCheckbox: + return self._dontShowCheckbox.isChecked() + else: + return False + + def exec_(self): + """ + Shows the dialog as a modal dialog + + :rtype: int or None + """ + QtWidgets.QDialog.exec_(self) + return self.clickedIndex() + + +def testMessageBox(): + + with studioqt.app(): + + title = "Test question dialog" + text = "Would you like to create a snapshot icon?" + + buttons = [ + QtWidgets.QDialogButtonBox.Yes, + QtWidgets.QDialogButtonBox.Ignore, + QtWidgets.QDialogButtonBox.Cancel + ] + + result = MessageBox.question(None, title, text, buttons=buttons) + print(result) + + title = "Test long text message" + text = "This is to test a very long message. " \ + "This is to test a very long message. " \ + "This is to test a very long message. " \ + "This is to test a very long message. " \ + "This is to test a very long message. " + + buttons = [ + QtWidgets.QDialogButtonBox.Yes, + QtWidgets.QDialogButtonBox.Ignore, + QtWidgets.QDialogButtonBox.Cancel + ] + + result = MessageBox.question(None, title, text, buttons=buttons) + print(result) + + title = "Test checkbox" + text = "Testing the don't show check box. " + + buttons = [ + QtWidgets.QDialogButtonBox.Ok, + QtWidgets.QDialogButtonBox.Cancel + ] + + print(studiolibrary.widgets.MessageBox.input( + None, + "Rename", + "Rename the selected item?", + inputText="face.anim", + )) + + result = MessageBox.question( + None, + title, + text, + buttons=buttons, + enableDontShowCheckBox=True + ) + print(result) + + title = "Create a new thumbnail icon" + text = "This will override the existing thumbnail. " \ + "Are you sure you would like to continue?" + + buttons = [ + QtWidgets.QDialogButtonBox.Yes, + QtWidgets.QDialogButtonBox.No + ] + + result = MessageBox.warning( + None, + title, + text, + buttons=buttons, + enableDontShowCheckBox=True + ) + print(result) + + title = "Error saving item!" + text = "An error has occurred while saving an item." + result = MessageBox.critical(None, title, text) + print(result) + + if result == QtWidgets.QDialogButtonBox.Yes: + title = "Error while saving!" + text = "There was an error while saving" + MessageBox.critical(None, title, text) + + +if __name__ == "__main__": + testMessageBox() diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/placeholderwidget.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/placeholderwidget.py new file mode 100644 index 0000000..4b88ab9 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/placeholderwidget.py @@ -0,0 +1,22 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +from studiovendor.Qt import QtWidgets + +import studioqt + + +class PlaceholderWidget(QtWidgets.QWidget): + + def __init__(self, *args): + QtWidgets.QWidget.__init__(self, *args) + studioqt.loadUi(self) diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/previewwidget.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/previewwidget.py new file mode 100644 index 0000000..88b9a66 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/previewwidget.py @@ -0,0 +1,213 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +import os + +from studiovendor.Qt import QtGui +from studiovendor.Qt import QtCore +from studiovendor.Qt import QtWidgets + +import studioqt +import studiolibrary.widgets + + +class PreviewWidget(QtWidgets.QWidget): + + def __init__(self, item, *args): + QtWidgets.QWidget.__init__(self, *args) + studioqt.loadUi(self) + + self._item = item + + widget = self.createTitleWidget() + widget.ui.menuButton.clicked.connect(self.showMenu) + + self.ui.titleFrame.layout().addWidget(widget) + + iconGroupBoxWidget = studiolibrary.widgets.GroupBoxWidget("Icon", self.ui.iconGroup) + iconGroupBoxWidget.setObjectName("iconGroupBoxWidget") + iconGroupBoxWidget.setPersistent(True) + self.ui.iconTitleFrame.layout().addWidget(iconGroupBoxWidget) + + schema = item.loadSchema() + if schema: + self._formWidget = studiolibrary.widgets.FormWidget(self) + self._formWidget.setObjectName(item.__class__.__name__ + "Form") + self._formWidget.setSchema(item.loadSchema()) + self._formWidget.setValidator(self.validator) + + self.ui.formFrame.layout().addWidget(self._formWidget) + + self.ui.acceptButton.hide() + self.ui.acceptButton.setText("Load") + self.ui.acceptButton.clicked.connect(self.accept) + + self.createSequenceWidget() + + self._item.dataChanged.connect(self._itemDataChanged) + + self.updateThumbnailSize() + + def item(self): + """ + Get the current item in preview. + + :rtype: studiolibrary.LibraryItem + """ + return self._item + + def showMenu(self): + """ + Show the edit menu at the current cursor position. + + :rtype: QtWidgets.QAction + """ + menu = QtWidgets.QMenu(self) + + self.item().contextEditMenu(menu) + + point = QtGui.QCursor.pos() + point.setX(point.x() + 3) + point.setY(point.y() + 3) + + return menu.exec_(point) + + def createTitleWidget(self): + """ + Create a new instance of the title bar widget. + + :rtype: QtWidgets.QFrame + """ + class UI(object): + """Proxy class for attaching ui widgets as properties.""" + pass + + titleWidget = QtWidgets.QFrame(self) + titleWidget.setObjectName("titleWidget") + titleWidget.ui = UI() + + vlayout = QtWidgets.QVBoxLayout() + vlayout.setSpacing(0) + vlayout.setContentsMargins(0, 0, 0, 0) + + hlayout = QtWidgets.QHBoxLayout() + hlayout.setSpacing(0) + hlayout.setContentsMargins(0, 0, 0, 0) + + vlayout.addLayout(hlayout) + + titleButton = QtWidgets.QLabel(self) + titleButton.setText(self.item().NAME) + titleButton.setObjectName("titleButton") + titleWidget.ui.titleButton = titleButton + + hlayout.addWidget(titleButton) + + menuButton = QtWidgets.QPushButton(self) + menuButton.setText("...") + menuButton.setObjectName("menuButton") + titleWidget.ui.menuButton = menuButton + + hlayout.addWidget(menuButton) + + titleWidget.setLayout(vlayout) + + return titleWidget + + def _itemDataChanged(self, *args, **kwargs): + """ + Triggered when the current item data changes. + + :type args: list + :type kwargs: dict + """ + self.updateIcon() + + def setTitle(self, title): + """ + Set the title of the preview widget. + + :type title: str + """ + self.ui.titleLabel.setText(title) + + def validator(self, **kwargs): + """ + Validator used for validating the load arguments. + + :type kwargs: dict + """ + self._item.loadValidator(**kwargs) + self.updateIcon() + + def createSequenceWidget(self): + """ + Create a sequence widget to replace the static thumbnail widget. + + :rtype: None + """ + self.ui.sequenceWidget = studiolibrary.widgets.ImageSequenceWidget(self.ui.iconFrame) + + self.ui.iconFrame.layout().insertWidget(0, self.ui.sequenceWidget) + + self.updateIcon() + + def updateIcon(self): + """Update the thumbnail icon.""" + icon = self._item.thumbnailIcon() + if icon: + self.ui.sequenceWidget.setIcon(icon) + + if self._item.imageSequencePath(): + self.ui.sequenceWidget.setDirname(self.item().imageSequencePath()) + + def close(self): + """ + Overriding the close method so save the persistent data. + + :rtype: None + """ + if self._formWidget: + self._formWidget.savePersistentValues() + QtWidgets.QWidget.close(self) + + def resizeEvent(self, event): + """ + Overriding to adjust the image size when the widget changes size. + + :type event: QtCore.QSizeEvent + """ + self.updateThumbnailSize() + + def updateThumbnailSize(self): + """ + Update the thumbnail button to the size of the widget. + + :rtype: None + """ + width = self.width() - 5 + if width > 150: + width = 150 + + size = QtCore.QSize(width, width) + + self.ui.iconFrame.setMaximumSize(size) + self.ui.iconGroup.setMaximumHeight(width) + + self.ui.sequenceWidget.setIconSize(size) + self.ui.sequenceWidget.setMinimumSize(size) + self.ui.sequenceWidget.setMaximumSize(size) + + def accept(self): + """Called when the user clicks the load button.""" + kwargs = self._formWidget.values() + self._item.load(**kwargs) diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/searchwidget.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/searchwidget.py new file mode 100644 index 0000000..6a73661 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/searchwidget.py @@ -0,0 +1,356 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +import logging +from functools import partial + +from studiovendor.Qt import QtGui +from studiovendor.Qt import QtCore +from studiovendor.Qt import QtWidgets + +import studioqt +import studiolibrary + +logger = logging.getLogger(__name__) + + +class SearchWidget(QtWidgets.QLineEdit): + + SPACE_OPERATOR = "and" + PLACEHOLDER_TEXT = "Search" + + searchChanged = QtCore.Signal() + + def __init__(self, *args): + QtWidgets.QLineEdit.__init__(self, *args) + + self._dataset = None + self._spaceOperator = "and" + self._iconButton = QtWidgets.QPushButton(self) + self._iconButton.setObjectName("searchIconWidget") + self._iconButton.clicked.connect(self._iconClicked) + + icon = studiolibrary.resource.icon("magnifying-glass.svg") + self.setIcon(icon) + + self._clearButton = QtWidgets.QPushButton(self) + self._clearButton.setCursor(QtCore.Qt.ArrowCursor) + icon = studiolibrary.resource.icon("xmark") + self._clearButton.setIcon(icon) + self._clearButton.setToolTip("Clear all search text") + self._clearButton.clicked.connect(self._clearClicked) + self._clearButton.setStyleSheet("QFrame {background-color: transparent;}") + + self.setPlaceholderText(self.PLACEHOLDER_TEXT) + self.textChanged.connect(self._textChanged) + + self.update() + + def update(self): + self.updateIconColor() + self.updateClearButton() + + def setDataset(self, dataset): + """ + Set the data set for the search widget: + + :type dataset: studiolibrary.Dataset + """ + self._dataset = dataset + + def dataset(self): + """ + Get the data set for the search widget. + + :rtype: studiolibrary.Dataset + """ + return self._dataset + + def _clearClicked(self): + """ + Triggered when the user clicks the cross icon. + + :rtype: None + """ + self.setText("") + self.setFocus() + + def _iconClicked(self): + """ + Triggered when the user clicks on the icon. + + :rtype: None + """ + if not self.hasFocus(): + self.setFocus() + + def _textChanged(self, text): + """ + Triggered when the text changes. + + :type text: str + :rtype: None + """ + self.search() + + def search(self): + """Run the search query on the data set.""" + if self.dataset(): + self.dataset().addQuery(self.query()) + self.dataset().search() + else: + logger.info("No dataset found the the search widget.") + + self.updateClearButton() + self.searchChanged.emit() + + def query(self): + """ + Get the query used for the data set. + + :rtype: dict + """ + text = str(self.text()) + + filters = [] + for filter_ in text.split(' '): + if filter_.split(): + filters.append(('*', 'contains', filter_)) + + uniqueName = 'searchwidget' + str(id(self)) + + return { + 'name': uniqueName, + 'operator': self.spaceOperator(), + 'filters': filters + } + + def updateClearButton(self): + """ + Update the clear button depending on the current text. + + :rtype: None + """ + text = self.text() + if text: + self._clearButton.show() + else: + self._clearButton.hide() + + self.setProperty('hasText', bool(self.text())) + self.setStyleSheet(self.styleSheet()) + + def contextMenuEvent(self, event): + """ + Triggered when the user right clicks on the search widget. + + :type event: QtCore.QEvent + :rtype: None + """ + self.showContextMenu() + + def spaceOperator(self): + """ + Get the space operator for the search widget. + + :rtype: str + """ + return self._spaceOperator + + def setSpaceOperator(self, operator): + """ + Set the space operator for the search widget. + + :type operator: str + """ + self._spaceOperator = operator + self.search() + + def createSpaceOperatorMenu(self, parent=None): + """ + Return the menu for changing the space operator. + + :type parent: QGui.QMenu + :rtype: QGui.QMenu + """ + menu = QtWidgets.QMenu(parent) + menu.setTitle("Space Operator") + + # Create the space operator for the OR operator + action = QtWidgets.QAction(menu) + action.setText("OR") + action.setCheckable(True) + + callback = partial(self.setSpaceOperator, "or") + action.triggered.connect(callback) + + if self.spaceOperator() == "or": + action.setChecked(True) + + menu.addAction(action) + + # Create the space operator for the AND operator + action = QtWidgets.QAction(menu) + action.setText("AND") + action.setCheckable(True) + + callback = partial(self.setSpaceOperator, "and") + action.triggered.connect(callback) + + if self.spaceOperator() == "and": + action.setChecked(True) + + menu.addAction(action) + + return menu + + def showContextMenu(self): + """ + Create and show the context menu for the search widget. + + :rtype QtWidgets.QAction + """ + menu = QtWidgets.QMenu(self) + + # Adding a blank icon fixes the text alignment issue when using Qt 5.12.+ + icon = studiolibrary.resource.icon("blank") + + subMenu = self.createStandardContextMenu() + subMenu.setTitle("Edit") + subMenu.setIcon(icon) + + menu.addMenu(subMenu) + + subMenu = self.createSpaceOperatorMenu(menu) + menu.addMenu(subMenu) + + point = QtGui.QCursor.pos() + action = menu.exec_(point) + + return action + + def setIcon(self, icon): + """ + Set the icon for the search widget. + + :type icon: QtWidgets.QIcon + :rtype: None + """ + self._iconButton.setIcon(icon) + + def setIconColor(self, color): + """ + Set the icon color for the search widget icon. + + :type color: QtGui.QColor + :rtype: None + """ + icon = self._iconButton.icon() + icon = studioqt.Icon(icon) + icon.setColor(color) + self._iconButton.setIcon(icon) + + icon = self._clearButton.icon() + icon = studioqt.Icon(icon) + icon.setColor(color) + self._clearButton.setIcon(icon) + + def updateIconColor(self): + """ + Update the icon colors to the current foregroundRole. + + :rtype: None + """ + color = self.palette().color(self.foregroundRole()) + color = studioqt.Color.fromColor(color) + self.setIconColor(color) + + def settings(self): + """ + Return a dictionary of the current widget state. + + :rtype: dict + """ + settings = { + "text": self.text(), + "spaceOperator": self.spaceOperator(), + } + return settings + + def setSettings(self, settings): + """ + Restore the widget state from a settings dictionary. + + :type settings: dict + :rtype: None + """ + text = settings.get("text", "") + self.setText(text) + + spaceOperator = settings.get("spaceOperator") + if spaceOperator: + self.setSpaceOperator(spaceOperator) + + def resizeEvent(self, event): + """ + Reimplemented so the icon maintains the same height as the widget. + + :type event: QtWidgets.QResizeEvent + :rtype: None + """ + QtWidgets.QLineEdit.resizeEvent(self, event) + + self.setTextMargins(self.height(), 0, 0, 0) + size = QtCore.QSize(self.height(), self.height()) + + self._iconButton.setFixedSize(size) + + x = self.width() - self.height() + self._clearButton.setGeometry(x, 0, self.height(), self.height()) + + +def showExample(): + """ + Run a simple example of the search widget. + + :rtype: SearchWidget + """ + + with studioqt.app(): + + def searchFinished(): + print('-' * 25) + print('Found: {}'.format(len(dataset.results()))) + + for data in dataset.results(): + print('Match:', data) + + data = [ + {'text': 'This is a dog'}, + {'text': 'I love cats'}, + {'text': 'How man eggs can you eat?'}, + ] + + dataset = studiolibrary.Dataset() + dataset.setData(data) + dataset.searchFinished.connect(searchFinished) + + widget = SearchWidget() + widget.setDataset(dataset) + widget.show() + + return widget + + + +if __name__ == '__main__': + showExample() diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/separatoraction.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/separatoraction.py new file mode 100644 index 0000000..50934d5 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/separatoraction.py @@ -0,0 +1,93 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +from studiovendor.Qt import QtWidgets + + +__all__ = ["SeparatorAction"] + + +class Line(QtWidgets.QFrame): + pass + + +class SeparatorWidgetAction(QtWidgets.QFrame): + pass + + +class SeparatorAction(QtWidgets.QWidgetAction): + + def __init__(self, label="", parent=None): + """ + :type parent: QtWidgets.QMenu + """ + QtWidgets.QWidgetAction.__init__(self, parent) + + self._widget = SeparatorWidgetAction(parent) + + self._label = QtWidgets.QLabel(self._widget) + self._label.setText(label) + + self._line = Line(self._widget) + self._line.setSizePolicy( + QtWidgets.QSizePolicy.Expanding, + QtWidgets.QSizePolicy.Expanding + ) + + def setText(self, text): + """ + Set the text of the separator. + + :type text: str + :rtype: None + """ + self.label().setText(text) + + def widget(self): + """ + Return the QFrame object. + + :rtype: Frame + """ + return self._widget + + def label(self): + """ + Return the QLabel object. + + :rtype: QtWidgets.QLabel + """ + return self._label + + def line(self): + """ + Return the line widget. + + :rtype: Line + """ + return self._line + + def createWidget(self, menu): + """ + This method is called by the QWidgetAction base class. + + :type menu: QtWidgets.QMenu + """ + actionWidget = self.widget() + + actionLayout = QtWidgets.QHBoxLayout() + actionLayout.setContentsMargins(0, 0, 0, 0) + actionLayout.addWidget(self.label()) + actionLayout.addWidget(self.line()) + actionWidget.setLayout(actionLayout) + + return actionWidget diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/sequencewidget.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/sequencewidget.py new file mode 100644 index 0000000..40577e4 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/sequencewidget.py @@ -0,0 +1,308 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +from studiovendor.Qt import QtGui +from studiovendor.Qt import QtCore +from studiovendor.Qt import QtWidgets + +from studioqt import ImageSequence +import studioqt + + +__all__ = ['ImageSequenceWidget'] + + +STYLE = """ +QToolBar { + border: 0px solid black; + border-radius:2px; + background-color: rgba(0,0,0,100); +} + +QToolButton { + background-color: transparent; +} +""" + + +class ImageSequenceWidget(QtWidgets.QToolButton): + + DEFAULT_PLAYHEAD_COLOR = QtGui.QColor(255, 255, 255, 220) + + def __init__(self, parent=None, theme=None): + QtWidgets.QToolButton.__init__(self, parent) + + self._theme = theme + + self._imageSequence = ImageSequence("") + self._imageSequence.frameChanged.connect(self._frameChanged) + + self._toolBar = QtWidgets.QToolBar(self) + self._toolBar.setStyleSheet(STYLE) + + studioqt.fadeOut(self._toolBar, duration=0) + + spacer = QtWidgets.QWidget() + spacer.setMaximumWidth(4) + spacer.setSizePolicy( + QtWidgets.QSizePolicy.Expanding, + QtWidgets.QSizePolicy.Preferred + ) + self._toolBar.addWidget(spacer) + + spacer = QtWidgets.QWidget() + spacer.setMaximumWidth(4) + spacer.setSizePolicy( + QtWidgets.QSizePolicy.Expanding, + QtWidgets.QSizePolicy.Preferred + ) + self._firstSpacer = self._toolBar.addWidget(spacer) + + self.setSize(150, 150) + self.setMouseTracking(True) + + def hasFrames(self): + """ + Check if the images sequence has any frames. + + :rtype: bool + """ + return bool(self.firstFrame()) + + def firstFrame(self): + """ + Get the first frame in the image sequence. + + :rtype: str + """ + return self._imageSequence.firstFrame() + + def isSequence(self): + """ + Check if the image sequence has more than one frame. + + :rtype: bool + """ + return bool(self._imageSequence.frameCount() > 1) + + def dirname(self): + """ + Get the directory to the image sequence on disk. + + :rtype: str + """ + return self._imageSequence.dirname() + + def addAction(self, path, text, tip, callback): + """ + Add an action to the tool bar. + + :type path: str + :type text: str + :type tip: str + :type callback: func + + :rtype: QtWidgets.QAction + """ + icon = studioqt.Icon.fa( + path, + color="rgba(250,250,250,160)", + color_active="rgba(250,250,250,250)", + color_disabled="rgba(0,0,0,20)" + ) + + action = QtWidgets.QAction(icon, text, self._toolBar) + action.setToolTip(tip) + # action.setStatusTip(tip) + # action.setWhatsThis(tip) + + self._toolBar.insertAction(self._firstSpacer, action) + action.triggered.connect(callback) + + return action + + def actions(self): + """ + Get all the actions that are a child of the ToolBar. + + :rtype: list[QtWidgets.QAction] + """ + actions = [] + + for child in self._toolBar.children(): + if isinstance(child, QtWidgets.QAction): + actions.append(child) + + return actions + + def resizeEvent(self, event): + """ + Called when the widget is resized. + + :type event: QtWidgets.QResizeEvent + """ + self.updateToolBar() + + def updateToolBar(self): + """Update the tool bar size depending on the number of actions.""" + dpi = 1.0 + if self._theme: + dpi = self._theme.dpi() + + self._toolBar.setIconSize(QtCore.QSize(16*dpi, 16*dpi)) + + count = (len(self.actions())) - 3 + width = ((26*dpi) * count) + + self._toolBar.setGeometry(0, 0, width, 25*dpi) + + x = self.rect().center().x() - (self._toolBar.width()/2) + y = self.height() - self._toolBar.height() - (12*dpi) + width = self._toolBar.width() + + self._toolBar.setGeometry(x, y, width, self._toolBar.height()) + + def isControlModifier(self): + """ + Check if the control modifier is active. + + :rtype: bool + """ + modifiers = QtWidgets.QApplication.keyboardModifiers() + return modifiers == QtCore.Qt.ControlModifier + + def setSize(self, w, h): + """ + Reimplemented so that the icon size is set at the same time. + + :type w: int + :type h: int + :rtype: None + """ + self._size = QtCore.QSize(w, h) + self.setIconSize(self._size) + self.setFixedSize(self._size) + + def setPath(self, path): + """ + Set a single frame image sequence. + + :type path: str + """ + self._imageSequence.setPath(path) + self.updateIcon() + + def setDirname(self, dirname): + """ + This method has been deprecated. + + Please use setPath instead. + + :type dirname: str + """ + self._imageSequence.setPath(dirname) + self.updateIcon() + + def updateIcon(self): + """Update the icon for the current frame.""" + if self._imageSequence.frames(): + icon = self._imageSequence.currentIcon() + self.setIcon(icon) + + def enterEvent(self, event): + """ + Start playing the image sequence when the mouse enters the widget. + + :type event: QtCore.QEvent + :rtype: None + """ + self._imageSequence.start() + studioqt.fadeIn(self._toolBar, duration=300) + + def leaveEvent(self, event): + """ + Stop playing the image sequence when the mouse leaves the widget. + + :type event: QtCore.QEvent + :rtype: None + """ + self._imageSequence.pause() + studioqt.fadeOut(self._toolBar, duration=300) + + def mouseMoveEvent(self, event): + """ + Reimplemented to add support for scrubbing. + + :type event: QtCore.QEvent + :rtype: None + """ + if self.isControlModifier() and self._imageSequence.frameCount() > 1: + percent = 1.0 - (float(self.width() - event.pos().x()) / float(self.width())) + frame = int(self._imageSequence.frameCount() * percent) + self._imageSequence.jumpToFrame(frame) + icon = self._imageSequence.currentIcon() + self.setIcon(icon) + + def _frameChanged(self, frame=None): + """ + Triggered when the image sequence changes frame. + + :type frame: int or None + :rtype: None + """ + if not self.isControlModifier(): + icon = self._imageSequence.currentIcon() + self.setIcon(icon) + + def currentFilename(self): + """ + Return the current image location. + + :rtype: str + """ + return self._imageSequence.currentFilename() + + def playheadHeight(self): + """ + Return the height of the playhead. + + :rtype: int + """ + return 4 + + def paintEvent(self, event): + """ + Triggered on frame changed. + + :type event: QtCore.QEvent + :rtype: None + """ + QtWidgets.QToolButton.paintEvent(self, event) + + painter = QtGui.QPainter() + painter.begin(self) + + if self.currentFilename() and self._imageSequence.frameCount() > 1: + + r = event.rect() + + playheadHeight = self.playheadHeight() + playheadPosition = self._imageSequence.percent() * r.width()-1 + + x = r.x() + y = self.height() - playheadHeight + + painter.setPen(QtCore.Qt.NoPen) + painter.setBrush(QtGui.QBrush(self.DEFAULT_PLAYHEAD_COLOR)) + painter.drawRect(x, y, playheadPosition, playheadHeight) + + painter.end() \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/settings.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/settings.py new file mode 100644 index 0000000..41179f2 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/settings.py @@ -0,0 +1,78 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +import studiolibrary + +_settings = None + + +def path(): + """ + Get the settings path. + + :rtype: str + """ + return studiolibrary.localPath("widgets2.json") + + +def get(key, default=None): + """ + Convenience function for getting the a value from disc. + + :type key: str + :type default: object + :rtype: object + """ + return read().get(key, default) + + +def set(key, value): + """ + Convenience function for setting key values to disc. + + :type key: str + :type value: object + """ + save({key: value}) + + +def read(): + """ + Return the local settings from the location of the SETTING_PATH. + + :rtype: dict + """ + global _settings + + if not _settings: + _settings = studiolibrary.readJson(path()) + + return _settings + + +def save(data): + """ + Save the given dict to the local location of the SETTING_PATH. + + :type data: dict + :rtype: None + """ + global _settings + _settings = None + studiolibrary.updateJson(path(), data) + + +def reset(): + """Remove and reset the item settings.""" + global _settings + _settings = None + studiolibrary.removePath(path()) diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/sidebarwidget/__init__.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/sidebarwidget/__init__.py new file mode 100644 index 0000000..ab543dd --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/sidebarwidget/__init__.py @@ -0,0 +1,12 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . +from .sidebarwidget import SidebarWidget \ No newline at end of file diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/sidebarwidget/sidebarwidget.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/sidebarwidget/sidebarwidget.py new file mode 100644 index 0000000..3362f15 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/sidebarwidget/sidebarwidget.py @@ -0,0 +1,1256 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +import time +import logging +import functools +import collections + +from studiovendor import six +from studiovendor.Qt import QtGui +from studiovendor.Qt import QtCore +from studiovendor.Qt import QtWidgets + +import studioqt +import studiolibrary +import studiolibrary.widgets + +from .sidebarwidgetitem import SidebarWidgetItem + + +__all__ = ["SidebarWidget"] + +logger = logging.getLogger(__name__) + + +DEFAULT_SEPARATOR = "/" + + +def pathsToDict(paths, root="", separator=None): + """ + Return the given paths as a nested dict. + + Example: + paths = ["/fruit/apple", "/fruit/orange"] + print pathsToDict(paths) + # Result: {"fruit" : {"apple":{}}, {"orange":{}}} + + :type paths: list[str] + :type root: str + :type separator: str or None + :rtype: dict + """ + separator = separator or DEFAULT_SEPARATOR + results = collections.OrderedDict() + paths = studiolibrary.normPaths(paths) + + for path in paths: + p = results + + # This is to add support for grouping by the given root path. + if root and root in path: + path = path.replace(root, "") + p = p.setdefault(root, collections.OrderedDict()) + + keys = path.split(separator)[0:] + + for key in keys: + if key: + p = p.setdefault(key, collections.OrderedDict()) + + return results + + +def findRoot(paths, separator=None): + """ + Find the common path for the given paths. + + Example: + paths = [ + '/fruit/apple', + '/fruit/orange', + '/fruit/banana' + ] + print(findRoot(paths)) + # '/fruit' + + :type paths: list[str] + :type separator: str + :rtype: str + """ + if paths: + path = list(paths)[0] # Only need one from the list to verify the common path. + else: + path = "" + + result = None + separator = separator or DEFAULT_SEPARATOR + + tokens = path.split(separator) + + for i, token in enumerate(tokens): + root = separator.join(tokens[:i+1]) + match = True + + for path in paths: + if not path.startswith(root + separator): + match = False + break + + if not match: + break + + result = root + + return result + + + +class SidebarWidget(QtWidgets.QWidget): + + itemDropped = QtCore.Signal(object) + itemRenamed = QtCore.Signal(str, str) + itemSelectionChanged = QtCore.Signal() + settingsMenuRequested = QtCore.Signal(object) + + def __init__(self, *args): + super(SidebarWidget, self).__init__(*args) + + self._dataset = None + self._lineEdit = None + self._previousFilterText = "" + + layout = QtWidgets.QVBoxLayout() + layout.setSpacing(0) + layout.setContentsMargins(0,0,0,0) + + self.setLayout(layout) + + self._treeWidget = TreeWidget(self) + self._treeWidget.itemDropped = self.itemDropped + self._treeWidget.itemRenamed = self.itemRenamed + self._treeWidget.itemSelectionChanged.connect(self._itemSelectionChanged) + + self._titleWidget = self.createTitleWidget() + self._titleWidget.ui.menuButton.clicked.connect(self.showSettingsMenu) + self._titleWidget.ui.titleButton.clicked.connect(self.clearSelection) + + self.layout().addWidget(self._titleWidget) + self.layout().addWidget(self._treeWidget) + + self._treeWidget.installEventFilter(self) + + def _itemSelectionChanged(self, *args): + self.itemSelectionChanged.emit() + + def eventFilter(self, obj, event): + """Using an event filter to show the search widget on key press.""" + if event.type() == QtCore.QEvent.KeyPress: + self._keyPressEvent(event) + + return super(SidebarWidget, self).eventFilter(obj, event) + + def _keyPressEvent(self, event): + """ + Triggered from the tree widget key press event. + + :type event: QKeyEvent + """ + text = event.text().strip() + + if not text.isalpha() and not text.isdigit(): + return + + if text and not self._titleWidget.ui.filterEdit.hasFocus(): + self._titleWidget.ui.filterEdit.setText(text) + + self.setFilterVisible(True) + + self._previousFilterText = text + + def _filterVisibleTrigger(self, visible): + """ + Triggered by the filter visible action. + + :type visible: bool + """ + self.setFilterVisible(visible) + self._titleWidget.ui.filterEdit.selectAll() + + def createTitleWidget(self): + """ + Create a new instance of the title bar widget. + + :rtype: QtWidgets.QFrame + """ + + class UI(object): + """Proxy class for attaching ui widgets as properties.""" + pass + + titleWidget = QtWidgets.QFrame(self) + titleWidget.setObjectName("titleWidget") + titleWidget.ui = UI() + + vlayout = QtWidgets.QVBoxLayout() + vlayout.setSpacing(0) + vlayout.setContentsMargins(0,0,0,0) + + hlayout = QtWidgets.QHBoxLayout() + hlayout.setSpacing(0) + hlayout.setContentsMargins(0,0,0,0) + + vlayout.addLayout(hlayout) + + titleButton = QtWidgets.QPushButton(self) + titleButton.setText("Folders") + titleButton.setObjectName("titleButton") + titleWidget.ui.titleButton = titleButton + + hlayout.addWidget(titleButton) + + menuButton = QtWidgets.QPushButton(self) + menuButton.setText("...") + menuButton.setObjectName("menuButton") + titleWidget.ui.menuButton = menuButton + + hlayout.addWidget(menuButton) + + self._lineEdit = studiolibrary.widgets.LineEdit(self) + self._lineEdit.hide() + self._lineEdit.setObjectName("filterEdit") + self._lineEdit.setText(self.treeWidget().filterText()) + self._lineEdit.textChanged.connect(self.searchChanged) + titleWidget.ui.filterEdit = self._lineEdit + + vlayout.addWidget(self._lineEdit) + + titleWidget.setLayout(vlayout) + + return titleWidget + + def _dataChanged(self): + pass + + def setDataset(self, dataset): + """ + Set the dataset for the search widget: + + :type dataset: studioqt.Dataset + """ + self._dataset = dataset + self._dataset.dataChanged.connect(self._dataChanged) + self._dataChanged() + + def dataset(self): + """ + Get the dataset for the search widget. + + :rtype: studioqt.Dataset + """ + return self._dataset + + def search(self): + """Run the dataset search.""" + if self.dataset(): + self.dataset().addQuery(self.query()) + self.dataset().search() + else: + logger.info('No dataset found for the sidebar widget.') + + def query(self): + """ + Get the query for the sidebar widget. + + :rtype: dict + """ + filters = [] + + for path in self.selectedPaths(): + if self.isRecursive(): + suffix = "" if path.endswith("/") else "/" + + filter_ = ('folder', 'startswith', path + suffix) + filters.append(filter_) + + filter_ = ('folder', 'is', path) + filters.append(filter_) + + uniqueName = 'sidebar_widget_' + str(id(self)) + return {'name': uniqueName, 'operator': 'or', 'filters': filters} + + def searchChanged(self, text): + """ + Triggered when the search filter has changed. + + :type text: str + """ + self.refreshFilter() + if text: + self.setFilterVisible(True) + else: + self.treeWidget().setFocus() + self.setFilterVisible(False) + + def showSettingsMenu(self): + """Create and show a new settings menu instance.""" + + menu = studioqt.Menu(self) + + self.settingsMenuRequested.emit(menu) + + self.createSettingsMenu(menu) + + point = QtGui.QCursor.pos() + point.setX(point.x() + 3) + point.setY(point.y() + 3) + action = menu.exec_(point) + menu.close() + + def createSettingsMenu(self, menu): + """ + Create a new settings menu instance. + + :rtype: QMenu + """ + action = menu.addAction("Show Filter") + action.setCheckable(True) + action.setChecked(self.isFilterVisible()) + + callback = functools.partial(self._filterVisibleTrigger, not self.isFilterVisible()) + action.triggered.connect(callback) + + action = menu.addAction("Show Icons") + action.setCheckable(True) + action.setChecked(self.iconsVisible()) + + callback = functools.partial(self.setIconsVisible, not self.iconsVisible()) + action.triggered.connect(callback) + + action = menu.addAction("Show Root Folder") + action.setCheckable(True) + action.setChecked(self.isRootVisible()) + + callback = functools.partial(self.setRootVisible, not self.isRootVisible()) + action.triggered.connect(callback) + + return menu + + def setFilterVisible(self, visible): + """ + Set the filter widget visible + + :type visible: bool + """ + self._titleWidget.ui.filterEdit.setVisible(visible) + self._titleWidget.ui.filterEdit.setFocus() + + if not visible and bool(self.treeWidget().filterText()): + self.treeWidget().setFilterText("") + else: + self.refreshFilter() + + def setSettings(self, settings): + """ + Set the settings for the widget. + + :type settings: dict + """ + self.treeWidget().setSettings(settings) + + value = settings.get("filterVisible") + if value is not None: + self.setFilterVisible(value) + + value = settings.get("filterText") + if value is not None: + self.setFilterText(value) + + def settings(self): + """ + Get the settings for the widget. + + :rtype: dict + """ + settings = self.treeWidget().settings() + + settings["filterText"] = self.filterText() + settings["filterVisible"] = self.isFilterVisible() + + return settings + + # -------------------------------- + # convenience methods + # -------------------------------- + + def filterText(self): + return self.treeWidget().filterText() + + def setFilterText(self, text): + self._titleWidget.ui.filterEdit.setText(text) + + def refreshFilter(self): + self.treeWidget().setFilterText(self._titleWidget.ui.filterEdit.text()) + + def isFilterVisible(self): + return bool(self.treeWidget().filterText()) or self._titleWidget.ui.filterEdit.isVisible() + + def setIconsVisible(self, visible): + self.treeWidget().setIconsVisible(visible) + + def iconsVisible(self): + return self.treeWidget().iconsVisible() + + def setRootVisible(self, visible): + self.treeWidget().setRootVisible(visible) + + def isRootVisible(self): + return self.treeWidget().isRootVisible() + + def treeWidget(self): + return self._treeWidget + + def setDpi(self, dpi): + self.treeWidget().setDpi(dpi) + + def setRecursive(self, enabled): + self.treeWidget().setRecursive(enabled) + + def isRecursive(self): + return self.treeWidget().isRecursive() + + def setData(self, *args, **kwargs): + self.treeWidget().setData(*args, **kwargs) + + def setItemData(self, id, data): + self.treeWidget().setPathSettings(id, data) + + def setLocked(self, locked): + self.treeWidget().setLocked(locked) + + def selectedPath(self): + return self.treeWidget().selectedPath() + + def selectPaths(self, paths): + self.treeWidget().selectPaths(paths) + + def selectedPaths(self): + return self.treeWidget().selectedPaths() + + def clearSelection(self): + self.treeWidget().clearSelection() + + +class TreeWidget(QtWidgets.QTreeWidget): + + itemDropped = QtCore.Signal(object) + itemRenamed = QtCore.Signal(str, str) + itemSelectionChanged = QtCore.Signal() + + def __init__(self, *args): + super(TreeWidget, self).__init__(*args) + + self._dpi = 1 + self._data = [] + self._items = [] + self._index = {} + self._locked = False + self._dataset = None + self._recursive = True + self._filterText = "" + self._rootVisible = False + self._iconsVisible = True + + self._options = { + 'field': 'path', + 'separator': '/', + 'recursive': True, + 'autoRootPath': True, + 'rootText': 'FOLDERS', + 'sortBy': None, + 'queries': [{'filters': [('type', 'is', 'Folder')]}] + } + + self.itemExpanded.connect(self.update) + self.itemCollapsed.connect(self.update) + + self.setDpi(1) + + self.setAcceptDrops(True) + self.setHeaderHidden(True) + self.setFrameShape(QtWidgets.QFrame.NoFrame) + self.setSelectionMode(QtWidgets.QTreeWidget.ExtendedSelection) + self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) + self.setVerticalScrollMode(QtWidgets.QAbstractItemView.ScrollPerPixel) + + def filterText(self): + """ + Get the current filter text. + + :rtype: bool + """ + return self._filterText + + def setFilterText(self, text): + """ + Triggered when the search filter has changed. + + :type text: str + """ + self._filterText = text.strip() + self.refreshFilter() + + def refreshFilter(self): + """Refresh the current item filter.""" + items = self.items() + + for item in items: + if self._filterText.lower() in item.text(0).lower(): + item.setHidden(False) + for parent in item.parents(): + parent.setHidden(False) + else: + item.setHidden(True) + + def clear(self): + """Clear all the items from the tree widget.""" + self._items = [] + self._index = {} + super(TreeWidget, self).clear() + + def setRootVisible(self, visible): + """ + Set the root item visible. + + :type visible: bool + """ + self._rootVisible = visible + self.refreshData() + + def isRootVisible(self): + """ + Check if the root item is visible + + :rtype: bool + """ + return self._rootVisible + + def setIconsVisible(self, visible): + """ + Set all icons visible. + + :type visible: bool + """ + self._iconsVisible = visible + self.refreshData() + + def iconsVisible(self): + """ + Check if all the icons are visible. + + :rtype: bool + """ + return self._iconsVisible + + def selectionChanged(self, *args): + """Triggered the current selection has changed.""" + self.parent().search() + + def setRecursive(self, enable): + """ + Set the search query on the dataset to be recursive. + + :type enable: bool + """ + self._recursive = enable + self.parent().search() + + def isRecursive(self): + """ + Get the recursive query enable state. + + :rtype: bool + """ + return self._recursive + + def sortBy(self): + """ + Get the sortby field. + + :rtype: str + """ + return self._options.get('sortBy', [self.field()]) + + def field(self): + """ + Get the field. + + :rtype: str + """ + return self._options.get('field', '') + + def rootText(self): + """ + Get the root text. + + :rtype: str + """ + return self._options.get('rootText') + + def separator(self): + """ + Get the separator used in the fields to separate level values. + + :rtype: str + """ + return self._options.get('separator', DEFAULT_SEPARATOR) + + def _dataChanged(self): + """Triggered when the data set has changed.""" + pass + # data = collections.OrderedDict() + # queries = self._options.get("queries") + # + # items = self.dataset().findItems(queries) + # + # for item in items: + # itemData = item.itemData() + # value = itemData.get(self.field()) + # data[value] = {'iconPath': itemData.get('iconPath')} + # + # if data: + # root = findRoot(data.keys(), separator=self.separator()) + # self.setPaths(data, root=root) + + def setLocked(self, locked): + """ + Set the widget items to read only mode. + + :type locked: bool + :rtype: None + """ + self._locked = locked + + def isLocked(self): + """ + Return True if the items are in read only mode + + :rtype: bool + """ + return self._locked + + def itemAt(self, pos): + """ + :type pos: QtGui.QPoint + :rtype: None or Folder + """ + index = self.indexAt(pos) + if not index.isValid(): + return + + item = self.itemFromIndex(index) + return item + + def dropEvent(self, event): + """ + :type event: QtCore.QEvent + :rtype: None + """ + if self.isLocked(): + logger.debug("Folder is locked! Cannot accept drop!") + return + + self.itemDropped.emit(event) + + def dragMoveEvent(self, event): + """ + :type event: QtCore.QEvent + :rtype: None + """ + mimeData = event.mimeData() + + if mimeData.hasUrls(): + event.accept() + else: + event.ignore() + + item = self.itemAt(event.pos()) + if item: + self.selectPaths([item.path()]) + + def dragEnterEvent(self, event): + """ + :type event: QtCore.QEvent + :rtype: None + """ + event.accept() + + def selectItem(self, item): + """ + :type item: NavigationWidgetItem + :rtype: None + """ + self.selectPaths([item.path()]) + + def dpi(self): + """ + Return the dots per inch multiplier. + + :rtype: float + """ + return self._dpi + + def setDpi(self, dpi): + """ + Set the dots per inch multiplier. + + :type dpi: float + :rtype: None + """ + self._dpi = dpi + + width = 20 * dpi + height = 18 * dpi + + self.setIndentation(9 * dpi) + self.setMinimumWidth(20 * dpi) + self.setIconSize(QtCore.QSize(width, height)) + self.setStyleSheet("height: {height}px;".format(height=height)) + + def update(self, *args): + """ + :rtype: None + """ + for item in self.items(): + item.update() + + def items(self): + """ + Return a list of all the items in the tree widget. + + :rtype: list[NavigationWidgetItem] + """ + items = self.findItems( + "*", + QtCore.Qt.MatchWildcard | QtCore.Qt.MatchRecursive + ) + + return items + + def itemFromUrl(self, url): + """ + Return the item for the given url. + + :type url: QtCore.QUrl + :rtype: NavigationWidgetItem + """ + for item in self.items(): + if url == item.url(): + return item + + def itemFromPath(self, path): + """ + Return the item for the given path. + + :type path: str + :rtype: NavigationWidgetItem + """ + return self._index.get(path) + + def settings(self): + """ + Return a dictionary of the settings for this widget. + + :rtype: dict + """ + settings = {} + + scrollBar = self.verticalScrollBar() + settings["verticalScrollBar"] = { + "value": scrollBar.value() + } + + scrollBar = self.horizontalScrollBar() + settings["horizontalScrollBar"] = { + "value": scrollBar.value() + } + + for item in self.items(): + itemSettings = item.settings() + if itemSettings: + settings[item.path()] = item.settings() + + return settings + + def setSettings(self, settings): + """ + Set the settings for this widget + + :type settings: dict + """ + for path in sorted(settings.keys()): + s = settings.get(path, None) + self.setPathSettings(path, s) + + scrollBarSettings = settings.get("verticalScrollBar", {}) + value = scrollBarSettings.get("value") + if value: + self.verticalScrollBar().setValue(value) + + scrollBarSettings = settings.get("horizontalScrollBar", {}) + value = scrollBarSettings.get("value") + if value: + self.horizontalScrollBar().setValue(value) + + self.setDpi(self.dpi()) + + def setPathSettings(self, path, settings): + """ + Show the context menu at the given position. + + :type path: str + :type settings: dict + :rtype: None + """ + item = self.itemFromPath(path) + if item and settings: + item.setSettings(settings) + + def showContextMenu(self, position): + """ + Show the context menu at the given position. + + :type position: QtCore.QPoint + :rtype: None + """ + menu = self.createContextMenu() + menu.exec_(self.viewport().mapToGlobal(position)) + + def expandedItems(self): + """ + Return all the expanded items. + + :rtype: list[NavigationWidgetItem] + """ + for item in self.items(): + if self.isItemExpanded(item): + yield item + + def expandedPaths(self): + """ + Return all the expanded paths. + + :rtype: list[NavigationWidgetItem] + """ + for item in self.expandedItems(): + yield item.url() + + def setExpandedPaths(self, paths): + """ + Set the given paths to expanded. + + :type paths: list[str] + """ + for item in self.items(): + if item.url() in paths: + item.setExpanded(True) + + def selectedItem(self): + """ + Return the last selected item + + :rtype: SidebarWidgetItem + """ + path = self.selectedPath() + return self.itemFromPath(path) + + def selectedPath(self): + """ + Return the last selected path + + :rtype: str or None + """ + paths = self.selectedPaths() + if paths: + return paths[-1] + + def selectedPaths(self): + """ + Return the paths that are selected. + + :rtype: list[str] + """ + paths = [] + items = self.selectedItems() + for item in items: + path = item.path() + paths.append(path) + return studiolibrary.normPaths(paths) + + + def selectPath(self, path): + """ + Select the given path + + :type: str + :rtype: None + """ + self.selectPaths([path]) + + def selectPaths(self, paths): + """ + Select the items with the given paths. + + :type paths: list[str] + :rtype: None + """ + paths = studiolibrary.normPaths(paths) + items = self.items() + for item in items: + if studiolibrary.normPath(item.path()) in paths: + item.setSelected(True) + else: + item.setSelected(False) + + def selectUrl(self, url): + """ + Select the item with the given url. + + :type url: str + :rtype: None + """ + items = self.items() + + for item in items: + if item.url() == url: + item.setSelected(True) + else: + item.setSelected(False) + + def selectedUrls(self): + """ + Return the urls for the selected items. + + :rtype: list[str] + """ + urls = [] + items = self.selectedItems() + for item in items: + urls.append(item.url()) + return urls + + def setPaths(self, *args, **kwargs): + """ + This method has been deprecated. + """ + logger.warning("This method has been deprecated!") + self.setData(*args, **kwargs) + + def refreshData(self): + self.setData(self._data) + + def setData(self, data, root="", split=None): + """ + Set the items to the given items. + + :type data: list[str] + :type root: str + :type split: str + :rtype: None + """ + self._data = data + + settings = self.settings() + + self.blockSignals(True) + + self.clear() + + if not root: + root = findRoot(data.keys(), self.separator()) + + self.addPaths(data, root=root, split=split) + + self.setSettings(settings) + + self.blockSignals(False) + + self.parent().search() + + def addPaths(self, paths, root="", split=None): + """ + Set the given items as a flat list. + + :type paths: list[str] + :type root: str or None + :type split: str or None + """ + data = pathsToDict(paths, root=root, separator=split) + self.createItems(data, split=split) + + if isinstance(paths, dict): + self.setSettings(paths) + + def createItems(self, data, split=None): + """ + Create the items from the given data dict + + :type data: dict + :type split: str or None + + :rtype: None + """ + split = split or DEFAULT_SEPARATOR + + self._index = {} + + for key in data: + + root = split.join([key]) + + item = None + + if self.isRootVisible(): + + text = key.split(split) + if text: + text = text[-1] + else: + text = key + + item = SidebarWidgetItem(self) + item.setText(0, six.text_type(text)) + item.setPath(root) + item.setExpanded(True) + + self._index[root] = item + + def _recursive(parent, children, split=None, root=""): + for text, val in sorted(children.items()): + + if not parent: + parent = self + + path = split.join([root, text]) + path = studiolibrary.normPath(path) + + child = SidebarWidgetItem(parent) + child.setText(0, six.text_type(text)) + child.setPath(path) + + self._index[path] = child + + _recursive(child, val, split=split, root=path) + + _recursive(item, data[key], split=split, root=root) + + self.update() + self.refreshFilter() + + +class ExampleWindow(QtWidgets.QWidget): + + def __init__(self, *args): + QtWidgets.QWidget.__init__(self, *args) + + layout = QtWidgets.QVBoxLayout() + self.setLayout(layout) + + self._lineEdit = QtWidgets.QLineEdit() + self._lineEdit.textChanged.connect(self.searchChanged) + self._treeWidget = TreeWidget(self) + + self._slider = QtWidgets.QSlider(QtCore.Qt.Horizontal) + self._slider.valueChanged.connect(self._valueChanged) + self._slider.setRange(50, 200) + self._slider.setValue(100) + self._slider.setFixedHeight(18) + + layout.addWidget(self._slider) + layout.addWidget(self._lineEdit) + layout.addWidget(self._treeWidget) + + self._treeWidget.itemClicked.connect(self.itemClicked) + self._treeWidget.itemSelectionChanged.connect(self.selectionChanged) + + self.update() + + def _valueChanged(self, value): + self.update() + + def update(self): + import studiolibrary + + value = self._slider.value() + value = value / 100.0 + + theme = studiolibrary.widgets.Theme() + theme.setDpi(value) + + self._treeWidget.setDpi(value) + self._treeWidget.setStyleSheet(theme.styleSheet()) + + def setData(self, *args, **kwargs): + self._treeWidget.setData(*args, **kwargs) + + def itemClicked(self): + print("ITEM CLICKED") + print(self._treeWidget.settings()) + + items = self._treeWidget.selectedItems() + for item in items: + print(item.path()) + + def selectionChanged(self, *args): + print("SELECTION CHANGED", args) + + def searchChanged(self, text): + print("SEARCH CHANGED", text) + + items = self._treeWidget.items() + + t = time.time() + + self._treeWidget.expandAll() + + for item in items: + if text.lower() in item.text(0).lower(): + item.setHidden(False) + for parent in item.parents(): + parent.setHidden(False) + else: + item.setHidden(True) + + print(time.time() - t) + + +def runTests(): + + paths = [ + '/fruit/apple', + '/fruit/orange', + '/fruit/banana' + ] + + assert findRoot(paths) == '/fruit' + + paths = [ + '/fruit/apple', + '/fruit/orange', + '/fruit/banana', + '/tesla/cars' + ] + + assert findRoot(paths) == '' + + data = pathsToDict(paths) + + assert 'fruit' in data + assert 'apple' in data.get('fruit') + assert 'orange' in data.get('fruit') + assert 'banana' in data.get('fruit') + assert 'cars' in data.get('tesla') + + paths = [ + '>tesla>car>modelS', + '>tesla>car>modelX', + '>tesla>car>model3', + ] + + assert findRoot(paths, separator='>') == '>tesla>car' + + data = pathsToDict(paths, separator='>') + + assert 'tesla' in data + assert 'modelS' in data.get('tesla').get('car') + assert 'modelX' in data.get('tesla').get('car') + assert 'model3' in data.get('tesla').get('car') + + +def showExampleWindow(): + + data = { + "P:/production/shared/anim": { + "text": "FOLDERS", + "bold": True, + "isExpanded": True, + "iconPath": "none", + "iconColor": "rgb(100, 100, 150)", + "textColor": "rgba(100, 100, 150, 150)" + }, + + "P:/production/shared/anim/walks/fast.anim": {}, + "P:/production/shared/anim/walks/slow.anim": {}, + "P:/production/shared/anim/rigs/prop.rig": {}, + "P:/production/shared/anim/rigs/character.rig": {}, + + "Users/libraries/animation/Character/Boris/stressed.pose": {}, + "Users/libraries/animation/Character/Boris/smile.pose": {}, + "Users/libraries/animation/Character/Cornilous/normal.pose": {}, + "Users/libraries/animation/Character/Cornilous/relaxed.pose": {}, + "Users/libraries/animation/Character/Cornilous/surprised.pose": {}, + "Users/libraries/animation/Character/Figaro/test.anim": {}, + "Users/libraries/animation/Character/Figaro/anim/hiccup.anim": {}, + + "props/car/color/red": {}, + "props/car/color/orange": {}, + "props/car/color/yellow": {}, + "props/plane/color/blue": {}, + "props/plane/color/green": {}, + + "/": {}, + "/Hello": {}, + "/Hello/World": {}, + "/Test/World": {}, + + "tags": { + "text": "TAGS", + "bold": True, + "isExpanded": True, + "iconPath": "none", + "iconColor": "rgb(100, 100, 150)", + "textColor": "rgba(100, 100, 150, 150)" + }, + "tags/red": { + "iconColor": "rgb(200, 50, 50)", + "iconPath": "../../resource/icons/circle.png" + }, + "tags/orange": { + "bold": True, + "textColor": "rgb(250, 150, 50)", + "iconColor": "rgb(250, 150, 50)", + "iconPath": "../../resource/icons/circle.png" + }, + "tags/yellow": { + "iconColor": "rgb(250, 200, 0)", + "iconPath": "../../resource/icons/circle.png" + }, + "tags/blue": { + "iconColor": "rgb(50, 150, 250)", + "iconPath": "../../resource/icons/circle.png" + }, + "tags/green": { + "iconColor": "rgb(100, 200, 0)", + "iconPath": "../../resource/icons/circle.png" + } + } + + window = ExampleWindow(None) + window.setData(data) + window.show() + window.setGeometry(300, 300, 300, 600) + return window + + +if __name__ == "__main__": + with studioqt.app(): + w = showExampleWindow() diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/sidebarwidget/sidebarwidgetitem.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/sidebarwidget/sidebarwidgetitem.py new file mode 100644 index 0000000..76ae166 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/sidebarwidget/sidebarwidgetitem.py @@ -0,0 +1,392 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +import os +import logging + +from studiovendor import six +from studiovendor.Qt import QtGui +from studiovendor.Qt import QtCore +from studiovendor.Qt import QtWidgets + +import studioqt +import studiolibrary + + +__all__ = ["SidebarWidgetItem"] + + +logger = logging.getLogger(__name__) + + +class SidebarWidgetItem(QtWidgets.QTreeWidgetItem): + + PIXMAP_CACHE = {} + + def __init__(self, *args): + QtWidgets.QTreeWidgetItem.__init__(self, *args) + + self._path = "" + self._bold = None + self._iconVisible = True + self._iconPath = None + self._iconColor = None + self._textColor = None + self._iconKey = None + self._expandedIconPath = None + self._collapsedIconPath = None + + self._settings = {} + + def iconPath(self): + """ + Return the icon path for the item. + + :rtype: str + """ + return self._iconPath or self.defaultIconPath() + + def createPixmap(self, path, color): + """ + Create a new Pixmap from the given path. + + :type path: str + :type color: str or QtCore.QColor + :rtype: QtCore.QPixmap + """ + dpi = self.treeWidget().dpi() + key = path + color + "DPI-" + str(dpi) + pixmap = self.PIXMAP_CACHE.get(key) + + if not pixmap: + + width = 20 * dpi + height = 18 * dpi + + if "/" not in path and "\\" not in path: + path = studiolibrary.resource.get("icons", path) + + if not os.path.exists(path): + path = self.defaultIconPath() + + pixmap2 = studioqt.Pixmap(path) + pixmap2.setColor(color) + pixmap2 = pixmap2.scaled( + 16 * dpi, + 16 * dpi, + QtCore.Qt.KeepAspectRatio, + QtCore.Qt.SmoothTransformation + ) + + x = (width - pixmap2.width()) / 2 + y = (height - pixmap2.height()) / 2 + + pixmap = QtGui.QPixmap(QtCore.QSize(width, height)) + pixmap.fill(QtCore.Qt.transparent) + + painter = QtGui.QPainter(pixmap) + painter.drawPixmap(x, y, pixmap2) + painter.end() + + self.PIXMAP_CACHE[key] = pixmap + + return pixmap + + def expandedIconPath(self): + """ + Return the icon path to be shown when expanded. + + :rtype: str + """ + return self._iconPath or studiolibrary.resource.get("icons", "folder_open.png") + + def collapsedIconPath(self): + """ + Return the icon path to be shown when collapsed. + + :rtype: str + """ + return self._iconPath or self.defaultIconPath() + + def defaultIconPath(self): + """ + Return the default icon path. + + :rtype: str + """ + return studiolibrary.resource.get("icons", "folder.svg") + + def setIconPath(self, path): + """ + Return the icon path for the item. + + :type path: str + :rtype: None + """ + self._iconPath = path + self.updateIcon() + + def setIconVisible(self, visible): + """ + Set the icon visibility for the folder item + + :type visible: bool + """ + self._iconVisible = visible + + def isIconVisible(self): + """ + Check if the icon is visible. + + :rtype: bool + """ + return self.treeWidget().iconsVisible() and self._iconVisible + + def iconColor(self): + """ + Return the icon color. + + :rtype: QtGui.QColor or None + """ + return self._iconColor or self.defaultIconColor() + + def defaultIconColor(self): + """ + Return the default icon color. + + :rtype: QtGui.QColor or None + """ + palette = self.treeWidget().palette() + + color = palette.color(self.treeWidget().foregroundRole()) + color = studioqt.Color.fromColor(color).toString() + + return str(color) + + def setIconColor(self, color): + """ + Set the icon color. + + :type color: QtGui.QColor or str + :rtype: None + """ + if color: + + if isinstance(color, QtGui.QColor): + color = studioqt.Color.fromColor(color) + + elif isinstance(color, six.string_types): + color = studioqt.Color.fromString(color) + + self._iconColor = color.toString() + else: + self._iconColor = None + + self.updateIcon() + + def setPath(self, path): + """ + Set the path for the navigation item. + + :type path: str + :rtype: None + """ + self._path = path + + def path(self): + """ + Return the item path. + + :rtype: str + """ + return self._path + + def parents(self): + """ + Return all item parents. + + :rtype: list[SidebarWidgetItem] + """ + parents = [] + parent = self.parent() + + if parent: + parents.append(parent) + + while parent.parent(): + parent = parent.parent() + parents.append(parent) + + return parents + + def url(self): + """ + Return the url path. + + :rtype: str + """ + return QtCore.QUrl(self.path()) + + def update(self): + """ + :rtype: None + """ + self.updateIcon() + + def updateIcon(self): + """ + Force the icon to update. + + :rtype: None + """ + if self.isIconVisible(): + if self.isExpanded(): + path = self.expandedIconPath() + else: + path = self.collapsedIconPath() + + pixmap = self.createPixmap(path, self.iconColor()) + + self.setIcon(0, pixmap) + + def bold(self): + """ + Returns true if weight() is a value greater than QFont::Normal + + :rtype: bool + """ + return self.font(0).bold() + + def setBold(self, enable): + """ + If enable is true sets the font's weight to + + :rtype: bool + """ + if enable: + self._settings["bold"] = enable + + font = self.font(0) + font.setBold(enable) + self.setFont(0, font) + + def setTextColor(self, color): + """ + Set the foreground color to the given color + + :type color: QtGui.QColor or str + :rtype: None + """ + if isinstance(color, QtGui.QColor): + color = studioqt.Color.fromColor(color) + + elif isinstance(color, six.string_types): + color = studioqt.Color.fromString(color) + + self._settings["textColor"] = color.toString() + + brush = QtGui.QBrush() + brush.setColor(color) + self.setForeground(0, brush) + + def textColor(self): + """ + Return the foreground color the item. + + :rtype: QtGui.QColor + """ + color = self.foreground(0).color() + return studioqt.Color.fromColor(color) + + def settings(self): + """ + Return the current state of the item as a dictionary. + + :rtype: dict + """ + settings = {} + + isSelected = self.isSelected() + if isSelected: + settings["selected"] = isSelected + + isExpanded = self.isExpanded() + if isExpanded: + settings["expanded"] = isExpanded + + bold = self._settings.get("bold") + if bold: + settings["bold"] = bold + + textColor = self._settings.get("textColor") + if textColor: + settings["textColor"] = textColor + + return settings + + def setExpandedParents(self, expanded): + """ + Set all the parents of the item to the value of expanded. + + :type expanded: bool + :rtype: None + """ + parents = self.parents() + for parent in parents: + parent.setExpanded(expanded) + + def setSelected(self, select): + """ + Sets the selected state of the item to select. + + :type select: bool + :rtype: None + """ + QtWidgets.QTreeWidgetItem.setSelected(self, select) + + if select: + self.setExpandedParents(select) + + def setSettings(self, settings): + """ + Set the current state of the item from a dictionary. + + :type settings: dict + """ + text = settings.get("text") + if text: + self.setText(0, text) + + iconPath = settings.get("icon") + if iconPath is not None: + self.setIconPath(iconPath) + + iconColor = settings.get("color") + if iconColor is not None: + self.setIconColor(iconColor) + + selected = settings.get("selected") + if selected is not None: + self.setSelected(selected) + + expanded = settings.get("expanded") + if expanded is not None and self.childCount() > 0: + self.setExpanded(expanded) + self.updateIcon() + + bold = settings.get("bold") + if bold is not None: + self.setBold(bold) + + textColor = settings.get("textColor") + if textColor: + self.setTextColor(textColor) diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/slideraction.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/slideraction.py new file mode 100644 index 0000000..7cc92e2 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/slideraction.py @@ -0,0 +1,81 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +from studiovendor.Qt import QtCore +from studiovendor.Qt import QtWidgets + + +__all__ = ["SliderAction"] + + +class SliderWidgetAction(QtWidgets.QFrame): + pass + + +class SliderAction(QtWidgets.QWidgetAction): + + def __init__(self, label="", parent=None): + """ + :type parent: QtWidgets.QMenu + """ + QtWidgets.QWidgetAction.__init__(self, parent) + + self._widget = SliderWidgetAction(parent) + self._label = QtWidgets.QLabel(label, self._widget) + + self._slider = QtWidgets.QSlider(QtCore.Qt.Horizontal, self._widget) + self._slider.setSizePolicy( + QtWidgets.QSizePolicy.Expanding, + QtWidgets.QSizePolicy.Expanding + ) + + self.valueChanged = self._slider.valueChanged + + def widget(self): + """ + Return the widget for this action. + + :rtype: QtWidgets.QWidget + """ + return self._widget + + def label(self): + """ + Return the QLabel object. + + :rtype: QtWidgets.QLabel + """ + return self._label + + def slider(self): + """ + Return the QLabel object. + + :rtype: QtWidgets.QSlider + """ + return self._slider + + def createWidget(self, menu): + """ + This method is called by the QWidgetAction base class. + + :type menu: QtWidgets.QMenu + """ + actionWidget = self.widget() + + actionLayout = QtWidgets.QHBoxLayout() + actionLayout.setContentsMargins(0, 0, 0, 0) + actionLayout.addWidget(self.label()) + actionLayout.addWidget(self.slider()) + actionWidget.setLayout(actionLayout) + + return actionWidget diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/sortbymenu.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/sortbymenu.py new file mode 100644 index 0000000..586aa0a --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/sortbymenu.py @@ -0,0 +1,111 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +from functools import partial + +from studiovendor.Qt import QtGui +from studiovendor.Qt import QtWidgets + +from .separatoraction import SeparatorAction + + +class SortByMenu(QtWidgets.QMenu): + + def __init__(self, name, parent, dataset): + super(SortByMenu, self).__init__(name, parent) + + self._dataset = dataset + self.aboutToShow.connect(self.populateMenu) + + def setDataset(self, dataset): + """ + Set the dataset model for the menu: + + :type dataset: studiolibrary.Dataset + """ + self._dataset = dataset + + def dataset(self): + """ + Get the dataset model for the menu. + + :rtype: studiolibrary.Dataset + """ + return self._dataset + + def setSortBy(self, sortName, sortOrder): + """ + Set the sort by value for the dataset. + + :type sortName: str + :type sortOrder: str + """ + if sortName == "Custom Order": + sortOrder = "asc" + + value = sortName + ":" + sortOrder + self.dataset().setSortBy([value]) + self.dataset().search() + + def populateMenu(self): + """ + Show the menu options. + """ + self.clear() + + sortby = self.dataset().sortBy() + if sortby: + currentField = self.dataset().sortBy()[0].split(":")[0] + currentOrder = "dsc" if "dsc" in self.dataset().sortBy()[0] else "asc" + else: + currentField = "" + currentOrder = "" + + action = SeparatorAction("Sort By", self) + self.addAction(action) + + fields = self.dataset().fields() + + for field in fields: + + if not field.get("sortable"): + continue + + name = field.get("name") + + action = self.addAction(name.title()) + action.setCheckable(True) + + if currentField == name: + action.setChecked(True) + else: + action.setChecked(False) + + callback = partial(self.setSortBy, name, currentOrder) + action.triggered.connect(callback) + + action = SeparatorAction("Sort Order", self) + self.addAction(action) + + action = self.addAction("Ascending") + action.setCheckable(True) + action.setChecked(currentOrder == "asc") + + callback = partial(self.setSortBy, currentField, "asc") + action.triggered.connect(callback) + + action = self.addAction("Descending") + action.setCheckable(True) + action.setChecked(currentOrder == "dsc") + + callback = partial(self.setSortBy, currentField, "dsc") + action.triggered.connect(callback) diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/statuswidget.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/statuswidget.py new file mode 100644 index 0000000..f004d71 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/statuswidget.py @@ -0,0 +1,235 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +from studiovendor import six +from studiovendor.Qt import QtCore +from studiovendor.Qt import QtWidgets + +import studiolibrary + + +class ProgressBar(QtWidgets.QFrame): + + def __init__(self, *args): + QtWidgets.QFrame.__init__(self, *args) + + layout = QtWidgets.QHBoxLayout() + layout.setSpacing(0) + layout.setContentsMargins(0, 0, 0, 0) + + self._label = QtWidgets.QLabel("", self) + self._label.setAlignment( + QtCore.Qt.AlignRight | + QtCore.Qt.AlignVCenter + ) + self._label.setSizePolicy( + QtWidgets.QSizePolicy.Preferred, + QtWidgets.QSizePolicy.Preferred + ) + + layout.addWidget(self._label) + + self._progressBar = QtWidgets.QProgressBar(self) + self._progressBar.setFormat("") + self._progressBar.setRange(0, 100) + self._progressBar.setSizePolicy( + QtWidgets.QSizePolicy.Preferred, + QtWidgets.QSizePolicy.Preferred + ) + + layout.addWidget(self._progressBar) + + self.setLayout(layout) + + def reset(self): + """Reimplementing for convenience""" + self._progressBar.reset() + + def setText(self, text): + """ + Reimplementing for convenience + + :type text: str + """ + self._label.setText(text) + + def setValue(self, value): + """ + Reimplementing for convenience + + :type value: float or int + """ + self._progressBar.setValue(value) + + def setRange(self, min_, max_): + """ + Reimplementing for convenience + + :type min_: int + :type max_: int + """ + self._progressBar.setRange(min_, max_) + + +class StatusWidget(QtWidgets.QFrame): + + DEFAULT_DISPLAY_TIME = 10000 # Milliseconds, 15 secs + + def __init__(self, *args): + QtWidgets.QFrame.__init__(self, *args) + + self.setObjectName("statusWidget") + self.setFrameShape(QtWidgets.QFrame.NoFrame) + + self._blocking = False + self._timer = QtCore.QTimer(self) + + self._label = QtWidgets.QLabel("", self) + self._label.setCursor(QtCore.Qt.IBeamCursor) + self._label.setTextInteractionFlags(QtCore.Qt.TextSelectableByMouse) + self._label.setSizePolicy(QtWidgets.QSizePolicy.Expanding, + QtWidgets.QSizePolicy.Preferred) + + self._button = QtWidgets.QPushButton(self) + self._button.setMaximumSize(QtCore.QSize(17, 17)) + self._button.setIconSize(QtCore.QSize(17, 17)) + + self._progressBar = ProgressBar(self) + self._progressBar.hide() + + layout = QtWidgets.QHBoxLayout() + layout.setContentsMargins(1, 0, 0, 0) + + layout.addWidget(self._button) + layout.addWidget(self._label) + layout.addWidget(self._progressBar) + + self.setLayout(layout) + self.setFixedHeight(19) + self.setMinimumWidth(5) + + self._timer.timeout.connect(self.reset) + + def progressBar(self): + """ + Get the progress widget + + rtype: QtWidgets.QProgressBar + """ + return self._progressBar + + def isBlocking(self): + """ + Return true if the status widget is blocking, otherwise return false. + :rtype: bool + """ + return self._blocking + + def showInfoMessage(self, message, msecs=None): + """ + Set an info message to be displayed in the status widget. + + :type message: str + :type msecs: int + + :rtype: None + """ + if self.isBlocking(): + return + + self.setProperty("status", "info") + + icon = studiolibrary.resource.icon("info") + self.showMessage(message, icon, msecs) + + def setProperty(self, *args): + """ + Overriding this method to force the style sheet to reload. + + :type args: list + """ + super(StatusWidget, self).setProperty(*args) + self.setStyleSheet(self.styleSheet()) + + def showErrorMessage(self, message, msecs=None): + """ + Set an error to be displayed in the status widget. + + :type message: str + :type msecs: int + + :rtype: None + """ + self.setProperty("status", "error") + + icon = studiolibrary.resource.icon("error") + self.showMessage(message, icon, msecs, blocking=True) + + def showWarningMessage(self, message, msecs=None): + """ + Set a warning to be displayed in the status widget. + + :type message: str + :type msecs: int + + :rtype: None + """ + if self.isBlocking(): + return + + self.setProperty("status", "warning") + + icon = studiolibrary.resource.icon("warning") + self.showMessage(message, icon, msecs) + + def showMessage(self, message, icon, msecs=None, blocking=False): + """ + Set the given text to be displayed in the status widget. + + :type message: str + :type icon: icon + :type msecs: int + + :rtype: None + """ + msecs = msecs or self.DEFAULT_DISPLAY_TIME + + self._blocking = blocking + + if icon: + self._button.setIcon(icon) + self._button.show() + else: + self._button.hide() + + if message: + self._label.setText(six.text_type(message)) + self._timer.stop() + self._timer.start(msecs) + else: + self.reset() + + self.update() + + def reset(self): + """ + Called when the current animation has finished. + + :rtype: None + """ + self._timer.stop() + self._button.hide() + self._label.setText("") + icon = studiolibrary.resource.icon("blank") + self._button.setIcon(icon) + self.setProperty("status", "") + self._blocking = False diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/themesmenu.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/themesmenu.py new file mode 100644 index 0000000..8c4d7b1 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/themesmenu.py @@ -0,0 +1,658 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +from studiovendor.Qt import QtGui +from studiovendor.Qt import QtCore +from studiovendor.Qt import QtWidgets +from studiovendor import six + +import studioqt +import studiolibrary + +from .separatoraction import SeparatorAction + + +__all__ = ["Theme", "ThemeAction", "ThemesMenu"] + + +THEME_PRESETS = [ + { + "name": "Blue", + "accentColor": "rgba(50, 180, 240, 255)", + "backgroundColor": None, + }, + { + "name": "Green", + "accentColor": "rgba(80, 200, 140, 255)", + "backgroundColor": None, + }, + { + "name": "Yellow", + "accentColor": "rgb(250, 200, 0)", + "backgroundColor": None, + }, + { + "name": "Orange", + "accentColor": "rgb(255, 170, 0)", + "backgroundColor": None, + }, + { + "name": "Peach", + "accentColor": "rgb(255, 125, 100)", + "backgroundColor": None, + }, + { + "name": "Red", + "accentColor": "rgb(230, 60, 60)", + "backgroundColor": None, + }, + { + "name": "Pink", + "accentColor": "rgb(255, 87, 123)", + "backgroundColor": None, + }, + { + "name": "Purple", + "accentColor": "rgb(110, 110, 240)", + "backgroundColor": None, + }, + { + "name": "Dark", + "accentColor": None, + "backgroundColor": "rgb(60, 64, 79)", + }, + { + "name": "Grey", + "accentColor": None, + "backgroundColor": "rgb(60, 60, 60)", + }, + { + "name": "Light", + "accentColor": None, + "backgroundColor": "rgb(245, 245, 255)", + }, +] + + +def themePresets(): + """ + Return the default theme presets. + + :rtype list[Theme] + """ + themes = [] + + for data in THEME_PRESETS: + theme = Theme() + + theme.setName(data.get("name")) + theme.setAccentColor(data.get("accentColor")) + theme.setBackgroundColor(data.get("backgroundColor")) + + themes.append(theme) + + return themes + + +class ThemeAction(QtWidgets.QAction): + + def __init__(self, theme, *args): + """ + :type theme: Theme + :type menu: QtWidgets.QMenu + :rtype: QtWidgets.QAction + """ + QtWidgets.QAction.__init__(self, theme.name(), *args) + self._theme = theme + + if theme.accentColor(): + color = theme.accentColor() + elif theme.backgroundColor(): + color = theme.backgroundColor() + else: + color = "rgb(255,255,255)" + + icon = studiolibrary.resource.icon(ThemesMenu.THEME_ICON, color=color) + self.setIcon(icon) + + def theme(self): + """ + Return the theme object for the action. + + :rtype: Theme + """ + return self._theme + + +class ThemesMenu(QtWidgets.QMenu): + + THEME_ICON = "radio_button_checked_white" + + ENABLE_CUSTOM_ACTION = True + + def __init__(self, parent, theme, themes=None): + """ + :type themes: list[Theme] + :rtype: QtWidgets.QMenu + """ + QtWidgets.QMenu.__init__(self, "Themes", parent) + + self._theme = theme + self._themes = themes + + self.createActions() + + def createActions(self): + """ + Crate the actions to be shown in the menu. + + :rtype: None + """ + # Create the menu actions for setting the accent color + action = SeparatorAction("Accent", self) + self.addAction(action) + + themes = self._themes + + if not themes: + themes = themePresets() + + for theme in themes: + if theme.accentColor(): + action = ThemeAction(theme, self) + self.addAction(action) + + if self.ENABLE_CUSTOM_ACTION: + action = QtWidgets.QAction("Custom", self) + action.triggered.connect(self.theme().browseAccentColor) + color = self.theme().accentColor().toString() + icon = studiolibrary.resource.icon(ThemesMenu.THEME_ICON, color=color) + action.setIcon(icon) + self.addAction(action) + + # Create the menu actions for setting the background color + action = SeparatorAction("Background", self) + self.addAction(action) + + for theme in themes: + if not theme.accentColor() and theme.backgroundColor(): + action = ThemeAction(theme, self) + self.addAction(action) + + if self.ENABLE_CUSTOM_ACTION: + action = QtWidgets.QAction("Custom", self) + action.triggered.connect(self._theme.browseBackgroundColor) + color = self._theme.backgroundColor().toString() + icon = studiolibrary.resource.icon(ThemesMenu.THEME_ICON, color=color) + action.setIcon(icon) + self.addAction(action) + + self.triggered.connect(self._triggered) + + def theme(self): + """ + Return the current theme for the menu. + + :rtype: studioqt.Theme + """ + return self._theme + + def setTheme(self, theme): + """ + Set the current theme for the menu. + + :type theme: studioqt.Theme + :rtype: None + """ + self._theme = theme + + def _triggered(self, action): + """ + Triggered when a theme has been clicked. + + :type action: Action + :rtype: None + """ + theme = self.theme() + if not theme: + raise Exception("Please set the current theme for the menu.") + + if not isinstance(action, ThemeAction): + return + + if action.theme().accentColor(): + theme.setAccentColor(action.theme().accentColor()) + + if action.theme().backgroundColor(): + theme.setBackgroundColor(action.theme().backgroundColor()) + + +def showThemesMenu(parent=None, themes=None): + """ + Show a menu with the given themes. + + :type themes: list[Theme] + :type parent: QtWidgets.QWidget + :rtype: QtWidgets.QAction + """ + theme = Theme() + menu = ThemesMenu(parent=parent, theme=theme, themes=themes) + position = QtGui.QCursor().pos() + action = menu.exec_(position) + return theme + + +class Theme(QtCore.QObject): + + updated = QtCore.Signal() + + DEFAULT_DARK_COLOR = QtGui.QColor(60, 60, 60) + DEFAULT_LIGHT_COLOR = QtGui.QColor(220, 220, 220) + + DEFAULT_ACCENT_COLOR = QtGui.QColor(30, 145, 245) + DEFAULT_BACKGROUND_COLOR = QtGui.QColor(50, 50, 60) + + def __init__(self): + QtCore.QObject.__init__(self) + + self._dpi = 1 + + self._name = "Default" + self._accentColor = None + self._backgroundColor = None + + self.setAccentColor(self.DEFAULT_ACCENT_COLOR) + self.setBackgroundColor(self.DEFAULT_BACKGROUND_COLOR) + + def settings(self): + """ + Return a dictionary of settings for the current Theme. + + :rtype: dict + """ + settings = {} + + settings["name"] = self.name() + + accentColor = self.accentColor() + settings["accentColor"] = accentColor.toString() + + backgroundColor = self.backgroundColor() + settings["backgroundColor"] = backgroundColor.toString() + + return settings + + def setSettings(self, settings): + """ + Set a dictionary of settings for the current Theme. + + :type settings: dict + :rtype: None + """ + name = settings.get("name") + self.setName(name) + + color = settings.get("accentColor") + if color: + color = studioqt.Color.fromString(color) + self.setAccentColor(color) + + color = settings.get("backgroundColor") + if color: + color = studioqt.Color.fromString(color) + self.setBackgroundColor(color) + + def dpi(self): + """ + Return the dpi for the Theme + + :rtype: float + """ + return self._dpi + + def setDpi(self, dpi): + """ + Set the dpi for the Theme + + :type dpi: float + :rtype: None + """ + self._dpi = dpi + + def name(self): + """ + Return the name for the Theme + + :rtype: str + """ + return self._name + + def setName(self, name): + """ + Set the name for the Theme + + :type name: str + :rtype: None + """ + self._name = name + + def isDark(self): + """ + Return True if the current theme is dark. + + rtype: bool + """ + # The luminance for digital formats are (0.299, 0.587, 0.114) + red = self.backgroundColor().redF() * 0.299 + green = self.backgroundColor().greenF() * 0.587 + blue = self.backgroundColor().blueF() * 0.114 + + darkness = red + green + blue + + if darkness < 0.6: + return True + + return False + + def setDark(self): + """ + Set the current theme to the default dark color. + + :rtype: None + """ + self.setBackgroundColor(self.DEFAULT_DARK_COLOR) + + def setLight(self): + """ + Set the current theme to the default light color. + + :rtype: None + """ + self.setBackgroundColor(self.DEFAULT_LIGHT_COLOR) + + def iconColor(self): + """ + Return the icon color for the theme. + + :rtype: studioqt.Color + """ + return self.foregroundColor() + + def accentForgroundColor(self): + """ + Return the foreground color for the accent color. + + :rtype: studioqt.Color + """ + return studioqt.Color(255, 255, 255, 255) + + def foregroundColor(self): + """ + Return the foreground color for the theme. + + :rtype: studioqt.Color + """ + if self.isDark(): + return studioqt.Color(250, 250, 250, 225) + else: + return studioqt.Color(0, 40, 80, 180) + + def itemBackgroundColor(self): + """ + Return the item background color. + + :rtype: studioqt.Color + """ + if self.isDark(): + return studioqt.Color(255, 255, 255, 20) + else: + return studioqt.Color(255, 255, 255, 120) + + def itemBackgroundHoverColor(self): + """ + Return the item background color when the mouse hovers over the item. + + :rtype: studioqt.Color + """ + return studioqt.Color(255, 255, 255, 60) + + def accentColor(self): + """ + Return the accent color for the theme. + + :rtype: studioqt.Color or None + """ + return self._accentColor + + def backgroundColor(self): + """ + Return the background color for the theme. + + :rtype: studioqt.Color or None + """ + return self._backgroundColor + + def setAccentColor(self, color): + """ + Set the accent color for the theme. + + :type color: studioqt.Color | QtGui.QColor + """ + if isinstance(color, six.string_types): + color = studioqt.Color.fromString(color) + + if isinstance(color, QtGui.QColor): + color = studioqt.Color.fromColor(color) + + self._accentColor = color + + self.updated.emit() + + def setBackgroundColor(self, color): + """ + Set the background color for the theme. + + :type color: studioqt.Color | QtGui.QColor + """ + if isinstance(color, six.string_types): + color = studioqt.Color.fromString(color) + + if isinstance(color, QtGui.QColor): + color = studioqt.Color.fromColor(color) + + self._backgroundColor = color + + self.updated.emit() + + def createColorDialog( + self, + parent, + standardColors=None, + currentColor=None, + ): + """ + Create a new instance of the color dialog. + + :type parent: QtWidgets.QWidget + :type standardColors: list[int] + :rtype: QtWidgets.QColorDialog + """ + dialog = QtWidgets.QColorDialog(parent) + + if standardColors: + index = -1 + for colorR, colorG, colorB in standardColors: + index += 1 + + color = QtGui.QColor(colorR, colorG, colorB).rgba() + + try: + # Support for new qt5 signature + color = QtGui.QColor(color) + dialog.setStandardColor(index, color) + except: + # Support for new qt4 signature + color = QtGui.QColor(color).rgba() + dialog.setStandardColor(index, color) + + # PySide2 doesn't support d.open(), so we need to pass a blank slot. + dialog.open(self, QtCore.SLOT("blankSlot()")) + + if currentColor: + dialog.setCurrentColor(currentColor) + + return dialog + + def browseAccentColor(self, parent=None): + """ + Show the color dialog for changing the accent color. + + :type parent: QtWidgets.QWidget + :rtype: None + """ + standardColors = [ + (230, 60, 60), (210, 40, 40), (190, 20, 20), (250, 80, 130), + (230, 60, 110), (210, 40, 90), (255, 90, 40), (235, 70, 20), + (215, 50, 0), (240, 100, 170), (220, 80, 150), (200, 60, 130), + (255, 125, 100), (235, 105, 80), (215, 85, 60), (240, 200, 150), + (220, 180, 130), (200, 160, 110), (250, 200, 0), (230, 180, 0), + (210, 160, 0), (225, 200, 40), (205, 180, 20), (185, 160, 0), + (80, 200, 140), (60, 180, 120), (40, 160, 100), (80, 225, 120), + (60, 205, 100), (40, 185, 80), (50, 180, 240), (30, 160, 220), + (10, 140, 200), (100, 200, 245), (80, 180, 225), (60, 160, 205), + (130, 110, 240), (110, 90, 220), (90, 70, 200), (180, 160, 255), + (160, 140, 235), (140, 120, 215), (180, 110, 240), (160, 90, 220), + (140, 70, 200), (210, 110, 255), (190, 90, 235), (170, 70, 215) + ] + + currentColor = self.accentColor() + + dialog = self.createColorDialog(parent, standardColors, currentColor) + dialog.currentColorChanged.connect(self.setAccentColor) + + if dialog.exec_(): + self.setAccentColor(dialog.selectedColor()) + else: + self.setAccentColor(currentColor) + + def browseBackgroundColor(self, parent=None): + """ + Show the color dialog for changing the background color. + + :type parent: QtWidgets.QWidget + :rtype: None + """ + standardColors = [ + (0, 0, 0), (20, 20, 20), (40, 40, 40), (60, 60, 60), + (80, 80, 80), (100, 100, 100), (20, 20, 30), (40, 40, 50), + (60, 60, 70), (80, 80, 90), (100, 100, 110), (120, 120, 130), + (0, 30, 60), (20, 50, 80), (40, 70, 100), (60, 90, 120), + (80, 110, 140), (100, 130, 160), (0, 60, 60), (20, 80, 80), + (40, 100, 100), (60, 120, 120), (80, 140, 140), (100, 160, 160), + (0, 60, 30), (20, 80, 50), (40, 100, 70), (60, 120, 90), + (80, 140, 110), (100, 160, 130), (60, 0, 10), (80, 20, 30), + (100, 40, 50), (120, 60, 70), (140, 80, 90), (160, 100, 110), + (60, 0, 40), (80, 20, 60), (100, 40, 80), (120, 60, 100), + (140, 80, 120), (160, 100, 140), (40, 15, 5), (60, 35, 25), + (80, 55, 45), (100, 75, 65), (120, 95, 85), (140, 115, 105) + ] + + currentColor = self.backgroundColor() + + dialog = self.createColorDialog(parent, standardColors, currentColor) + dialog.currentColorChanged.connect(self.setBackgroundColor) + + if dialog.exec_(): + self.setBackgroundColor(dialog.selectedColor()) + else: + self.setBackgroundColor(currentColor) + + def options(self): + """ + Return the variables used to customise the style sheet. + + :rtype: dict + """ + accentColor = self.accentColor() + accentForegroundColor = self.accentForgroundColor() + + foregroundColor = self.foregroundColor() + backgroundColor = self.backgroundColor() + + itemBackgroundColor = self.itemBackgroundColor() + itemBackgroundHoverColor = self.itemBackgroundHoverColor() + + if self.isDark(): + darkness = "white" + else: + darkness = "black" + + resourceDirname = studiolibrary.resource.RESOURCE_DIRNAME + resourceDirname = resourceDirname.replace("\\", "/") + + options = { + "DARKNESS": darkness, + "RESOURCE_DIRNAME": resourceDirname, + + "ACCENT_COLOR": accentColor.toString(), + "ACCENT_COLOR_R": str(accentColor.red()), + "ACCENT_COLOR_G": str(accentColor.green()), + "ACCENT_COLOR_B": str(accentColor.blue()), + + "ACCENT_FOREGROUND_COLOR": accentForegroundColor.toString(), + + "FOREGROUND_COLOR": foregroundColor.toString(), + "FOREGROUND_COLOR_R": str(foregroundColor.red()), + "FOREGROUND_COLOR_G": str(foregroundColor.green()), + "FOREGROUND_COLOR_B": str(foregroundColor.blue()), + + "BACKGROUND_COLOR": backgroundColor.toString(), + "BACKGROUND_COLOR_R": str(backgroundColor.red()), + "BACKGROUND_COLOR_G": str(backgroundColor.green()), + "BACKGROUND_COLOR_B": str(backgroundColor.blue()), + + "ITEM_TEXT_COLOR": foregroundColor.toString(), + "ITEM_TEXT_SELECTED_COLOR": accentForegroundColor.toString(), + + "ITEM_BACKGROUND_COLOR": itemBackgroundColor.toString(), + "ITEM_BACKGROUND_HOVER_COLOR": itemBackgroundHoverColor.toString(), + "ITEM_BACKGROUND_SELECTED_COLOR": accentColor.toString(), + } + + return options + + def styleSheet(self): + """ + Return the style sheet for this theme. + + :rtype: str + """ + options = self.options() + path = studiolibrary.resource.get("css", "default.css") + styleSheet = studioqt.StyleSheet.fromPath(path, options=options, dpi=self.dpi()) + return styleSheet.data() + + +def example(): + """ + Run a simple example of theme menu. + + :rtype: None + """ + theme = showThemesMenu() + print("Accent color:", theme.accentColor()) + print("Background color:", theme.backgroundColor()) + + +if __name__ == "__main__": + with studioqt.app(): + example() diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/toastwidget.py b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/toastwidget.py new file mode 100644 index 0000000..481193b --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrary/widgets/toastwidget.py @@ -0,0 +1,160 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +from studiovendor.Qt import QtGui +from studiovendor.Qt import QtCore +from studiovendor.Qt import QtWidgets + +import studioqt + + +class ToastWidget(QtWidgets.QLabel): + """ + A toast is a widget containing a quick little message for the user. + + The toast class helps you create and show those. + + Example: + toast = studiolibrary.widgets.ToastWidget(parent) + toast.setDuration(1000) # Show for 1 second + toast.setText("Hello world") + toast.show() + """ + + DEFAULT_DURATION = 500 # 0.5 seconds + + def __init__(self, *args): + QtWidgets.QLabel.__init__(self, *args) + + self._timer = QtCore.QTimer(self) + self._timer.setSingleShot(True) + self._timer.timeout.connect(self.fadeOut) + + self._duration = self.DEFAULT_DURATION + + self.setMouseTracking(True) + self.setAlignment(QtCore.Qt.AlignCenter) + self.setAttribute(QtCore.Qt.WA_TransparentForMouseEvents) + + if self.parent(): + self.parent().installEventFilter(self) + + def eventFilter(self, obj, event): + """ + Update the geometry when the parent widget changes size. + + :type obj: QWidgets.QWidget + :type event: QtCore.QEvent + + :rtype: bool + """ + if event.type() == QtCore.QEvent.Resize: + self.updateGeometry() + return QtWidgets.QLabel.eventFilter(self, obj, event) + + def updateGeometry(self): + """ + Update and align the geometry to the parent widget. + + :rtype: None + """ + padding = 30 + widget = self.parent() + + width = self.textWidth() + padding + height = self.textHeight() + padding + + x = widget.width() / 2 - width / 2 + y = (widget.height() - height) / 1.2 + + self.setGeometry(x, y, width, height) + + def duration(self): + """ + Return the duration. + + :rtype: int + """ + return self._duration + + def setDuration(self, duration): + """ + Set how long to show the toast for in milliseconds. + + :type duration: int + :rtype: None + """ + self._duration = duration + + def fadeOut(self, duration=250): + """ + Fade out the toast message. + + :type duration: int + :rtype: None + """ + studioqt.fadeOut(self, duration=duration, onFinished=self.hide) + + def textRect(self): + """ + Return the bounding box rect for the text. + + :rtype: QtCore.QRect + """ + text = self.text() + font = self.font() + metrics = QtGui.QFontMetricsF(font) + return metrics.boundingRect(text) + + def textWidth(self): + """ + Return the width of the text. + + :rtype: int + """ + textWidth = self.textRect().width() + return max(0, textWidth) + + def textHeight(self): + """ + Return the height of the text. + + :rtype: int + """ + textHeight = self.textRect().height() + return max(0, textHeight) + + def setText(self, text): + """ + Overriding this method to update the size depending on the text width. + + :type text: str + :rtype: None + """ + QtWidgets.QLabel.setText(self, text) + self.updateGeometry() + + def show(self): + """ + Overriding this method to start the timer to hide the toast. + + :rtype: None + """ + duration = self.duration() + + self._timer.stop() + self._timer.start(duration) + + if not self.isVisible(): + # Fade in will reset the alpha effect back to 1. + studioqt.fadeIn(self, duration=0) + QtWidgets.QLabel.show(self) diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/BaseLoadWidget.ui b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/BaseLoadWidget.ui new file mode 100644 index 0000000..48d47fe --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/BaseLoadWidget.ui @@ -0,0 +1,454 @@ + + + Form + + + + 0 + 0 + 160 + 560 + + + + + 0 + 0 + + + + + 160 + 560 + + + + + 16777215 + 16777215 + + + + Form + + + + + + + 2 + + + QLayout::SetDefaultConstraint + + + 0 + + + + + + 0 + 24 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + 0 + + + 0 + + + + + + + + QFrame::NoFrame + + + QFrame::Plain + + + 0 + + + + 0 + + + 4 + + + 2 + + + 4 + + + 2 + + + + + + 0 + 16 + + + + QFrame::NoFrame + + + QFrame::Plain + + + 0 + + + + 0 + + + 0 + + + + + + + + QFrame::NoFrame + + + QFrame::Plain + + + 0 + + + + 0 + + + 0 + + + + + + 0 + 0 + + + + + + + QFrame::NoFrame + + + QFrame::Plain + + + 0 + + + + 0 + + + 0 + + + + + 0 + + + 0 + + + 0 + + + + + + 0 + 1 + + + + + 50 + 50 + + + + + 150 + 150 + + + + + + + QFrame::NoFrame + + + QFrame::Plain + + + 0 + + + + 0 + + + 0 + + + 4 + + + 0 + + + 2 + + + + + + + + + + + + + + + + + 0 + 16 + + + + QFrame::NoFrame + + + QFrame::Plain + + + 0 + + + + 0 + + + 0 + + + + + + + + + + + + 0 + 0 + + + + QFrame::NoFrame + + + QFrame::Raised + + + 0 + + + + 0 + + + 0 + + + + + + + + QFrame::NoFrame + + + QFrame::Plain + + + 0 + + + + 1 + + + + + 0 + + + 0 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 0 + 0 + + + + + 80 + 35 + + + + + 125 + 35 + + + + + Arial + 12 + 50 + false + + + + + + + + + + Apply + + + + + + + + 0 + 0 + + + + + 35 + 35 + + + + + 35 + 16777215 + + + + + + + + icons/selectionSet2.pngicons/selectionSet2.png + + + + 25 + 25 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + 0 + 2 + + + + QFrame::NoFrame + + + QFrame::Plain + + + 0 + + + + + + + + + snapshot() + apply() + edit() + showContextMenu() + + diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/BaseSaveWidget.ui b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/BaseSaveWidget.ui new file mode 100644 index 0000000..5ac4599 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/BaseSaveWidget.ui @@ -0,0 +1,304 @@ + + + Form + + + + 0 + 0 + 167 + 473 + + + + + 0 + 0 + + + + + 160 + 0 + + + + + 16777215 + 16777215 + + + + Create Item + + + + + + + 4 + + + 0 + + + + + + 0 + 24 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + 0 + + + 0 + + + + + + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + + 50 + 150 + + + + + 150 + 150 + + + + + + + QFrame::NoFrame + + + QFrame::Plain + + + 0 + + + + 0 + + + 0 + + + 2 + + + 0 + + + 2 + + + + + + + + + + + 0 + 16 + + + + QFrame::NoFrame + + + QFrame::Plain + + + 0 + + + + 0 + + + 4 + + + 2 + + + 4 + + + 2 + + + + + + + + QFrame::NoFrame + + + QFrame::Plain + + + 0 + + + + 0 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 0 + 0 + + + + + 80 + 35 + + + + + 140 + 35 + + + + + Arial + 12 + 50 + false + + + + + + + + + + Save + + + + + + + + 35 + 35 + + + + + 5 + 16777215 + + + + + + + + icons/selectionSet2.pngicons/selectionSet2.png + + + + 25 + 25 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + 0 + 2 + + + + QFrame::NoFrame + + + QFrame::Plain + + + + + + + + + snapshot() + save() + + diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/README.md b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/README.md new file mode 100644 index 0000000..e4d8bd7 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/README.md @@ -0,0 +1,109 @@ +# Studio Library Items + +Items are used for loading and saving data. + + +### Pose Item + +Saving and loading a pose items + +```python +from studiolibrarymaya import poseitem + +path = "/AnimLibrary/Characters/Malcolm/malcolm.pose" +objects = maya.cmds.ls(selection=True) or [] +namespaces = [] + +# Saving a pose item +poseitem.save(path, objects=objects) + +# Loading a pose item +poseitem.load(path, objects=objects, namespaces=namespaces, key=True, mirror=False) +``` + +### Animation Item + +Saving and loading animation items + +```python +from studiolibrarymaya import animitem + +path = "/AnimLibrary/Characters/Malcolm/malcolm.anim" +objects = maya.cmds.ls(selection=True) or [] + +# Saving an animation item +animitem.save(path, objects=objects, frameRange=(0, 200), bakeConnected=False) + +# Loading an animation item +animitem.load(path, objects=objects, option="replace all", connect=False, currentTime=False) +``` + +Loading an animation to multiple namespaces + +```python +from studiolibrarymaya import animitem +animitem.load(path, namespaces=["character1", "character2"], option="replace all") +``` + +### Mirror Table Item + +Saving and loading mirror tables + +```python +from studiolibrarymaya import mirroritem + +path = "/AnimLibrary/Characters/Malcolm/malcolm.mirror" +objects = maya.cmds.ls(selection=True) or [] + +# Saving a mirror table item +mirroritem.save(path, objects=objects, leftSide="Lf", rightSide="Rf") + +# Loading a mirror table item +mirroritem.load(path, objects=objects, namespaces=[], option="swap", animation=True, time=None) +``` + +### Selection Set Item + +Saving and loading selection sets + +```python +from studiolibrarymaya import setsitem + +path = "/AnimLibrary/Characters/Malcolm/malcolm.set" +objects = maya.cmds.ls(selection=True) or [] + +# Saving a selection sets item +setsitem.save(path, objects=objects) + +# Loading a selection sets item +setsitem.load(path, objects=objects, namespaces=[]) +``` + + +### Maya File Item (Development) + +Saving and loading a Maya file item + +This item can be used to load and save any Maya nodes. For example: +locators and geometry. + +```python +from studiolibrarymaya import mayafileitem + +path = "/AnimLibrary/Characters/Malcolm/malcolm.mayafile" +objects = maya.cmds.ls(selection=True) or [] + +# Saving the item to disc +mayafileitem.save(path, objects=objects) + +# Loading the item from disc +mayafileitem.load(path) +``` + +### Example Item + +If you would like to create a custom item for saving and loading different data types, then please have a look at the [exampleitem.py](exampleitem.py) + +When developing a new item you can "Shift + Click" on the shelf icon which will reload all Studio Library modules including your changes to the item. + +Make sure you register any new items using either the "itemRegistry" key in the [config file](../studiolibrary/config/default.json) or by calling `studiolibrary.registerItem(cls)`. diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/__init__.py b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/__init__.py new file mode 100644 index 0000000..fa43df4 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/__init__.py @@ -0,0 +1,11 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/animitem.py b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/animitem.py new file mode 100644 index 0000000..fc92c85 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/animitem.py @@ -0,0 +1,273 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +import os +import logging + +from studiolibrarymaya import baseitem + +try: + import mutils + import mutils.gui + import maya.cmds +except ImportError as error: + print(error) + + +logger = logging.getLogger(__name__) + + +def save(path, *args, **kwargs): + """Convenience function for saving an AnimItem.""" + AnimItem(path).safeSave(*args, **kwargs) + + +def load(path, *args, **kwargs): + """Convenience function for loading an AnimItem.""" + AnimItem(path).load(*args, **kwargs) + + +class AnimItem(baseitem.BaseItem): + + NAME = "Animation" + EXTENSION = ".anim" + ICON_PATH = os.path.join(os.path.dirname(__file__), "icons", "animation.png") + TRANSFER_CLASS = mutils.Animation + + def imageSequencePath(self): + """ + Return the image sequence location for playing the animation preview. + + :rtype: str + """ + return self.path() + "/sequence" + + def loadSchema(self): + """ + Get schema used to load the animation item. + + :rtype: list[dict] + """ + schema = super(AnimItem, self).loadSchema() + + anim = mutils.Animation.fromPath(self.path()) + + startFrame = anim.startFrame() or 0 + endFrame = anim.endFrame() or 0 + + value = "{0} - {1}".format(startFrame, endFrame) + schema.insert(3, {"name": "Range", "value": value}) + + schema.extend([ + { + "name": "optionsGroup", + "title": "Options", + "type": "group", + "order": 2, + }, + { + "name": "connect", + "type": "bool", + "inline": True, + "default": False, + "persistent": True, + "label": {"name": ""} + }, + { + "name": "currentTime", + "type": "bool", + "inline": True, + "default": True, + "persistent": True, + "label": {"name": ""} + }, + { + "name": "sourceTime", + "title": "source", + "type": "range", + "default": [startFrame, endFrame], + }, + { + "name": "option", + "type": "enum", + "default": "replace all", + "items": ["replace", "replace all", "insert", "merge"], + "persistent": True, + }, + ]) + + return schema + + def load(self, **kwargs): + """ + Load the animation for the given objects and options. + + :type kwargs: dict + """ + anim = mutils.Animation.fromPath(self.path()) + anim.load( + objects=kwargs.get("objects"), + namespaces=kwargs.get("namespaces"), + attrs=kwargs.get("attrs"), + startFrame=kwargs.get("startFrame"), + sourceTime=kwargs.get("sourceTime"), + option=kwargs.get("option"), + connect=kwargs.get("connect"), + mirrorTable=kwargs.get("mirrorTable"), + currentTime=kwargs.get("currentTime") + ) + + def saveSchema(self): + """ + Get the schema for saving an animation item. + + :rtype: list[dict] + """ + start, end = (1, 100) + + try: + start, end = mutils.currentFrameRange() + except NameError as error: + logger.exception(error) + + return [ + { + "name": "folder", + "type": "path", + "layout": "vertical", + "visible": False, + }, + { + "name": "name", + "type": "string", + "layout": "vertical" + }, + { + "name": "fileType", + "type": "enum", + "layout": "vertical", + "default": "mayaAscii", + "items": ["mayaAscii", "mayaBinary"], + "persistent": True + }, + { + "name": "frameRange", + "type": "range", + "layout": "vertical", + "default": [start, end], + "actions": [ + { + "name": "From Timeline", + "callback": mutils.playbackFrameRange + }, + { + "name": "From Selected Timeline", + "callback": mutils.selectedFrameRange + }, + { + "name": "From Selected Objects", + "callback": mutils.selectedObjectsFrameRange + }, + ] + }, + { + "name": "byFrame", + "type": "int", + "default": 1, + "layout": "vertical", + "persistent": True + }, + { + "name": "comment", + "type": "text", + "layout": "vertical" + }, + { + "name": "bakeConnected", + "type": "bool", + "default": False, + "persistent": True, + "inline": True, + "label": {"visible": False} + }, + { + "name": "objects", + "type": "objects", + "label": { + "visible": False + } + }, + ] + + def saveValidator(self, **kwargs): + """ + The save validator is called when an input field has changed. + + :type kwargs: dict + :rtype: list[dict] + """ + fields = super(AnimItem, self).saveValidator(**kwargs) + + # Validate the by frame field + if kwargs.get("byFrame") == '' or kwargs.get("byFrame", 1) < 1: + fields.extend([ + { + "name": "byFrame", + "error": "The by frame value cannot be less than 1!" + } + ]) + + # Validate the frame range field + start, end = kwargs.get("frameRange", (0, 1)) + if start >= end: + fields.extend([ + { + "name": "frameRange", + "error": "The start frame cannot be greater " + "than or equal to the end frame!" + } + ]) + + # Validate the current selection field + objects = kwargs.get("objects") + if objects and mutils.getDurationFromNodes(objects, time=[start, end]) <= 0: + fields.extend([ + { + "name": "objects", + "error": "No animation was found on the selected object/s!" + "Please create a pose instead!", + } + ]) + + return fields + + def save(self, objects, sequencePath="", **kwargs): + """ + Save the animation from the given objects to the item path. + + :type objects: list[str] + :type sequencePath: str + :type kwargs: dict + """ + super(AnimItem, self).save(**kwargs) + + # Save the animation to the given path location on disc + mutils.saveAnim( + objects, + self.path(), + time=kwargs.get("frameRange"), + fileType=kwargs.get("fileType"), + iconPath=kwargs.get("thumbnail"), + metadata={"description": kwargs.get("comment", "")}, + sequencePath=sequencePath, + bakeConnected=kwargs.get("bakeConnected") + ) diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/baseitem.py b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/baseitem.py new file mode 100644 index 0000000..0f236b4 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/baseitem.py @@ -0,0 +1,445 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +import os +import shutil +import logging + +from studiovendor.Qt import QtGui +from studiovendor.Qt import QtCore + +import studiolibrary + +from studiolibrarymaya import basesavewidget +from studiolibrarymaya import baseloadwidget + +try: + import mutils + import mutils.gui + import maya.cmds +except ImportError as error: + print(error) + + +logger = logging.getLogger(__name__) + + +class BaseItemSignals(QtCore.QObject): + """""" + loadValueChanged = QtCore.Signal(object, object) + + +class BaseItem(studiolibrary.LibraryItem): + + _baseItemSignals = BaseItemSignals() + + loadValueChanged = _baseItemSignals.loadValueChanged + + """Base class for anim, pose, mirror and sets transfer items.""" + SAVE_WIDGET_CLASS = basesavewidget.BaseSaveWidget + LOAD_WIDGET_CLASS = baseloadwidget.BaseLoadWidget + + TRANSFER_CLASS = None + TRANSFER_BASENAME = "" + + def createLoadWidget(self, parent=None): + widget = self.LOAD_WIDGET_CLASS(item=self, parent=parent) + return widget + + @classmethod + def createSaveWidget(cls, parent=None, item=None): + item = item or cls() + widget = cls.SAVE_WIDGET_CLASS(item=item, parent=parent) + return widget + + @classmethod + def showSaveWidget(cls, libraryWindow=None, item=None): + """ + Overriding this method to set the destination location + for the save widget. + + Triggered when the user clicks the item action in the new item menu. + + :type libraryWindow: studiolibrary.LibraryWindow + :type item: studiolibrary.LibraryItem or None + """ + item = item or cls() + widget = cls.SAVE_WIDGET_CLASS(item=item, parent=libraryWindow) + + if libraryWindow: + path = libraryWindow.selectedFolderPath() + + widget.setFolderPath(path) + widget.setLibraryWindow(libraryWindow) + + libraryWindow.setCreateWidget(widget) + libraryWindow.folderSelectionChanged.connect(widget.setFolderPath) + + def __init__(self, *args, **kwargs): + """ + Initialise a new instance for the given path. + + :type path: str + :type args: list + :type kwargs: dict + """ + self._transferObject = None + self._currentLoadValues = {} + + studiolibrary.LibraryItem.__init__(self, *args, **kwargs) + + def emitLoadValueChanged(self, field, value): + """ + Emit the load value changed to be validated. + + :type field: str + :type value: object + """ + self.loadValueChanged.emit(field, value) + + def namespaces(self): + """ + Return the namesapces for this item depending on the namespace option. + + :rtype: list[str] or None + """ + return self.currentLoadValue("namespaces") + + def namespaceOption(self): + """ + Return the namespace option for this item. + + :rtype: NamespaceOption or None + """ + return self.currentLoadValue("namespaceOption") + + def doubleClicked(self): + """ + This method is called when the user double clicks the item. + + :rtype: None + """ + self.loadFromCurrentValues() + + def transferPath(self): + """ + Return the disc location to transfer path. + + :rtype: str + """ + if self.TRANSFER_BASENAME: + return os.path.join(self.path(), self.TRANSFER_BASENAME) + else: + return self.path() + + def transferObject(self): + """ + Return the transfer object used to read and write the data. + + :rtype: mutils.TransferObject + """ + if not self._transferObject: + path = self.transferPath() + self._transferObject = self.TRANSFER_CLASS.fromPath(path) + return self._transferObject + + def currentLoadValue(self, name): + """ + Get the current field value for the given name. + + :type name: str + :rtype: object + """ + return self._currentLoadValues.get(name) + + def setCurrentLoadValues(self, values): + """ + Set the current field values for the the item. + + :type values: dict + """ + self._currentLoadValues = values + + def loadFromCurrentValues(self): + """Load the mirror table using the settings for this item.""" + kwargs = self._currentLoadValues + objects = maya.cmds.ls(selection=True) or [] + + try: + self.load(objects=objects, **kwargs) + except Exception as error: + self.showErrorDialog("Item Error", str(error)) + raise + + def contextMenu(self, menu, items=None): + """ + This method is called when the user right clicks on this item. + + :type menu: QtWidgets.QMenu + :type items: list[BaseItem] + :rtype: None + """ + from studiolibrarymaya import setsmenu + + action = setsmenu.selectContentAction(self, parent=menu) + menu.addAction(action) + menu.addSeparator() + + subMenu = self.createSelectionSetsMenu(menu, enableSelectContent=False) + menu.addMenu(subMenu) + menu.addSeparator() + + studiolibrary.LibraryItem.contextMenu(self, menu, items=items) + + def showSelectionSetsMenu(self, **kwargs): + """ + Show the selection sets menu for this item at the cursor position. + + :rtype: QtWidgets.QAction + """ + menu = self.createSelectionSetsMenu(**kwargs) + position = QtGui.QCursor().pos() + action = menu.exec_(position) + return action + + def createSelectionSetsMenu(self, parent=None, enableSelectContent=True): + """ + Get a new instance of the selection sets menu. + + :type parent: QtWidgets.QWidget + :type enableSelectContent: bool + :rtype: QtWidgets.QMenu + """ + from . import setsmenu + + parent = parent or self.libraryWindow() + + namespaces = self.namespaces() + + menu = setsmenu.SetsMenu( + item=self, + parent=parent, + namespaces=namespaces, + enableSelectContent=enableSelectContent, + ) + + return menu + + def selectContent(self, namespaces=None, **kwargs): + """ + Select the contents of this item in the Maya scene. + + :type namespaces: list[str] + """ + namespaces = namespaces or self.namespaces() + + kwargs = kwargs or mutils.selectionModifiers() + + msg = "Select content: Item.selectContent(namespacea={0}, kwargs={1})" + msg = msg.format(namespaces, kwargs) + logger.debug(msg) + + try: + self.transferObject().select(namespaces=namespaces, **kwargs) + except Exception as error: + self.showErrorDialog("Item Error", str(error)) + raise + + def loadSchema(self): + """ + Get schema used to load the item. + + :rtype: list[dict] + """ + modified = self.itemData().get("modified") + if modified: + modified = studiolibrary.timeAgo(modified) + + count = self.transferObject().objectCount() + plural = "s" if count > 1 else "" + contains = str(count) + " Object" + plural + + return [ + { + "name": "infoGroup", + "title": "Info", + "type": "group", + "order": 1, + }, + { + "name": "name", + "value": self.name(), + }, + { + "name": "owner", + "value": self.transferObject().owner(), + }, + { + "name": "created", + "value": modified, + }, + { + "name": "contains", + "value": contains, + }, + { + "name": "comment", + "value": self.transferObject().description() or "No comment", + }, + { + "name": "namespaceGroup", + "title": "Namespace", + "type": "group", + "order": 10, + }, + { + "name": "namespaceOption", + "title": "", + "type": "radio", + "value": "From file", + "items": ["From file", "From selection", "Use custom"], + "persistent": True, + "persistentKey": "BaseItem", + }, + { + "name": "namespaces", + "title": "", + "type": "tags", + "value": [], + "items": mutils.namespace.getAll(), + "persistent": True, + "label": {"visible": False}, + "persistentKey": "BaseItem", + }, + ] + + def loadValidator(self, **values): + """ + Called when the load fields change. + + :type values: dict + """ + namespaces = values.get("namespaces") + namespaceOption = values.get("namespaceOption") + + if namespaceOption == "From file": + namespaces = self.transferObject().namespaces() + elif namespaceOption == "From selection": + namespaces = mutils.namespace.getFromSelection() + + fieldChanged = values.get("fieldChanged") + if fieldChanged == "namespaces": + values["namespaceOption"] = "Use custom" + else: + values["namespaces"] = namespaces + + self._currentLoadValues = values + + return [ + { + "name": "namespaces", + "value": values.get("namespaces"), + }, + { + "name": "namespaceOption", + "value": values.get("namespaceOption"), + }, + ] + + def load(self, **kwargs): + """ + Load the data from the transfer object. + + :rtype: None + """ + logger.debug(u'Loading: {0}'.format(self.transferPath())) + + self.transferObject().load(**kwargs) + + logger.debug(u'Loading: {0}'.format(self.transferPath())) + + def saveSchema(self): + """ + The base save schema. + + :rtype: list[dict] + """ + return [ + { + "name": "folder", + "type": "path", + "layout": "vertical", + "visible": False, + }, + { + "name": "name", + "type": "string", + "layout": "vertical", + }, + { + "name": "comment", + "type": "text", + "layout": "vertical" + }, + { + "name": "objects", + "type": "objects", + "label": {"visible": False} + }, + ] + + def saveValidator(self, **kwargs): + """ + The save validator is called when an input field has changed. + + :type kwargs: dict + :rtype: list[dict] + """ + fields = [] + + if not kwargs.get("folder"): + fields.append({ + "name": "folder", + "error": "No folder selected. Please select a destination folder.", + }) + + if not kwargs.get("name"): + fields.append({ + "name": "name", + "error": "No name specified. Please set a name before saving.", + }) + + selection = maya.cmds.ls(selection=True) or [] + msg = "" + if not selection: + msg = "No objects selected. Please select at least one object." + + fields.append({ + "name": "objects", + "value": selection, + "error": msg, + }, + ) + + return fields + + def save(self, thumbnail="", **kwargs): + """ + Save all the given object data to the item path on disc. + + :type thumbnail: str + :type kwargs: dict + """ + # Copy the icon path to the given path + if thumbnail: + basename = os.path.basename(thumbnail) + shutil.copyfile(thumbnail, self.path() + "/" + basename) diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/baseloadwidget.py b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/baseloadwidget.py new file mode 100644 index 0000000..5598e5c --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/baseloadwidget.py @@ -0,0 +1,255 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +import os +import logging + +from studiovendor.Qt import QtGui +from studiovendor.Qt import QtCore +from studiovendor.Qt import QtWidgets + +import studioqt +import studiolibrary +import studiolibrary.widgets + +try: + import mutils + import mutils.gui + import maya.cmds +except ImportError as error: + print(error) + + +logger = logging.getLogger(__name__) + + +class BaseLoadWidget(QtWidgets.QWidget): + + """Base widget for loading items.""" + + def __init__(self, item, parent=None): + """ + :type item: studiolibrarymaya.BaseItem + :type parent: QtWidgets.QWidget or None + """ + QtWidgets.QWidget.__init__(self, parent) + + self.setObjectName("studioLibraryBaseLoadWidget") + self.setWindowTitle("Load Item") + + self.loadUi() + + self._item = item + self._scriptJob = None + self._formWidget = None + + widget = self.createTitleWidget() + widget.ui.menuButton.clicked.connect(self.showMenu) + + self.ui.titleFrame.layout().addWidget(widget) + + # Create the icon group box + groupBox = studiolibrary.widgets.GroupBoxWidget("Icon", self.ui.iconFrame) + groupBox.setObjectName("iconGroupBoxWidget") + groupBox.setPersistent(True) + self.ui.iconTitleFrame.layout().addWidget(groupBox) + + # Create the thumbnail widget and set the image + self.ui.thumbnailButton = studiolibrary.widgets.ImageSequenceWidget(self) + self.ui.thumbnailButton.setObjectName("thumbnailButton") + self.ui.thumbnailFrame.layout().insertWidget(0, self.ui.thumbnailButton) + + if os.path.exists(item.imageSequencePath()): + self.ui.thumbnailButton.setPath(item.imageSequencePath()) + + elif os.path.exists(item.thumbnailPath()): + self.ui.thumbnailButton.setPath(item.thumbnailPath()) + + # Create the load widget and set the load schema + self._formWidget = studiolibrary.widgets.FormWidget(self) + self._formWidget.setObjectName(item.__class__.__name__ + "Form") + self._formWidget.setSchema(item.loadSchema()) + self._formWidget.setValidator(self.loadValidator) + self._formWidget.validate() + + self.ui.formFrame.layout().addWidget(self._formWidget) + + try: + self.selectionChanged() + self.setScriptJobEnabled(True) + except NameError as error: + logger.exception(error) + + self.updateThumbnailSize() + + self._item.loadValueChanged.connect(self._itemValueChanged) + self.ui.acceptButton.clicked.connect(self.accept) + self.ui.selectionSetButton.clicked.connect(self.showSelectionSetsMenu) + + def loadValidator(self, *args, **kwargs): + return self.item().loadValidator(*args, **kwargs) + + def createTitleWidget(self): + """ + Create a new instance of the title bar widget. + + :rtype: QtWidgets.QFrame + """ + class UI(object): + """Proxy class for attaching ui widgets as properties.""" + pass + + titleWidget = QtWidgets.QFrame(self) + titleWidget.setObjectName("titleWidget") + titleWidget.ui = UI() + + vlayout = QtWidgets.QVBoxLayout() + vlayout.setSpacing(0) + vlayout.setContentsMargins(0, 0, 0, 0) + + hlayout = QtWidgets.QHBoxLayout() + hlayout.setSpacing(0) + hlayout.setContentsMargins(0, 0, 0, 0) + + vlayout.addLayout(hlayout) + + titleButton = QtWidgets.QLabel(self) + titleButton.setText(self.item().NAME) + titleButton.setObjectName("titleButton") + titleWidget.ui.titleButton = titleButton + + hlayout.addWidget(titleButton) + + menuButton = QtWidgets.QPushButton(self) + menuButton.setText("...") + menuButton.setObjectName("menuButton") + titleWidget.ui.menuButton = menuButton + + hlayout.addWidget(menuButton) + + titleWidget.setLayout(vlayout) + + return titleWidget + + def _itemValueChanged(self, field, value): + """ + Triggered when the a field value has changed. + + :type field: str + :type value: object + """ + self._formWidget.setValue(field, value) + + def showMenu(self): + """ + Show the edit menu at the current cursor position. + + :rtype: QtWidgets.QAction + """ + menu = QtWidgets.QMenu(self) + + self.item().contextEditMenu(menu) + + point = QtGui.QCursor.pos() + point.setX(point.x() + 3) + point.setY(point.y() + 3) + + return menu.exec_(point) + + def loadUi(self): + """Convenience method for loading the .ui file.""" + studioqt.loadUi(self, cls=BaseLoadWidget) + + def formWidget(self): + """ + Get the form widget instance. + + :rtype: studiolibrary.widgets.formwidget.FormWidget + """ + return self._formWidget + + def setCustomWidget(self, widget): + """Convenience method for adding a custom widget when loading.""" + self.ui.customWidgetFrame.layout().addWidget(widget) + + def item(self): + """ + Get the library item to be created. + + :rtype: studiolibrarymaya.BaseItem + """ + return self._item + + def showSelectionSetsMenu(self): + """Show the selection sets menu.""" + item = self.item() + item.showSelectionSetsMenu() + + def resizeEvent(self, event): + """ + Overriding to adjust the image size when the widget changes size. + + :type event: QtCore.QSizeEvent + """ + self.updateThumbnailSize() + + def updateThumbnailSize(self): + """Update the thumbnail button to the size of the widget.""" + width = self.width() - 10 + if width > 250: + width = 250 + + size = QtCore.QSize(width, width) + self.ui.thumbnailButton.setIconSize(size) + self.ui.thumbnailButton.setMaximumSize(size) + self.ui.thumbnailFrame.setMaximumSize(size) + + def close(self): + """Overriding this method to disable the script job when closed.""" + self.setScriptJobEnabled(False) + + if self.formWidget(): + self.formWidget().savePersistentValues() + + QtWidgets.QWidget.close(self) + + def scriptJob(self): + """ + Get the script job object used when the users selection changes. + + :rtype: mutils.ScriptJob + """ + return self._scriptJob + + def setScriptJobEnabled(self, enabled): + """ + Enable the script job used when the users selection changes. + + :type enabled: bool + """ + if enabled: + if not self._scriptJob: + event = ['SelectionChanged', self.selectionChanged] + self._scriptJob = mutils.ScriptJob(event=event) + else: + sj = self.scriptJob() + if sj: + sj.kill() + self._scriptJob = None + + def selectionChanged(self): + """Triggered when the users Maya selection has changed.""" + self.formWidget().validate() + + def accept(self): + """Called when the user clicks the apply button.""" + self.item().loadFromCurrentValues() diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/basesavewidget.py b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/basesavewidget.py new file mode 100644 index 0000000..e14210c --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/basesavewidget.py @@ -0,0 +1,488 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +import os +import logging + +from studiovendor.Qt import QtGui +from studiovendor.Qt import QtCore +from studiovendor.Qt import QtWidgets + +import studioqt +import studiolibrary.widgets + +try: + import mutils + import mutils.gui + import maya.cmds +except ImportError as error: + print(error) + + +logger = logging.getLogger(__name__) + + +class BaseSaveWidget(QtWidgets.QWidget): + + """Base widget for saving new items.""" + + def __init__(self, item, parent=None): + """ + :type item: studiolibrarymaya.BaseItem + :type parent: QtWidgets.QWidget or None + """ + QtWidgets.QWidget.__init__(self, parent) + + self.setObjectName("studioLibraryBaseSaveWidget") + self.setWindowTitle("Save Item") + + studioqt.loadUi(self) + + self._item = item + self._scriptJob = None + self._formWidget = None + + widget = self.createTitleWidget() + widget.ui.menuButton.hide() + self.ui.titleFrame.layout().addWidget(widget) + + self.ui.acceptButton.clicked.connect(self.accept) + self.ui.selectionSetButton.clicked.connect(self.showSelectionSetsMenu) + + try: + self.setScriptJobEnabled(True) + except NameError as error: + logger.exception(error) + + self.createSequenceWidget() + self.updateThumbnailSize() + self.setItem(item) + + def showMenu(self): + """ + Show the edit menu at the current cursor position. + + :rtype: QtWidgets.QAction + """ + raise NotImplementedError("The title menu is not implemented") + + def createTitleWidget(self): + """ + Create a new instance of the title bar widget. + + :rtype: QtWidgets.QFrame + """ + + class UI(object): + """Proxy class for attaching ui widgets as properties.""" + pass + + titleWidget = QtWidgets.QFrame(self) + titleWidget.setObjectName("titleWidget") + titleWidget.ui = UI() + + vlayout = QtWidgets.QVBoxLayout() + vlayout.setSpacing(0) + vlayout.setContentsMargins(0, 0, 0, 0) + + hlayout = QtWidgets.QHBoxLayout() + hlayout.setSpacing(0) + hlayout.setContentsMargins(0, 0, 0, 0) + + vlayout.addLayout(hlayout) + + titleButton = QtWidgets.QLabel(self) + titleButton.setText(self.item().NAME) + titleButton.setObjectName("titleButton") + titleWidget.ui.titleButton = titleButton + + hlayout.addWidget(titleButton) + + menuButton = QtWidgets.QPushButton(self) + menuButton.setText("...") + menuButton.setObjectName("menuButton") + titleWidget.ui.menuButton = menuButton + + hlayout.addWidget(menuButton) + + titleWidget.setLayout(vlayout) + + return titleWidget + + def createSequenceWidget(self): + """Create a sequence widget to replace the static thumbnail widget.""" + theme = None + if self.parent(): + try: + theme = self.parent().theme() + except AttributeError as error: + logger.debug("Cannot find theme for parent.") + + self.ui.thumbnailButton = studiolibrary.widgets.ImageSequenceWidget(self, theme=theme) + self.ui.thumbnailButton.setObjectName("thumbnailButton") + self.ui.thumbnailFrame.layout().insertWidget(0, self.ui.thumbnailButton) + self.ui.thumbnailButton.clicked.connect(self.thumbnailCapture) + + text = "Click to capture a thumbnail from the current model panel.\n" \ + "CTRL + Click to show the capture window for better framing." + + self.ui.thumbnailButton.setToolTip(text) + + path = studiolibrary.resource.get("icons", "camera.svg") + self.ui.thumbnailButton.addAction( + path, + "Capture new image", + "Capture new image", + self.thumbnailCapture + ) + + path = studiolibrary.resource.get("icons", "expand.svg") + self.ui.thumbnailButton.addAction( + path, + "Show Capture window", + "Show Capture window", + self.showCaptureWindow + ) + + path = studiolibrary.resource.get("icons", "folder.svg") + self.ui.thumbnailButton.addAction( + path, + "Load image from disk", + "Load image from disk", + self.showBrowseImageDialog + ) + + icon = studiolibrary.resource.icon("thumbnail_solid.png") + self.ui.thumbnailButton.setIcon(icon) + + def setLibraryWindow(self, libraryWindow): + """ + Set the library widget for the item. + + :type libraryWindow: studiolibrary.LibraryWindow + :rtype: None + """ + self.item().setLibraryWindow(libraryWindow) + + def libraryWindow(self): + """ + Get the library widget for the item. + + :rtype: libraryWindow: studiolibrary.LibraryWindow + """ + return self.item().libraryWindow() + + def formWidget(self): + """ + Get the form widget instance. + + :rtype: studiolibrary.widgets.formwidget.FormWidget + """ + return self._formWidget + + def item(self): + """ + Get the library item to be created. + + :rtype: studiolibrarymaya.BaseItem + """ + return self._item + + def setItem(self, item): + """ + Set the item to be created. + + :type item: studiolibrarymaya.BaseItem + """ + self._item = item + + if os.path.exists(item.imageSequencePath()): + self.setThumbnailPath(item.imageSequencePath()) + elif not item.isTHUMBNAIL_PATH(): + self.setThumbnailPath(item.thumbnailPath()) + + schema = item.saveSchema() + if schema: + formWidget = studiolibrary.widgets.FormWidget(self) + formWidget.setSchema(schema) + formWidget.setValidator(item.saveValidator) + + # Used when overriding the item + name = os.path.basename(item.path()) + formWidget.setValues({"name": name}) + + self.ui.optionsFrame.layout().addWidget(formWidget) + self._formWidget = formWidget + + formWidget.validate() + else: + self.ui.optionsFrame.setVisible(False) + + def showSelectionSetsMenu(self): + """ + Show the selection sets menu for the current folder path. + + :rtype: None + """ + from studiolibrarymaya import setsmenu + + path = self.folderPath() + position = QtGui.QCursor().pos() + libraryWindow = self.libraryWindow() + + menu = setsmenu.SetsMenu.fromPath(path, libraryWindow=libraryWindow) + menu.exec_(position) + + def close(self): + """Overriding the close method to disable the script job on close.""" + self._formWidget.savePersistentValues() + self.setScriptJobEnabled(False) + QtWidgets.QWidget.close(self) + + def scriptJob(self): + """ + Get the script job object used when the users selection changes. + + :rtype: mutils.ScriptJob + """ + return self._scriptJob + + def setScriptJobEnabled(self, enabled): + """Set the script job used when the users selection changes.""" + if enabled: + if not self._scriptJob: + event = ['SelectionChanged', self.selectionChanged] + self._scriptJob = mutils.ScriptJob(event=event) + else: + sj = self.scriptJob() + if sj: + sj.kill() + self._scriptJob = None + + def resizeEvent(self, event): + """ + Overriding to adjust the image size when the widget changes size. + + :type event: QtCore.QSizeEvent + """ + self.updateThumbnailSize() + + def updateThumbnailSize(self): + """Update the thumbnail button to the size of the widget.""" + width = self.width() - 10 + if width > 250: + width = 250 + + size = QtCore.QSize(width, width) + self.ui.thumbnailButton.setIconSize(size) + self.ui.thumbnailButton.setMaximumSize(size) + self.ui.thumbnailFrame.setMaximumSize(size) + + def setFolderPath(self, path): + """ + Set the destination folder path. + + :type path: str + """ + self.formWidget().setValue("folder", path) + + def folderPath(self): + """ + Return the folder path. + + :rtype: str + """ + return self.formWidget().value("folder") + + def selectionChanged(self): + """Triggered when the Maya selection changes.""" + if self.formWidget(): + self.formWidget().validate() + + def showByFrameDialog(self): + """ + Show the by frame dialog. + + :rtype: None or QtWidgets.QDialogButtonBox.StandardButton + """ + result = None + text = 'To help speed up the playblast you can set the "by frame" ' \ + 'to a number greater than 1. For example if the "by frame" ' \ + 'is set to 2 it will playblast every second frame.' + + options = self.formWidget().values() + byFrame = options.get("byFrame", 1) + startFrame, endFrame = options.get("frameRange", [None, None]) + + duration = 1 + if startFrame is not None and endFrame is not None: + duration = endFrame - startFrame + + if duration > 100 and byFrame == 1: + + buttons = [ + QtWidgets.QDialogButtonBox.Ok, + QtWidgets.QDialogButtonBox.Cancel + ] + + result = studiolibrary.widgets.MessageBox.question( + self.libraryWindow(), + title="Playblast Tip", + text=text, + buttons=buttons, + enableDontShowCheckBox=True, + ) + + return result + + def showBrowseImageDialog(self): + """Show a file dialog for choosing an image from disc.""" + fileDialog = QtWidgets.QFileDialog( + self, + caption="Open Image", + filter="Image Files (*.png *.jpg)" + ) + + fileDialog.fileSelected.connect(self.setThumbnailPath) + fileDialog.exec_() + + def showCaptureWindow(self): + """Show the capture window for framing.""" + self.thumbnailCapture(show=True) + + def setThumbnailPath(self, path): + """ + Set the path to the thumbnail image or the image sequence directory. + + :type path: str + """ + filename, extension = os.path.splitext(path) + dst = studiolibrary.tempPath("thumbnail" + extension) + + studiolibrary.copyPath(path, dst, force=True) + + self.ui.thumbnailButton.setPath(dst) + + def _capturedCallback(self, src): + """ + Triggered when capturing a thumbnail snapshot. + + :type src: str + """ + path = os.path.dirname(src) + self.setThumbnailPath(path) + + def thumbnailCapture(self, show=False): + """Capture a playblast and save it to the temp thumbnail path.""" + options = self.formWidget().values() + startFrame, endFrame = options.get("frameRange", [None, None]) + step = options.get("byFrame", 1) + + # Ignore the by frame dialog when the control modifier is pressed. + if not studioqt.isControlModifier(): + result = self.showByFrameDialog() + if result == QtWidgets.QDialogButtonBox.Cancel: + return + + try: + path = studiolibrary.tempPath("sequence", "thumbnail.jpg") + mutils.gui.thumbnailCapture( + show=show, + path=path, + startFrame=startFrame, + endFrame=endFrame, + step=step, + clearCache=True, + captured=self._capturedCallback, + ) + + except Exception as e: + title = "Error while capturing thumbnail" + studiolibrary.widgets.MessageBox.critical(self.libraryWindow(), title, str(e)) + raise + + def showThumbnailCaptureDialog(self): + """ + Ask the user if they would like to capture a thumbnail. + + :rtype: int + """ + title = "Create a thumbnail" + text = "Would you like to capture a thumbnail?" + + buttons = [ + QtWidgets.QDialogButtonBox.Yes, + QtWidgets.QDialogButtonBox.Ignore, + QtWidgets.QDialogButtonBox.Cancel + ] + + + parent = self.item().libraryWindow() + button = studiolibrary.widgets.MessageBox.question( + parent, + title, + text, + buttons=buttons + ) + + if button == QtWidgets.QDialogButtonBox.Yes: + self.thumbnailCapture() + + return button + + def accept(self): + """Triggered when the user clicks the save button.""" + try: + self.formWidget().validate() + + if self.formWidget().hasErrors(): + raise Exception("\n".join(self.formWidget().errors())) + + hasFrames = self.ui.thumbnailButton.hasFrames() + if not hasFrames: + button = self.showThumbnailCaptureDialog() + if button == QtWidgets.QDialogButtonBox.Cancel: + return + + name = self.formWidget().value("name") + folder = self.formWidget().value("folder") + path = folder + "/" + name + thumbnail = self.ui.thumbnailButton.firstFrame() + + self.save(path=path, thumbnail=thumbnail) + + except Exception as e: + studiolibrary.widgets.MessageBox.critical( + self.libraryWindow(), + "Error while saving", + str(e), + ) + raise + + def save(self, path, thumbnail): + """ + Save the item with the given objects to the given disc location path. + + :type path: str + :type thumbnail: str + """ + kwargs = self.formWidget().values() + sequencePath = self.ui.thumbnailButton.dirname() + + item = self.item() + item.setPath(path) + item.safeSave( + thumbnail=thumbnail, + sequencePath=sequencePath, + **kwargs + ) + self.close() diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/exampleitem.py b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/exampleitem.py new file mode 100644 index 0000000..1ea28f2 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/exampleitem.py @@ -0,0 +1,92 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . +""" +NOTE: Make sure you register this item in the config. +""" + +import os +import logging + +from studiolibrarymaya import baseitem + + +logger = logging.getLogger(__name__) + + +class ExampleItem(baseitem.BaseItem): + + NAME = "Example" + EXTENSION = ".example" + ICON_PATH = os.path.join(os.path.dirname(__file__), "icons", "pose.png") + + def loadSchema(self, **kwargs): + """ + Get the schema used for loading the example item. + + :rtype: list[dict] + """ + return [ + { + "name": "option", + "type": "bool", + "default": False, + "persistent": True, + }, + ] + + def load(self, **kwargs): + """ + The load method is called with the user values from the load schema. + + :type kwargs: dict + """ + logger.info("Loading %s %s", self.path(), kwargs) + raise NotImplementedError("The load method is not implemented!") + + def saveSchema(self, **kwargs): + """ + Get the schema used for saving the example item. + + :rtype: list[dict] + """ + return [ + # The 'name' field and the 'folder' field are both required by + # the BaseItem. How this is handled may change in the future. + { + "name": "folder", + "type": "path", + "layout": "vertical", + "visible": False, + }, + { + "name": "name", + "type": "string", + "layout": "vertical" + }, + { + "name": "fileType", + "type": "enum", + "layout": "vertical", + "default": "mayaAscii", + "items": ["mayaAscii", "mayaBinary"], + "persistent": True + }, + ] + + def save(self, **kwargs): + """ + The save method is called with the user values from the save schema. + + :type kwargs: dict + """ + logger.info("Saving %s %s", self.path(), kwargs) + raise NotImplementedError("The save method is not implemented!") diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/animation.png b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/animation.png new file mode 100644 index 0000000..84d7e62 Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/animation.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/arrow.png b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/arrow.png new file mode 100644 index 0000000..2765a8c Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/arrow.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/file.png b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/file.png new file mode 100644 index 0000000..0b457eb Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/file.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/insert.png b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/insert.png new file mode 100644 index 0000000..08c1ee5 Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/insert.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/insertConnect.png b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/insertConnect.png new file mode 100644 index 0000000..a13e7d4 Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/insertConnect.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/merge.png b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/merge.png new file mode 100644 index 0000000..1a54b82 Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/merge.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/mergeConnect.png b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/mergeConnect.png new file mode 100644 index 0000000..cb3bdcc Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/mergeConnect.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/mirrortable.png b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/mirrortable.png new file mode 100644 index 0000000..bbe1b62 Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/mirrortable.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/pose.png b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/pose.png new file mode 100644 index 0000000..ff4dfd6 Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/pose.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/replace.png b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/replace.png new file mode 100644 index 0000000..de47f6c Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/replace.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/replaceCompletely.png b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/replaceCompletely.png new file mode 100644 index 0000000..3bea03c Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/replaceCompletely.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/replaceConnect.png b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/replaceConnect.png new file mode 100644 index 0000000..68fa7d1 Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/replaceConnect.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/selectionSet.png b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/selectionSet.png new file mode 100644 index 0000000..fa2d0b6 Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/selectionSet.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/selectionSet2.png b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/selectionSet2.png new file mode 100644 index 0000000..4a03dcb Binary files /dev/null and b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/icons/selectionSet2.png differ diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/mayafileitem.py b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/mayafileitem.py new file mode 100644 index 0000000..9565d78 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/mayafileitem.py @@ -0,0 +1,105 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . +""" +NOTE: Make sure you register this item in the config. +""" + +import os +import logging + +import maya.cmds + +from studiolibrarymaya import baseitem + + +logger = logging.getLogger(__name__) + + +class MayaFileItem(baseitem.BaseItem): + + NAME = "Maya File" + TYPE = NAME + EXTENSION = ".mayafile" + ICON_PATH = os.path.join(os.path.dirname(__file__), "icons", "file.png") + + def transferPath(self): + return self.path() + "/mayafile.ma" + + def loadSchema(self, **kwargs): + """ + Get the schema used for loading the example item. + + :rtype: list[dict] + """ + return [] + + def load(self, **kwargs): + """ + The load method is called with the user values from the load schema. + + :type kwargs: dict + """ + logger.info("Loading %s %s", self.path(), kwargs) + + maya.cmds.file( + self.transferPath(), + i=True, + type="mayaAscii", + options="v=0;", + preserveReferences=True, + mergeNamespacesOnClash=False, + ) + + def saveSchema(self, **kwargs): + """ + Get the schema used for saving the example item. + + :rtype: list[dict] + """ + return [ + # The 'name' field and the 'folder' field are both required by + # the BaseItem. How this is handled may change in the future. + { + "name": "folder", + "type": "path", + "layout": "vertical", + "visible": False, + }, + { + "name": "name", + "type": "string", + "layout": "vertical" + }, + { + "name": "objects", + "type": "objects", + "layout": "vertical" + }, + ] + + def save(self, **kwargs): + """ + The save method is called with the user values from the save schema. + + :type kwargs: dict + """ + logger.info("Saving %s %s", self.path(), kwargs) + + super(MayaFileItem, self).save(**kwargs) + + maya.cmds.file( + self.transferPath(), + type="mayaAscii", + options="v=0;", + preserveReferences=True, + exportSelected=True + ) diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/mayalibrarywindow.py b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/mayalibrarywindow.py new file mode 100644 index 0000000..6abc13a --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/mayalibrarywindow.py @@ -0,0 +1,195 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +import uuid +import logging + +import maya.cmds +from maya.app.general.mayaMixin import MayaQWidgetDockableMixin + +import studiolibrary +from studiolibrary import librarywindow + +import mutils + + +logger = logging.getLogger(__name__) + + +_mayaCloseScriptJob = None + + +def enableMayaClosedEvent(): + """ + Create a Maya script job to trigger on the event "quitApplication". + + Enable the Maya closed event to save the library settings on close + + :rtype: None + """ + global _mayaCloseScriptJob + + if not _mayaCloseScriptJob: + event = ['quitApplication', mayaClosedEvent] + try: + _mayaCloseScriptJob = mutils.ScriptJob(event=event) + logger.debug("Maya close event enabled") + except NameError as error: + logging.exception(error) + + +def disableMayaClosedEvent(): + """Disable the maya closed event.""" + global _mayaCloseScriptJob + + if _mayaCloseScriptJob: + _mayaCloseScriptJob.kill() + _mayaCloseScriptJob = None + logger.debug("Maya close event disabled") + + +def mayaClosedEvent(): + """ + Create a Maya script job to trigger on the event "quitApplication". + + :rtype: None + """ + for libraryWindow in librarywindow.LibraryWindow.instances(): + libraryWindow.saveSettings() + + +class MayaLibraryWindow(MayaQWidgetDockableMixin, librarywindow.LibraryWindow): + + def destroy(self): + """ + Overriding this method to avoid multiple script jobs when developing. + """ + disableMayaClosedEvent() + librarywindow.LibraryWindow.destroy(self) + + def setObjectName(self, name): + """ + Overriding to ensure the widget has a unique name for Maya. + + :type name: str + :rtype: None + """ + name = '{0}_{1}'.format(name, uuid.uuid4()) + + librarywindow.LibraryWindow.setObjectName(self, name) + + def tabWidget(self): + """ + Return the tab widget for the library widget. + + :rtype: QtWidgets.QTabWidget or None + """ + if self.isDockable(): + return self.parent().parent().parent() + else: + return None + + def workspaceControlName(self): + """ + Return the workspaceControl name for the widget. + + :rtype: str or None + """ + if self.isDockable() and self.parent(): + return self.parent().objectName() + else: + return None + + def isDocked(self): + """ + Convenience method to return if the widget is docked. + + :rtype: bool + """ + return not self.isFloating() + + def isFloating(self): + """ + Return True if the widget is a floating window. + + :rtype: bool + """ + name = self.workspaceControlName() + if name: + try: + return maya.cmds.workspaceControl(name, q=True, floating=True) + except AttributeError: + msg = 'The "maya.cmds.workspaceControl" ' \ + 'command is not supported!' + + logger.warning(msg) + + return True + + def window(self): + """ + Overriding this method to return itself when docked. + + This is used for saving the correct window position and size settings. + + :rtype: QWidgets.QWidget + """ + if self.isDocked(): + return self + else: + return librarywindow.LibraryWindow.window(self) + + def show(self, **kwargs): + """ + Show the library widget as a dockable window. + + Set dockable=False in kwargs if you want to show the widget as a floating window. + + :rtype: None + """ + dockable = kwargs.get('dockable', True) + MayaQWidgetDockableMixin.show(self, dockable=dockable) + self.raise_() + self.fixBorder() + + def resizeEvent(self, event): + """ + Override method to remove the border when the window size has changed. + + :type event: QtCore.QEvent + :rtype: None + """ + if event.isAccepted(): + if not self.isLoaded(): + self.fixBorder() + + def floatingChanged(self, isFloating): + """ + Override method to remove the grey border when the parent has changed. + + Only supported/triggered in Maya 2018 + + :rtype: None + """ + self.fixBorder() + + def fixBorder(self): + """ + Remove the grey border around the tab widget. + + :rtype: None + """ + if self.tabWidget(): + self.tabWidget().setStyleSheet("border:0px;") + + +enableMayaClosedEvent() diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/mirroritem.py b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/mirroritem.py new file mode 100644 index 0000000..a563198 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/mirroritem.py @@ -0,0 +1,231 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +import os +import logging + +from studiolibrarymaya import baseitem + +try: + import mutils + import maya.cmds +except ImportError as error: + print(error) + + +logger = logging.getLogger(__name__) + + +def save(path, *args, **kwargs): + """Convenience function for saving a MirrorItem.""" + MirrorItem(path).safeSave(*args, **kwargs) + + +def load(path, *args, **kwargs): + """Convenience function for loading a MirrorItem.""" + MirrorItem(path).load(*args, **kwargs) + + +class MirrorItem(baseitem.BaseItem): + + NAME = "Mirror Table" + EXTENSION = ".mirror" + ICON_PATH = os.path.join(os.path.dirname(__file__), "icons", "mirrortable.png") + TRANSFER_CLASS = mutils.MirrorTable + TRANSFER_BASENAME = "mirrortable.json" + + def __init__(self, *args, **kwargs): + """ + :type args: list + :type kwargs: dict + """ + super(MirrorItem, self).__init__(*args, **kwargs) + + self._validatedObjects = [] + + def loadSchema(self): + """ + Get schema used to load the mirror table item. + + :rtype: list[dict] + """ + schema = super(MirrorItem, self).loadSchema() + + mt = self.transferObject() + + schema.insert(2, {"name": "Left", "value": mt.leftSide()}) + schema.insert(3, {"name": "Right", "value": mt.rightSide()}) + + schema.extend([ + { + "name": "optionsGroup", + "title": "Options", + "type": "group", + "order": 2, + }, + { + "name": "keysOption", + "title": "Keys", + "type": "radio", + "value": "Selected Range", + "items": ["All Keys", "Selected Range"], + "persistent": True, + }, + { + "name": "option", + "type": "enum", + "default": "swap", + "items": ["swap", "left to right", "right to left"], + "persistent": True + }, + ]) + + return schema + + def load(self, **kwargs): + """ + Load the current mirror table to the given objects. + + :type kwargs: dict + """ + mt = mutils.MirrorTable.fromPath(self.path() + "/mirrortable.json") + mt.load( + objects=kwargs.get("objects"), + namespaces=kwargs.get("namespaces"), + option=kwargs.get("option"), + keysOption=kwargs.get("keysOption"), + time=kwargs.get("time") + ) + + def saveSchema(self): + """ + Get the fields used to save the item. + + :rtype: list[dict] + """ + return [ + { + "name": "folder", + "type": "path", + "layout": "vertical", + "visible": False, + }, + { + "name": "name", + "type": "string", + "layout": "vertical" + }, + { + "name": "mirrorPlane", + "type": "buttonGroup", + "default": "YZ", + "layout": "vertical", + "items": ["YZ", "XY", "XZ"], + }, + { + "name": "leftSide", + "type": "string", + "layout": "vertical", + "menu": { + "name": "0" + } + }, + { + "name": "rightSide", + "type": "string", + "layout": "vertical", + "menu": { + "name": "0" + } + }, + { + "name": "comment", + "type": "text", + "layout": "vertical" + }, + { + "name": "objects", + "type": "objects", + "label": { + "visible": False + } + }, + ] + + def saveValidator(self, **kwargs): + """ + The save validator is called when an input field has changed. + + :type kwargs: dict + :rtype: list[dict] + """ + results = super(MirrorItem, self).saveValidator(**kwargs) + + objects = maya.cmds.ls(selection=True) or [] + + dirty = kwargs.get("fieldChanged") in ["leftSide", "rightSide"] + dirty = dirty or self._validatedObjects != objects + + if dirty: + self._validatedObjects = objects + + leftSide = kwargs.get("leftSide", "") + if not leftSide: + leftSide = mutils.MirrorTable.findLeftSide(objects) + + rightSide = kwargs.get("rightSide", "") + if not rightSide: + rightSide = mutils.MirrorTable.findRightSide(objects) + + mt = mutils.MirrorTable.fromObjects( + [], + leftSide=leftSide, + rightSide=rightSide + ) + + results.extend([ + { + "name": "leftSide", + "value": leftSide, + "menu": { + "name": str(mt.leftCount(objects)) + } + }, + { + "name": "rightSide", + "value": rightSide, + "menu": { + "name": str(mt.rightCount(objects)) + } + }, + ]) + + return results + + def save(self, objects, **kwargs): + """ + Save the given objects to the item path on disc. + + :type objects: list[str] + :type kwargs: dict + """ + super(MirrorItem, self).save(**kwargs) + + # Save the mirror table to the given location + mutils.saveMirrorTable( + self.path() + "/mirrortable.json", + objects, + metadata={"description": kwargs.get("comment", "")}, + leftSide=kwargs.get("leftSide"), + rightSide=kwargs.get("rightSide"), + mirrorPlane=kwargs.get("mirrorPlane"), + ) diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/poseitem.py b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/poseitem.py new file mode 100644 index 0000000..39050f8 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/poseitem.py @@ -0,0 +1,392 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +import os +import logging + +import studiolibrary + +from studiovendor.Qt import QtGui +from studiovendor.Qt import QtCore +from studiovendor.Qt import QtWidgets + +from studiolibrarymaya import baseitem +from studiolibrarymaya import baseloadwidget + +try: + import mutils + import maya.cmds +except ImportError as error: + print(error) + + +logger = logging.getLogger(__name__) + + +def save(path, *args, **kwargs): + """Convenience function for saving a PoseItem.""" + PoseItem(path).safeSave(*args, **kwargs) + + +def load(path, *args, **kwargs): + """Convenience function for loading a PoseItem.""" + PoseItem(path).load(*args, **kwargs) + + +class PoseLoadWidget(baseloadwidget.BaseLoadWidget): + + @classmethod + def createFromPath(cls, path, theme=None): + + item = PoseItem(path) + widget = cls(item) + + if not theme: + import studiolibrary.widgets + theme = studiolibrary.widgets.Theme() + widget.setStyleSheet(theme.styleSheet()) + + widget.show() + + def __init__(self, *args, **kwargs): + super(PoseLoadWidget, self).__init__(*args, **kwargs) + + self._options = None + self._pose = mutils.Pose.fromPath(self.item().transferPath()) + + self.ui.blendFrame = QtWidgets.QFrame(self) + + layout = QtWidgets.QHBoxLayout() + self.ui.blendFrame.setLayout(layout) + + if self.item().libraryWindow(): + self.item().libraryWindow().itemsWidget().itemSliderMoved.connect(self._sliderMoved) + self.item().libraryWindow().itemsWidget().itemSliderReleased.connect(self._sliderReleased) + self.item().libraryWindow().itemsWidget().itemDoubleClicked.connect(self._itemDoubleClicked) + + self.ui.blendSlider = QtWidgets.QSlider(self) + self.ui.blendSlider.setObjectName("blendSlider") + self.ui.blendSlider.setMinimum(-30) + self.ui.blendSlider.setMaximum(130) + self.ui.blendSlider.setOrientation(QtCore.Qt.Horizontal) + self.ui.blendSlider.sliderMoved.connect(self._sliderMoved) + self.ui.blendSlider.sliderReleased.connect(self._sliderReleased) + + self.ui.blendEdit = QtWidgets.QLineEdit(self) + self.ui.blendEdit.setObjectName("blendEdit") + self.ui.blendEdit.setText("0") + self.ui.blendEdit.editingFinished.connect(self._blendEditChanged) + + validator = QtGui.QIntValidator(-200, 200, self) + self.ui.blendEdit.setValidator(validator) + + layout.addWidget(self.ui.blendSlider) + layout.addWidget(self.ui.blendEdit) + + self.setCustomWidget(self.ui.blendFrame) + + def _itemDoubleClicked(self): + """Triggered when the user double-clicks a pose.""" + self.accept() + + def _sliderMoved(self, value): + """Triggered when the user moves the slider handle.""" + self.load(blend=value, batchMode=True) + + def _sliderReleased(self): + """Triggered when the user releases the slider handle.""" + try: + self.load(blend=self.ui.blendSlider.value(), refresh=False) + self._options = {} + except Exception as error: + self.item().showErrorDialog("Item Error", str(error)) + raise + + def _blendEditChanged(self, *args): + """Triggered when the user changes the blend edit value.""" + try: + self._options = {} + self.load(blend=int(self.ui.blendEdit.text()), clearSelection=False) + except Exception as error: + self.item().showErrorDialog("Item Error", str(error)) + raise + + def loadValidator(self, *args, **kwargs): + self._options = {} + return super(PoseLoadWidget, self).loadValidator(*args, **kwargs) + + def accept(self): + """Triggered when the user clicks the apply button.""" + try: + self._options = {} + self.load(clearCache=True, clearSelection=False) + except Exception as error: + self.item().showErrorDialog("Item Error", str(error)) + raise + + def load( + self, + blend=100.0, + refresh=True, + batchMode=False, + clearCache=False, + clearSelection=True, + ): + """ + Load the pose item with the current user settings from disc. + + :type blend: float + :type refresh: bool + :type batchMode: bool + :type clearCache: bool + :type clearSelection: bool + """ + if batchMode: + self.formWidget().setValidatorEnabled(False) + else: + self.formWidget().setValidatorEnabled(True) + + if not self._options: + + self._options = self.formWidget().values() + self._options['mirrorTable'] = self.item().mirrorTable() + self._options['objects'] = maya.cmds.ls(selection=True) or [] + + if not self._options["searchAndReplaceEnabled"]: + self._options["searchAndReplace"] = None + + del self._options["namespaceOption"] + del self._options["searchAndReplaceEnabled"] + + self.ui.blendEdit.blockSignals(True) + self.ui.blendSlider.setValue(blend) + self.ui.blendEdit.setText(str(int(blend))) + self.ui.blendEdit.blockSignals(False) + + if self.item().libraryWindow(): + + self.item().libraryWindow().itemsWidget().blockSignals(True) + self.item().setSliderValue(blend) + self.item().libraryWindow().itemsWidget().blockSignals(False) + + if batchMode: + self.item().libraryWindow().showToastMessage("Blend: {0}%".format(blend)) + + try: + self._pose.load( + blend=blend, + refresh=refresh, + batchMode=batchMode, + clearCache=clearCache, + clearSelection=clearSelection, + **self._options + ) + finally: + self.item().setSliderDown(batchMode) + + +def findMirrorTable(path): + """ + Get the mirror table object for this item. + + :rtype: mutils.MirrorTable or None + """ + mirrorTable = None + + mirrorTablePaths = list(studiolibrary.walkup( + path, + match=lambda path: path.endswith(".mirror"), + depth=10, + ) + ) + + if mirrorTablePaths: + mirrorTablePath = mirrorTablePaths[0] + + path = os.path.join(mirrorTablePath, "mirrortable.json") + + if path: + mirrorTable = mutils.MirrorTable.fromPath(path) + + return mirrorTable + + +class PoseItem(baseitem.BaseItem): + + NAME = "Pose" + EXTENSION = ".pose" + ICON_PATH = os.path.join(os.path.dirname(__file__), "icons", "pose.png") + LOAD_WIDGET_CLASS = PoseLoadWidget + TRANSFER_CLASS = mutils.Pose + TRANSFER_BASENAME = "pose.json" + + def __init__(self, *args, **kwargs): + """ + Create a new instance of the pose item from the given path. + + :type path: str + :type args: list + :type kwargs: dict + """ + super(PoseItem, self).__init__(*args, **kwargs) + + self.setSliderEnabled(True) + + def mirrorTableSearchAndReplace(self): + """ + Get the values for search and replace from the mirror table. + + :rtype: (str, str) + """ + mirrorTable = findMirrorTable(self.path()) + + return mirrorTable.leftSide(), mirrorTable.rightSide() + + def switchSearchAndReplace(self): + """ + Switch the values of the search and replace field. + + :rtype: (str, str) + """ + values = self.currentLoadValue("searchAndReplace") + return values[1], values[0] + + def clearSearchAndReplace(self): + """ + Clear the search and replace field. + + :rtype: (str, str) + """ + return '', '' + + def doubleClicked(self): + """Triggered when the user double-click the item.""" + pass + + def loadSchema(self): + """ + Get schema used to load the pose item. + + :rtype: list[dict] + """ + schema = [ + { + "name": "optionsGroup", + "title": "Options", + "type": "group", + "order": 2, + }, + { + "name": "key", + "type": "bool", + "inline": True, + "default": False, + "persistent": True, + }, + { + "name": "mirror", + "type": "bool", + "inline": True, + "default": False, + "persistent": True, + }, + { + "name": "additive", + "type": "bool", + "inline": True, + "default": False, + "persistent": True, + }, + { + "name": "searchAndReplaceEnabled", + "title": "Search and Replace", + "type": "bool", + "inline": True, + "default": False, + "persistent": True, + }, + { + "name": "searchAndReplace", + "title": "", + "type": "stringDouble", + "default": ("", ""), + "placeholder": ("search", "replace"), + "persistent": True, + "actions": [ + { + "name": "Switch", + "callback": self.switchSearchAndReplace, + }, + { + "name": "Clear", + "callback": self.clearSearchAndReplace, + }, + { + "name": "From Mirror Table", + "enabled": bool(findMirrorTable(self.path())), + "callback": self.mirrorTableSearchAndReplace, + }, + ] + }, + ] + + schema.extend(super(PoseItem, self).loadSchema()) + + return schema + + def mirrorTable(self): + return findMirrorTable(self.path()) + + def loadValidator(self, **values): + """ + Using the validator to change the state of the mirror option. + + :type values: dict + :rtype: list[dict] + """ + # Mirror check box + mirrorTip = "Cannot find a mirror table!" + mirrorTable = findMirrorTable(self.path()) + if mirrorTable: + mirrorTip = "Using mirror table: %s" % mirrorTable.path() + + fields = [ + { + "name": "mirror", + "toolTip": mirrorTip, + "enabled": mirrorTable is not None, + }, + { + "name": "searchAndReplace", + "visible": values.get("searchAndReplaceEnabled") + }, + ] + + fields.extend(super(PoseItem, self).loadValidator(**values)) + + return fields + + def save(self, objects, **kwargs): + """ + Save all the given object data to the item path on disc. + + :type objects: list[str] + :type kwargs: dict + """ + super(PoseItem, self).save(**kwargs) + + # Save the pose to the temp location + mutils.savePose( + self.transferPath(), + objects, + metadata={"description": kwargs.get("comment", "")} + ) diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/setsitem.py b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/setsitem.py new file mode 100644 index 0000000..b84ba01 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/setsitem.py @@ -0,0 +1,65 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +import os + +try: + import mutils +except ImportError as error: + print(error) + +from studiolibrarymaya import baseitem + + +def save(path, *args, **kwargs): + """Convenience function for saving a SetsItem.""" + SetsItem(path).safeSave(*args, **kwargs) + + +def load(path, *args, **kwargs): + """Convenience function for loading a SetsItem.""" + SetsItem(path).load(*args, **kwargs) + + +class SetsItem(baseitem.BaseItem): + + NAME = "Selection Set" + EXTENSION = ".set" + ICON_PATH = os.path.join(os.path.dirname(__file__), "icons", "selectionSet.png") + TRANSFER_CLASS = mutils.SelectionSet + TRANSFER_BASENAME = "set.json" + + def loadFromCurrentValues(self): + """Load the selection set using the settings for this item.""" + self.load(namespaces=self.namespaces()) + + def load(self, namespaces=None): + """ + :type namespaces: list[str] | None + """ + self.selectContent(namespaces=namespaces) + + def save(self, objects, **kwargs): + """ + Save all the given object data to the item path on disc. + + :type objects: list[str] + :type kwargs: dict + """ + super(SetsItem, self).save(**kwargs) + + # Save the selection set to the given path + mutils.saveSelectionSet( + self.path() + "/set.json", + objects, + metadata={"description": kwargs.get("comment", "")} + ) diff --git a/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/setsmenu.py b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/setsmenu.py new file mode 100644 index 0000000..79a5420 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiolibrarymaya/setsmenu.py @@ -0,0 +1,167 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +import os +import logging +from functools import partial + +from studiovendor.Qt import QtGui +from studiovendor.Qt import QtWidgets + +import studiolibrary + +from studiolibrarymaya import setsitem + + +logger = logging.getLogger(__name__) + + +DIRNAME = os.path.dirname(__file__) +ARROW_ICON_PATH = os.path.join(DIRNAME, "icons", "arrow.png") + + +def selectContentAction(item, parent=None): + """ + :param item: mayabaseitem.MayaBaseItem + :param parent: QtWidgets.QMenu + """ + arrowIcon = QtGui.QIcon(ARROW_ICON_PATH) + action = QtWidgets.QAction(arrowIcon, "Select content", parent) + action.triggered.connect(item.selectContent) + return action + + +def showSetsMenu(path, **kwargs): + """ + Show the frame range menu at the current cursor position. + + :type path: str + :rtype: QtWidgets.QAction + """ + menu = SetsMenu.fromPath(path, **kwargs) + position = QtGui.QCursor().pos() + action = menu.exec_(position) + return action + + +class SetsMenu(QtWidgets.QMenu): + + @classmethod + def fromPath(cls, path, parent=None, libraryWindow=None, **kwargs): + """ + Return a new SetMenu instance from the given path. + + :type path: str + :type parent: QtWidgets.QMenu or None + :type libraryWindow: studiolibrary.LibraryWindow or None + :type kwargs: dict + :rtype: QtWidgets.QAction + """ + item = setsitem.SetsItem(path, libraryWindow=libraryWindow) + return cls(item, parent, enableSelectContent=False, **kwargs) + + def __init__( + self, + item, + parent=None, + namespaces=None, + enableSelectContent=True, + ): + """ + :type item: studiolibrarymaya.BaseItem + :type parent: QtWidgets.QMenu or None + :type namespaces: list[str] or None + :type enableSelectContent: bool + """ + parent = parent or item.libraryWindow() + QtWidgets.QMenu.__init__(self, "Selection Sets", parent) + + icon = QtGui.QIcon(setsitem.SetsItem.ICON_PATH) + self.setIcon(icon) + + self._item = item + self._namespaces = namespaces + self._enableSelectContent = enableSelectContent + self.reload() + + def item(self): + """ + :rtype: mayabaseitem.MayaBaseItem + """ + return self._item + + def namespaces(self): + """ + :rtype: list[str] + """ + return self._namespaces + + def selectContent(self): + """ + :rtype: None + """ + self.item().selectContent(namespaces=self.namespaces()) + + def selectionSets(self): + """ + :rtype: list[setsitem.SetsItem] + """ + path = self.item().path() + + paths = studiolibrary.walkup( + path, + match=lambda path: path.endswith(".set"), + depth=10, + ) + + items = [] + paths = list(paths) + libraryWindow = self.item().libraryWindow() + + for path in paths: + item = setsitem.SetsItem(path) + item.setLibraryWindow(libraryWindow) + items.append(item) + + return items + + def reload(self): + """ + :rtype: None + """ + self.clear() + + if self._enableSelectContent: + action = selectContentAction(item=self.item(), parent=self) + self.addAction(action) + self.addSeparator() + + selectionSets = self.selectionSets() + + if selectionSets: + for selectionSet in selectionSets: + + dirname = os.path.basename(os.path.dirname(selectionSet.path())) + + basename = os.path.basename(selectionSet.path()) + basename = basename.replace(selectionSet.EXTENSION, "") + + nicename = dirname + ": " + basename + + action = QtWidgets.QAction(nicename, self) + callback = partial(selectionSet.load, namespaces=self.namespaces()) + action.triggered.connect(callback) + self.addAction(action) + else: + action = QtWidgets.QAction("No selection sets found!", self) + action.setEnabled(False) + self.addAction(action) diff --git a/2023/scripts/animation_tools/studiolibrary/studioqt/__init__.py b/2023/scripts/animation_tools/studiolibrary/studioqt/__init__.py new file mode 100644 index 0000000..9465a48 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studioqt/__init__.py @@ -0,0 +1,21 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +from studioqt.utils import * +from studioqt.icon import Icon +from studioqt.menu import Menu +from studioqt.color import Color +from studioqt.pixmap import Pixmap +from studioqt.stylesheet import StyleSheet +from studioqt.decorators import showWaitCursor +from studioqt.decorators import showArrowCursor +from studioqt.imagesequence import ImageSequence diff --git a/2023/scripts/animation_tools/studiolibrary/studioqt/color.py b/2023/scripts/animation_tools/studiolibrary/studioqt/color.py new file mode 100644 index 0000000..5a2a920 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studioqt/color.py @@ -0,0 +1,78 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +from studiovendor.Qt import QtGui + + +COLORS = [ + {"name": "red", "color": "rgb(255, 115, 100)"}, + {"name": "orange", "color": "rgb(255, 150, 100)"}, + {"name": "yellow", "color": "rgb(255, 210, 103)"}, + {"name": "green", "color": "rgb(140, 220, 140)"}, + {"name": "blue", "color": "rgb(110, 175, 255)"}, + {"name": "purple", "color": "rgb(160, 120, 255)"}, + {"name": "pink", "color": "rgb(230, 130, 180)"}, + {"name": "grey", "color": "rgb(125, 125, 140)"}, +] + +COLORS_INDEXED = {c["name"]: c for c in COLORS} + + +class Color(QtGui.QColor): + + @classmethod + def fromColor(cls, color): + """ + :type color: QtGui.QColor + """ + color = ('rgba(%d, %d, %d, %d)' % color.getRgb()) + return cls.fromString(color) + + @classmethod + def fromString(cls, c): + """ + :type c: str + """ + a = 255 + + c = c.replace(";", "") + if not c.startswith("rgb"): + c = COLORS_INDEXED.get(c) + if c: + c = c.get("color") + else: + return cls(0, 0, 0, 255) + + try: + r, g, b, a = c.replace("rgb(", "").replace("rgba(", "").replace(")", "").split(",") + except ValueError: + r, g, b = c.replace("rgb(", "").replace(")", "").split(",") + + return cls(int(r), int(g), int(b), int(a)) + + def __eq__(self, other): + if isinstance(other, Color): + return self.toString() == other.toString() + else: + return QtGui.QColor.__eq__(self, other) + + def toString(self): + """ + :type: str + """ + return 'rgba(%d, %d, %d, %d)' % self.getRgb() + + def isDark(self): + """ + :type: bool + """ + return self.red() < 125 and self.green() < 125 and self.blue() < 125 diff --git a/2023/scripts/animation_tools/studiolibrary/studioqt/decorators.py b/2023/scripts/animation_tools/studiolibrary/studioqt/decorators.py new file mode 100644 index 0000000..ed9c4eb --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studioqt/decorators.py @@ -0,0 +1,47 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +from studiovendor.Qt import QtGui +from studiovendor.Qt import QtCore +from studiovendor.Qt import QtWidgets + + +def showWaitCursor(fn): + + def wrapped(*args, **kwargs): + cursor = QtGui.QCursor(QtCore.Qt.WaitCursor) + QtWidgets.QApplication.setOverrideCursor(cursor) + try: + return fn(*args, **kwargs) + finally: + QtWidgets.QApplication.restoreOverrideCursor() + + wrapped.__name__ = fn.__name__ + wrapped.__doc__ = fn.__doc__ + + return wrapped + + +def showArrowCursor(fn): + + def wrapped(*args, **kwargs): + cursor = QtGui.QCursor(QtCore.Qt.ArrowCursor) + QtWidgets.QApplication.setOverrideCursor(cursor) + try: + return fn(*args, **kwargs) + finally: + QtWidgets.QApplication.restoreOverrideCursor() + + wrapped.__name__ = fn.__name__ + wrapped.__doc__ = fn.__doc__ + + return wrapped diff --git a/2023/scripts/animation_tools/studiolibrary/studioqt/icon.py b/2023/scripts/animation_tools/studiolibrary/studioqt/icon.py new file mode 100644 index 0000000..a6b59dc --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studioqt/icon.py @@ -0,0 +1,185 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +import copy + +from studiovendor.Qt import QtGui +from studiovendor.Qt import QtCore + +import studioqt + + +class Icon(QtGui.QIcon): + + @classmethod + def fa(cls, path, **kwargs): + """ + Create a new icon with the given path, options and state. + + Example: + icon = studioqt.Icon.fa( + path, + color="rgb(255,255,255)" + color_disabled="rgba(0,200,200,20)", + ) + + :type path: str + :type kwargs: dict + + :rtype: studioqt.Icon + """ + color = kwargs.get('color', QtGui.QColor(0, 0, 0)) + + pixmap = studioqt.Pixmap(path) + pixmap.setColor(color) + + valid_options = [ + 'active', + 'selected', + 'disabled', + 'on', + 'off', + 'on_active', + 'on_selected', + 'on_disabled', + 'off_active', + 'off_selected', + 'off_disabled', + 'color', + 'color_on', + 'color_off', + 'color_active', + 'color_selected', + 'color_disabled', + 'color_on_selected', + 'color_on_active', + 'color_on_disabled', + 'color_off_selected', + 'color_off_active', + 'color_off_disabled', + ] + + default = { + "on_active": kwargs.get("active", studioqt.Pixmap(path)), + "off_active": kwargs.get("active", studioqt.Pixmap(path)), + "on_disabled": kwargs.get("disabled", studioqt.Pixmap(path)), + "off_disabled": kwargs.get("disabled", studioqt.Pixmap(path)), + "on_selected": kwargs.get("selected", studioqt.Pixmap(path)), + "off_selected": kwargs.get("selected", studioqt.Pixmap(path)), + "color_on_active": kwargs.get("color_active", color), + "color_off_active": kwargs.get("color_active", color), + "color_on_disabled": kwargs.get("color_disabled", color), + "color_off_disabled": kwargs.get("color_disabled", color), + "color_on_selected": kwargs.get("color_selected", color), + "color_off_selected": kwargs.get("color_selected", color), + } + + default.update(kwargs) + kwargs = copy.copy(default) + + for option in valid_options: + if 'color' in option: + kwargs[option] = kwargs.get(option, color) + else: + svg_path = kwargs.get(option, path) + kwargs[option] = studioqt.Pixmap(svg_path) + + options = { + QtGui.QIcon.On: { + QtGui.QIcon.Normal: (kwargs['color_on'], kwargs['on']), + QtGui.QIcon.Active: (kwargs['color_on_active'], kwargs['on_active']), + QtGui.QIcon.Disabled: (kwargs['color_on_disabled'], kwargs['on_disabled']), + QtGui.QIcon.Selected: (kwargs['color_on_selected'], kwargs['on_selected']) + }, + + QtGui.QIcon.Off: { + QtGui.QIcon.Normal: (kwargs['color_off'], kwargs['off']), + QtGui.QIcon.Active: (kwargs['color_off_active'], kwargs['off_active']), + QtGui.QIcon.Disabled: (kwargs['color_off_disabled'], kwargs['off_disabled']), + QtGui.QIcon.Selected: (kwargs['color_off_selected'], kwargs['off_selected']) + } + } + + icon = cls(pixmap) + + for state in options: + for mode in options[state]: + color, pixmap = options[state][mode] + + pixmap = studioqt.Pixmap(pixmap) + pixmap.setColor(color) + + icon.addPixmap(pixmap, mode, state) + + return icon + + def setColor(self, color, size=None): + """ + :type color: QtGui.QColor + :rtype: None + """ + icon = self + size = size or icon.actualSize(QtCore.QSize(256, 256)) + pixmap = icon.pixmap(size) + + if not self.isNull(): + painter = QtGui.QPainter(pixmap) + painter.setCompositionMode(QtGui.QPainter.CompositionMode_SourceIn) + painter.setBrush(color) + painter.setPen(color) + painter.drawRect(pixmap.rect()) + painter.end() + + icon = QtGui.QIcon(pixmap) + self.swap(icon) + + if self._badgeEnabled: + self.updateBadge() + + def __init__(self, *args, **kwargs): + super(Icon, self).__init__(*args, **kwargs) + + self._badgeColor = None + self._badgeEnabled = False + + def badgeColor(self): + return self._badgeColor + + def setBadgeColor(self, color): + self._badgeColor = color + + def badgeEnabled(self): + return self._badgeEnabled + + def setBadgeEnabled(self, enabled): + self._badgeEnabled = enabled + + def updateBadge(self): + """ + """ + color = self.badgeColor() or QtGui.QColor(240, 240, 100) + size = self.actualSize(QtCore.QSize(256, 256)) + + pixmap = self.pixmap(size) + painter = QtGui.QPainter(pixmap) + + pen = QtGui.QPen(color) + pen.setWidth(0) + painter.setPen(pen) + + painter.setBrush(color) + painter.setRenderHint(QtGui.QPainter.Antialiasing) + painter.drawEllipse(0, 0, size.height()/3.0, size.width()/3.0) + painter.end() + + icon = QtGui.QIcon(pixmap) + self.swap(icon) diff --git a/2023/scripts/animation_tools/studiolibrary/studioqt/imagesequence.py b/2023/scripts/animation_tools/studiolibrary/studioqt/imagesequence.py new file mode 100644 index 0000000..67eaa03 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studioqt/imagesequence.py @@ -0,0 +1,230 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +import re +import os + +from studiovendor.Qt import QtGui +from studiovendor.Qt import QtCore + + +__all__ = ['ImageSequence', 'ImageSequenceWidget'] + + +class ImageSequence(QtCore.QObject): + + DEFAULT_FPS = 24 + + frameChanged = QtCore.Signal(int) + + def __init__(self, path, *args): + QtCore.QObject.__init__(self, *args) + + self._timer = None + self._frame = 0 + self._frames = [] + self._dirname = None + self._paused = False + + if path: + self.setPath(path) + + def firstFrame(self): + """ + Get the path to the first frame. + + :rtype: str + """ + if self._frames: + return self._frames[0] + return "" + + def setPath(self, path): + """ + Set a single frame or a directory to an image sequence. + + :type path: str + """ + if os.path.isfile(path): + self._frame = 0 + self._frames = [path] + elif os.path.isdir(path): + self.setDirname(path) + + def setDirname(self, dirname): + """ + Set the location to the image sequence. + + :type dirname: str + :rtype: None + """ + def naturalSortItems(items): + """ + Sort the given list in the way that humans expect. + """ + convert = lambda text: int(text) if text.isdigit() else text + alphanum_key = lambda key: [convert(c) for c in re.split('([0-9]+)', key)] + items.sort(key=alphanum_key) + + self._dirname = dirname + if os.path.isdir(dirname): + self._frames = [dirname + "/" + filename for filename in os.listdir(dirname)] + naturalSortItems(self._frames) + + def dirname(self): + """ + Return the location to the image sequence. + + :rtype: str + """ + return self._dirname + + def reset(self): + """ + Stop and reset the current frame to 0. + + :rtype: None + """ + if not self._timer: + self._timer = QtCore.QTimer(self.parent()) + self._timer.setSingleShot(False) + self._timer.timeout.connect(self._frameChanged) + + if not self._paused: + self._frame = 0 + self._timer.stop() + + def pause(self): + """ + ImageSequence will enter Paused state. + + :rtype: None + """ + self._paused = True + self._timer.stop() + + def resume(self): + """ + ImageSequence will enter Playing state. + + :rtype: None + """ + if self._paused: + self._paused = False + self._timer.start() + + def stop(self): + """ + Stops the movie. ImageSequence enters NotRunning state. + + :rtype: None + """ + self._timer.stop() + + def start(self): + """ + Starts the movie. ImageSequence will enter Running state + + :rtype: None + """ + self.reset() + if self._timer: + import studiolibrary + fps = studiolibrary.config.get("playbackFrameRate", self.DEFAULT_FPS) + self._timer.start(1000.0 / fps) + + def frames(self): + """ + Return all the filenames in the image sequence. + + :rtype: list[str] + """ + return self._frames + + def _frameChanged(self): + """ + Triggered when the current frame changes. + + :rtype: None + """ + if not self._frames: + return + + frame = self._frame + frame += 1 + self.jumpToFrame(frame) + + def percent(self): + """ + Return the current frame position as a percentage. + + :rtype: None + """ + if len(self._frames) == self._frame + 1: + _percent = 1 + else: + _percent = float((len(self._frames) + self._frame)) / len(self._frames) - 1 + return _percent + + def frameCount(self): + """ + Return the number of frames. + + :rtype: int + """ + return len(self._frames) + + def currentIcon(self): + """ + Returns the current frame as a QIcon. + + :rtype: QtGui.QIcon + """ + return QtGui.QIcon(self.currentFilename()) + + def currentPixmap(self): + """ + Return the current frame as a QPixmap. + + :rtype: QtGui.QPixmap + """ + return QtGui.QPixmap(self.currentFilename()) + + def currentFilename(self): + """ + Return the current file name. + + :rtype: str or None + """ + try: + return self._frames[self.currentFrameNumber()] + except IndexError: + pass + + def currentFrameNumber(self): + """ + Return the current frame. + + :rtype: int or None + """ + return self._frame + + def jumpToFrame(self, frame): + """ + Set the current frame. + + :rtype: int or None + """ + if frame >= self.frameCount(): + frame = 0 + self._frame = frame + self.frameChanged.emit(frame) diff --git a/2023/scripts/animation_tools/studiolibrary/studioqt/menu.py b/2023/scripts/animation_tools/studiolibrary/studioqt/menu.py new file mode 100644 index 0000000..e7e3e0c --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studioqt/menu.py @@ -0,0 +1,81 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +from studiovendor import six +from studiovendor.Qt import QtWidgets + + +class Menu(QtWidgets.QMenu): + + def __init__(self, *args): + QtWidgets.QMenu.__init__(self, *args) + + def findAction(self, text): + """ + Return the action that contains the given text. + + :type text: str + + :rtype: QtWidgets.QAction + """ + for child in self.children(): + + action = None + + if isinstance(child, QtWidgets.QMenu): + action = child.menuAction() + elif isinstance(child, QtWidgets.QAction): + action = child + + if action and action.text().lower() == text.lower(): + return action + + def insertAction(self, before, *args): + """ + Add support for finding the before action by the given string. + + :type before: str or QtWidget.QAction + :type args: list + + :rtype: QtWidgets.QAction + """ + if isinstance(before, six.string_types): + before = self.findAction(before) + + return QtWidgets.QMenu.insertAction(self, before, *args) + + def insertMenu(self, before, menu): + """ + Add support for finding the before action by the given string. + + :type before: str or QtWidget.QAction + :type menu: QtWidgets.QMenu + + :rtype: QtWidgets.QAction + """ + if isinstance(before, six.string_types): + before = self.findAction(before) + + QtWidgets.QMenu.insertMenu(self, before, menu) + + def insertSeparator(self, before): + """ + Add support for finding the before action by the given string. + + :type before: str or QtWidget.QAction + + :rtype: QtWidgets.QAction + """ + if isinstance(before, six.string_types): + before = self.findAction(before) + + return QtWidgets.QMenu.insertSeparator(self, before) diff --git a/2023/scripts/animation_tools/studiolibrary/studioqt/pixmap.py b/2023/scripts/animation_tools/studiolibrary/studioqt/pixmap.py new file mode 100644 index 0000000..c897939 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studioqt/pixmap.py @@ -0,0 +1,40 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +from studiovendor import six +from studiovendor.Qt import QtGui + +import studioqt + + +class Pixmap(QtGui.QPixmap): + + def __init__(self, *args): + QtGui.QPixmap.__init__(self, *args) + + self._color = None + + def setColor(self, color): + """ + :type color: QtGui.QColor + :rtype: None + """ + if isinstance(color, six.string_types): + color = studioqt.Color.fromString(color) + + if not self.isNull(): + painter = QtGui.QPainter(self) + painter.setCompositionMode(QtGui.QPainter.CompositionMode_SourceIn) + painter.setBrush(color) + painter.setPen(color) + painter.drawRect(self.rect()) + painter.end() diff --git a/2023/scripts/animation_tools/studiolibrary/studioqt/stylesheet.py b/2023/scripts/animation_tools/studiolibrary/studioqt/stylesheet.py new file mode 100644 index 0000000..b0a2eb4 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studioqt/stylesheet.py @@ -0,0 +1,102 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +import os +import re + +import studioqt + + +class StyleSheet(object): + + @classmethod + def fromPath(cls, path, **kwargs): + """ + :type path: str + :rtype: str + """ + styleSheet = cls() + data = styleSheet.read(path) + data = StyleSheet.format(data, **kwargs) + styleSheet.setData(data) + return styleSheet + + @classmethod + def fromText(cls, text, options=None): + """ + :type text: str + :rtype: str + """ + styleSheet = cls() + data = StyleSheet.format(text, options=options) + styleSheet.setData(data) + return styleSheet + + def __init__(self): + self._data = "" + + def setData(self, data): + """ + :type data: str + """ + self._data = data + + def data(self): + """ + :rtype: str + """ + return self._data + + @staticmethod + def read(path): + """ + :type path: str + :rtype: str + """ + data = "" + + if os.path.isfile(path): + with open(path, "r") as f: + data = f.read() + + return data + + @staticmethod + def format(data=None, options=None, dpi=1): + """ + :type data: + :type options: dict + :rtype: str + """ + if options is not None: + keys = list(options.keys()) + keys.sort(key=len, reverse=True) + for key in keys: + data = data.replace(key, options[key]) + + reDpi = re.compile("[0-9]+px") + newData = [] + + for line in data.split("\n"): + dpi_ = reDpi.search(line) + + if dpi_: + new = dpi_.group().replace("px", "") + val = int(new) + if val > 0: + val = int(val * dpi) + line = line.replace(dpi_.group(), str(val) + "px") + + newData.append(line) + + data = "\n".join(newData) + return data diff --git a/2023/scripts/animation_tools/studiolibrary/studioqt/utils.py b/2023/scripts/animation_tools/studiolibrary/studioqt/utils.py new file mode 100644 index 0000000..57169d6 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studioqt/utils.py @@ -0,0 +1,230 @@ +# Copyright 2020 by Kurt Rathjen. All Rights Reserved. +# +# This library is free software: you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. This library is distributed in the +# hope that it will be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . + +import os +import sys +import inspect +import logging +import contextlib + +from studiovendor.Qt import QtGui +from studiovendor.Qt import QtCore +from studiovendor.Qt import QtCompat +from studiovendor.Qt import QtWidgets + +import studioqt + + +__all__ = [ + "app", + "fadeIn", + "fadeOut", + "loadUi", + "installFonts", + "isAltModifier", + "isShiftModifier", + "isControlModifier", +] + +logger = logging.getLogger(__name__) + + +@contextlib.contextmanager +def app(): + """ + + .. code-block:: python + import studioqt + + with studioqt.app(): + widget = QWidget(None) + widget.show() + + :rtype: None + """ + app_ = None + + isAppRunning = bool(QtWidgets.QApplication.instance()) + if not isAppRunning: + app_ = QtWidgets.QApplication(sys.argv) + + yield None + + if not isAppRunning: + sys.exit(app_.exec_()) + + +def uiPath(cls): + """ + Return the ui path for the given widget class. + + :type cls: type + :rtype: str + """ + name = cls.__name__ + path = inspect.getfile(cls) + dirname = os.path.dirname(path) + + path = dirname + "/resource/ui/" + name + ".ui" + + if not os.path.exists(path): + path = dirname + "/ui/" + name + ".ui" + + if not os.path.exists(path): + path = dirname + "/" + name + ".ui" + + return path + + +def loadUi(widget, path=None, cls=None): + """ + .. code-block:: python + import studioqt + + class Widget(QtWidgets.QWidget): + def __init__(self) + super(Widget, self).__init__() + studioqt.loadUi(self) + + with studioqt.app(): + widget = Widget() + widget.show() + + :type widget: QWidget or QDialog + :type path: str + :type cls: object + :rtype: None + """ + if cls: + path = uiPath(cls) + elif not path: + path = uiPath(widget.__class__) + + cwd = os.getcwd() + try: + os.chdir(os.path.dirname(path)) + widget.ui = QtCompat.loadUi(path, widget) + finally: + os.chdir(cwd) + + +def isModifier(): + """ + Return True if either the alt key or control key is down. + + :rtype: bool + """ + return isAltModifier() or isControlModifier() + + +def isAltModifier(): + """ + Return True if the alt key is down. + + :rtype: bool + """ + modifiers = QtWidgets.QApplication.keyboardModifiers() + return modifiers == QtCore.Qt.AltModifier + + +def isControlModifier(): + """ + Return True if the control key is down. + + :rtype: bool + """ + modifiers = QtWidgets.QApplication.keyboardModifiers() + return modifiers == QtCore.Qt.ControlModifier + + +def isShiftModifier(): + """ + Return True if the shift key is down. + + :rtype: bool + """ + modifiers = QtWidgets.QApplication.keyboardModifiers() + return modifiers == QtCore.Qt.ShiftModifier + + +def fadeIn(widget, duration=200, onFinished=None): + """ + Fade in the given widget using the opacity effect. + + :type widget: QtWidget.QWidgets + :type duration: int + :type onFinished: func + :rtype: QtCore.QPropertyAnimation + """ + widget._fadeInEffect_ = QtWidgets.QGraphicsOpacityEffect() + widget.setGraphicsEffect(widget._fadeInEffect_) + animation = QtCore.QPropertyAnimation(widget._fadeInEffect_, b"opacity") + animation.setDuration(duration) + animation.setStartValue(0.0) + animation.setEndValue(1.0) + animation.setEasingCurve(QtCore.QEasingCurve.InOutCubic) + animation.start() + + if onFinished: + animation.finished.connect(onFinished) + + widget._fadeIn_ = animation + + return animation + + +def fadeOut(widget, duration=200, onFinished=None): + """ + Fade out the given widget using the opacity effect. + + :type widget: QtWidget.QWidgets + :type duration: int + :type onFinished: func + :rtype: QtCore.QPropertyAnimation + """ + widget._fadeOutEffect_ = QtWidgets.QGraphicsOpacityEffect() + widget.setGraphicsEffect(widget._fadeOutEffect_) + animation = QtCore.QPropertyAnimation(widget._fadeOutEffect_, b"opacity") + animation.setDuration(duration) + animation.setStartValue(1.0) + animation.setEndValue(0.0) + animation.setEasingCurve(QtCore.QEasingCurve.InOutCubic) + animation.start() + + if onFinished: + animation.finished.connect(onFinished) + + widget._fadeOut_ = animation + + return animation + + +def installFonts(path): + """ + Install all the fonts in the given directory path. + + :type path: str + """ + path = os.path.abspath(path) + fontDatabase = QtGui.QFontDatabase() + + for filename in os.listdir(path): + + if filename.endswith(".ttf"): + + filename = os.path.join(path, filename) + result = fontDatabase.addApplicationFont(filename) + + if result > 0: + logger.debug("Added font %s", filename) + else: + logger.debug("Cannot add font %s", filename) diff --git a/2023/scripts/animation_tools/studiolibrary/studiovendor/Qt.py b/2023/scripts/animation_tools/studiolibrary/studiovendor/Qt.py new file mode 100644 index 0000000..d6ba71a --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiovendor/Qt.py @@ -0,0 +1,1956 @@ +"""Minimal Python 2 & 3 shim around all Qt bindings + +DOCUMENTATION + Qt.py was born in the film and visual effects industry to address + the growing need for the development of software capable of running + with more than one flavour of the Qt bindings for Python. + + Supported Binding: PySide, PySide2, PySide6, PyQt4, PyQt5 + + 1. Build for one, run with all + 2. Explicit is better than implicit + 3. Support co-existence + + Default resolution order: + - PySide6 + - PySide2 + - PyQt5 + - PySide + - PyQt4 + + Usage: + >> import sys + >> from Qt import QtWidgets + >> app = QtWidgets.QApplication(sys.argv) + >> button = QtWidgets.QPushButton("Hello World") + >> button.show() + >> app.exec_() + + All members of PySide2 are mapped from other bindings, should they exist. + If no equivalent member exist, it is excluded from Qt.py and inaccessible. + The idea is to highlight members that exist across all supported binding, + and guarantee that code that runs on one binding runs on all others. + + For more details, visit https://github.com/mottosso/Qt.py + +LICENSE + + See end of file for license (MIT, BSD) information. + +""" + +import os +import sys +import types +import shutil +import importlib +import json + + +__version__ = "1.3.10" + +# Enable support for `from Qt import *` +__all__ = [] + +# Flags from environment variables +QT_VERBOSE = bool(os.getenv("QT_VERBOSE")) +QT_PREFERRED_BINDING_JSON = os.getenv("QT_PREFERRED_BINDING_JSON", "") +QT_PREFERRED_BINDING = os.getenv("QT_PREFERRED_BINDING", "") +QT_SIP_API_HINT = os.getenv("QT_SIP_API_HINT") + +# Reference to Qt.py +Qt = sys.modules[__name__] +Qt.QtCompat = types.ModuleType("QtCompat") + +try: + long +except NameError: + # Python 3 compatibility + long = int + + +"""Common members of all bindings + +This is where each member of Qt.py is explicitly defined. +It is based on a "lowest common denominator" of all bindings; +including members found in each of the 4 bindings. + +The "_common_members" dictionary is generated using the +build_membership.sh script. + +""" + +_common_members = { + "QtCore": [ + "QAbstractAnimation", + "QAbstractEventDispatcher", + "QAbstractItemModel", + "QAbstractListModel", + "QAbstractTableModel", + "QAnimationGroup", + "QBasicTimer", + "QBitArray", + "QBuffer", + "QByteArray", + "QByteArrayMatcher", + "QChildEvent", + "QCoreApplication", + "QCryptographicHash", + "QDataStream", + "QDate", + "QDateTime", + "QDir", + "QDirIterator", + "QDynamicPropertyChangeEvent", + "QEasingCurve", + "QElapsedTimer", + "QEvent", + "QEventLoop", + "QFile", + "QFileInfo", + "QFileSystemWatcher", + "QGenericArgument", + "QGenericReturnArgument", + "QIODevice", + "QLibraryInfo", + "QLine", + "QLineF", + "QLocale", + "QMargins", + "QMetaClassInfo", + "QMetaEnum", + "QMetaMethod", + "QMetaObject", + "QMetaProperty", + "QMimeData", + "QModelIndex", + "QMutex", + "QMutexLocker", + "QObject", + "QParallelAnimationGroup", + "QPauseAnimation", + "QPersistentModelIndex", + "QPluginLoader", + "QPoint", + "QPointF", + "QProcess", + "QProcessEnvironment", + "QPropertyAnimation", + "QReadLocker", + "QReadWriteLock", + "QRect", + "QRectF", + "QResource", + "QRunnable", + "QSemaphore", + "QSequentialAnimationGroup", + "QSettings", + "QSignalMapper", + "QSize", + "QSizeF", + "QSocketNotifier", + "QStringListModel", + "QSysInfo", + "QSystemSemaphore", + "QT_TRANSLATE_NOOP", + "QT_TR_NOOP", + "QT_TR_NOOP_UTF8", + "QTemporaryFile", + "QTextBoundaryFinder", + "QTextStream", + "QTextStreamManipulator", + "QThread", + "QThreadPool", + "QTime", + "QTimeLine", + "QTimer", + "QTimerEvent", + "QTranslator", + "QUrl", + "QUuid", + "QVariantAnimation", + "QWaitCondition", + "QWriteLocker", + "QXmlStreamAttribute", + "QXmlStreamAttributes", + "QXmlStreamEntityDeclaration", + "QXmlStreamEntityResolver", + "QXmlStreamNamespaceDeclaration", + "QXmlStreamNotationDeclaration", + "QXmlStreamReader", + "QXmlStreamWriter", + "Qt", + "QtMsgType", + "qAbs", + "qAddPostRoutine", + "qCritical", + "qDebug", + "qFatal", + "qFuzzyCompare", + "qIsFinite", + "qIsInf", + "qIsNaN", + "qIsNull", + "qRegisterResourceData", + "qUnregisterResourceData", + "qVersion", + "qWarning", + "Signal", + "Slot" + ], + "QtGui": [ + "QAbstractTextDocumentLayout", + "QActionEvent", + "QBitmap", + "QBrush", + "QClipboard", + "QCloseEvent", + "QColor", + "QConicalGradient", + "QContextMenuEvent", + "QCursor", + "QDesktopServices", + "QDoubleValidator", + "QDrag", + "QDragEnterEvent", + "QDragLeaveEvent", + "QDragMoveEvent", + "QDropEvent", + "QFileOpenEvent", + "QFocusEvent", + "QFont", + "QFontDatabase", + "QFontInfo", + "QFontMetrics", + "QFontMetricsF", + "QGradient", + "QHelpEvent", + "QHideEvent", + "QHoverEvent", + "QIcon", + "QIconDragEvent", + "QIconEngine", + "QImage", + "QImageIOHandler", + "QImageReader", + "QImageWriter", + "QInputEvent", + "QInputMethodEvent", + "QIntValidator", + "QKeyEvent", + "QKeySequence", + "QLinearGradient", + "QMatrix2x2", + "QMatrix2x3", + "QMatrix2x4", + "QMatrix3x2", + "QMatrix3x3", + "QMatrix3x4", + "QMatrix4x2", + "QMatrix4x3", + "QMatrix4x4", + "QMouseEvent", + "QMoveEvent", + "QMovie", + "QPaintDevice", + "QPaintEngine", + "QPaintEngineState", + "QPaintEvent", + "QPainter", + "QPainterPath", + "QPainterPathStroker", + "QPalette", + "QPen", + "QPicture", + "QPixmap", + "QPixmapCache", + "QPolygon", + "QPolygonF", + "QQuaternion", + "QRadialGradient", + "QRegion", + "QResizeEvent", + "QSessionManager", + "QShortcutEvent", + "QShowEvent", + "QStandardItem", + "QStandardItemModel", + "QStatusTipEvent", + "QSyntaxHighlighter", + "QTabletEvent", + "QTextBlock", + "QTextBlockFormat", + "QTextBlockGroup", + "QTextBlockUserData", + "QTextCharFormat", + "QTextCursor", + "QTextDocument", + "QTextDocumentFragment", + "QTextFormat", + "QTextFragment", + "QTextFrame", + "QTextFrameFormat", + "QTextImageFormat", + "QTextInlineObject", + "QTextItem", + "QTextLayout", + "QTextLength", + "QTextLine", + "QTextList", + "QTextListFormat", + "QTextObject", + "QTextObjectInterface", + "QTextOption", + "QTextTable", + "QTextTableCell", + "QTextTableCellFormat", + "QTextTableFormat", + "QTouchEvent", + "QTransform", + "QValidator", + "QVector2D", + "QVector3D", + "QVector4D", + "QWhatsThisClickedEvent", + "QWheelEvent", + "QWindowStateChangeEvent", + "qAlpha", + "qBlue", + "qGray", + "qGreen", + "qIsGray", + "qRed", + "qRgb", + "qRgba" + ], + "QtHelp": [ + "QHelpContentItem", + "QHelpContentModel", + "QHelpContentWidget", + "QHelpEngine", + "QHelpEngineCore", + "QHelpIndexModel", + "QHelpIndexWidget", + "QHelpSearchEngine", + "QHelpSearchQuery", + "QHelpSearchQueryWidget", + "QHelpSearchResultWidget" + ], + "QtNetwork": [ + "QAbstractNetworkCache", + "QAbstractSocket", + "QAuthenticator", + "QHostAddress", + "QHostInfo", + "QLocalServer", + "QLocalSocket", + "QNetworkAccessManager", + "QNetworkAddressEntry", + "QNetworkCacheMetaData", + "QNetworkCookie", + "QNetworkCookieJar", + "QNetworkDiskCache", + "QNetworkInterface", + "QNetworkProxy", + "QNetworkProxyFactory", + "QNetworkProxyQuery", + "QNetworkReply", + "QNetworkRequest", + "QSsl", + "QSslCertificate", + "QSslCipher", + "QSslConfiguration", + "QSslError", + "QSslKey", + "QSslSocket", + "QTcpServer", + "QTcpSocket", + "QUdpSocket" + ], + "QtPrintSupport": [ + "QAbstractPrintDialog", + "QPageSetupDialog", + "QPrintDialog", + "QPrintEngine", + "QPrintPreviewDialog", + "QPrintPreviewWidget", + "QPrinter", + "QPrinterInfo" + ], + "QtSvg": [ + "QSvgGenerator", + "QSvgRenderer" + ], + "QtTest": [ + "QTest" + ], + "QtWidgets": [ + "QAbstractButton", + "QAbstractGraphicsShapeItem", + "QAbstractItemDelegate", + "QAbstractItemView", + "QAbstractScrollArea", + "QAbstractSlider", + "QAbstractSpinBox", + "QAction", + "QActionGroup", + "QApplication", + "QBoxLayout", + "QButtonGroup", + "QCalendarWidget", + "QCheckBox", + "QColorDialog", + "QColumnView", + "QComboBox", + "QCommandLinkButton", + "QCommonStyle", + "QCompleter", + "QDataWidgetMapper", + "QDateEdit", + "QDateTimeEdit", + "QDial", + "QDialog", + "QDialogButtonBox", + "QDockWidget", + "QDoubleSpinBox", + "QErrorMessage", + "QFileDialog", + "QFileIconProvider", + "QFileSystemModel", + "QFocusFrame", + "QFontComboBox", + "QFontDialog", + "QFormLayout", + "QFrame", + "QGesture", + "QGestureEvent", + "QGestureRecognizer", + "QGraphicsAnchor", + "QGraphicsAnchorLayout", + "QGraphicsBlurEffect", + "QGraphicsColorizeEffect", + "QGraphicsDropShadowEffect", + "QGraphicsEffect", + "QGraphicsEllipseItem", + "QGraphicsGridLayout", + "QGraphicsItem", + "QGraphicsItemGroup", + "QGraphicsLayout", + "QGraphicsLayoutItem", + "QGraphicsLineItem", + "QGraphicsLinearLayout", + "QGraphicsObject", + "QGraphicsOpacityEffect", + "QGraphicsPathItem", + "QGraphicsPixmapItem", + "QGraphicsPolygonItem", + "QGraphicsProxyWidget", + "QGraphicsRectItem", + "QGraphicsRotation", + "QGraphicsScale", + "QGraphicsScene", + "QGraphicsSceneContextMenuEvent", + "QGraphicsSceneDragDropEvent", + "QGraphicsSceneEvent", + "QGraphicsSceneHelpEvent", + "QGraphicsSceneHoverEvent", + "QGraphicsSceneMouseEvent", + "QGraphicsSceneMoveEvent", + "QGraphicsSceneResizeEvent", + "QGraphicsSceneWheelEvent", + "QGraphicsSimpleTextItem", + "QGraphicsTextItem", + "QGraphicsTransform", + "QGraphicsView", + "QGraphicsWidget", + "QGridLayout", + "QGroupBox", + "QHBoxLayout", + "QHeaderView", + "QInputDialog", + "QItemDelegate", + "QItemEditorCreatorBase", + "QItemEditorFactory", + "QLCDNumber", + "QLabel", + "QLayout", + "QLayoutItem", + "QLineEdit", + "QListView", + "QListWidget", + "QListWidgetItem", + "QMainWindow", + "QMdiArea", + "QMdiSubWindow", + "QMenu", + "QMenuBar", + "QMessageBox", + "QPanGesture", + "QPinchGesture", + "QPlainTextDocumentLayout", + "QPlainTextEdit", + "QProgressBar", + "QProgressDialog", + "QPushButton", + "QRadioButton", + "QRubberBand", + "QScrollArea", + "QScrollBar", + "QSizeGrip", + "QSizePolicy", + "QSlider", + "QSpacerItem", + "QSpinBox", + "QSplashScreen", + "QSplitter", + "QSplitterHandle", + "QStackedLayout", + "QStackedWidget", + "QStatusBar", + "QStyle", + "QStyleFactory", + "QStyleHintReturn", + "QStyleHintReturnMask", + "QStyleHintReturnVariant", + "QStyleOption", + "QStyleOptionButton", + "QStyleOptionComboBox", + "QStyleOptionComplex", + "QStyleOptionDockWidget", + "QStyleOptionFocusRect", + "QStyleOptionFrame", + "QStyleOptionGraphicsItem", + "QStyleOptionGroupBox", + "QStyleOptionHeader", + "QStyleOptionMenuItem", + "QStyleOptionProgressBar", + "QStyleOptionRubberBand", + "QStyleOptionSizeGrip", + "QStyleOptionSlider", + "QStyleOptionSpinBox", + "QStyleOptionTab", + "QStyleOptionTabBarBase", + "QStyleOptionTabWidgetFrame", + "QStyleOptionTitleBar", + "QStyleOptionToolBar", + "QStyleOptionToolBox", + "QStyleOptionToolButton", + "QStyleOptionViewItem", + "QStylePainter", + "QStyledItemDelegate", + "QSwipeGesture", + "QSystemTrayIcon", + "QTabBar", + "QTabWidget", + "QTableView", + "QTableWidget", + "QTableWidgetItem", + "QTableWidgetSelectionRange", + "QTapAndHoldGesture", + "QTapGesture", + "QTextBrowser", + "QTextEdit", + "QTimeEdit", + "QToolBar", + "QToolBox", + "QToolButton", + "QToolTip", + "QTreeView", + "QTreeWidget", + "QTreeWidgetItem", + "QTreeWidgetItemIterator", + "QUndoView", + "QVBoxLayout", + "QWhatsThis", + "QWidget", + "QWidgetAction", + "QWidgetItem", + "QWizard", + "QWizardPage" + ], + "QtXml": [ + "QDomAttr", + "QDomCDATASection", + "QDomCharacterData", + "QDomComment", + "QDomDocument", + "QDomDocumentFragment", + "QDomDocumentType", + "QDomElement", + "QDomEntity", + "QDomEntityReference", + "QDomImplementation", + "QDomNamedNodeMap", + "QDomNode", + "QDomNodeList", + "QDomNotation", + "QDomProcessingInstruction", + "QDomText" + ] +} + +""" Missing members + +This mapping describes members that have been deprecated +in one or more bindings and have been left out of the +_common_members mapping. + +The member can provide an extra details string to be +included in exceptions and warnings. +""" + +_missing_members = { + "QtGui": { + "QMatrix": "Deprecated in PyQt5", + }, +} + + +def _qInstallMessageHandler(handler): + """Install a message handler that works in all bindings + + Args: + handler: A function that takes 3 arguments, or None + """ + def messageOutputHandler(*args): + # In Qt4 bindings, message handlers are passed 2 arguments + # In Qt5 bindings, message handlers are passed 3 arguments + # The first argument is a QtMsgType + # The last argument is the message to be printed + # The Middle argument (if passed) is a QMessageLogContext + if len(args) == 3: + msgType, logContext, msg = args + elif len(args) == 2: + msgType, msg = args + logContext = None + else: + raise TypeError( + "handler expected 2 or 3 arguments, got {0}".format(len(args))) + + if isinstance(msg, bytes): + # In python 3, some bindings pass a bytestring, which cannot be + # used elsewhere. Decoding a python 2 or 3 bytestring object will + # consistently return a unicode object. + msg = msg.decode() + + handler(msgType, logContext, msg) + + passObject = messageOutputHandler if handler else handler + if Qt.IsPySide or Qt.IsPyQt4: + return Qt._QtCore.qInstallMsgHandler(passObject) + elif Qt.IsPySide2 or Qt.IsPyQt5 or Qt.IsPySide6: + return Qt._QtCore.qInstallMessageHandler(passObject) + + +def _getcpppointer(object): + if hasattr(Qt, "_shiboken6"): + return getattr(Qt, "_shiboken6").getCppPointer(object)[0] + elif hasattr(Qt, "_shiboken2"): + return getattr(Qt, "_shiboken2").getCppPointer(object)[0] + elif hasattr(Qt, "_shiboken"): + return getattr(Qt, "_shiboken").getCppPointer(object)[0] + elif hasattr(Qt, "_sip"): + return getattr(Qt, "_sip").unwrapinstance(object) + raise AttributeError("'module' has no attribute 'getCppPointer'") + + +def _wrapinstance(ptr, base=None): + """Enable implicit cast of pointer to most suitable class + + This behaviour is available in sip per default. + + Based on http://nathanhorne.com/pyqtpyside-wrap-instance + + Usage: + This mechanism kicks in under these circumstances. + 1. Qt.py is using PySide 1 or 2. + 2. A `base` argument is not provided. + + See :func:`QtCompat.wrapInstance()` + + Arguments: + ptr (int): Pointer to QObject in memory + base (QObject, optional): Base class to wrap with. Defaults to QObject, + which should handle anything. + + """ + assert (base is None) or issubclass(base, Qt.QtCore.QObject), ( + "Argument 'base' must be of type ") + + if Qt.IsPyQt4 or Qt.IsPyQt5: + func = getattr(Qt, "_sip").wrapinstance + elif Qt.IsPySide2: + func = getattr(Qt, "_shiboken2").wrapInstance + elif Qt.IsPySide6: + func = getattr(Qt, "_shiboken6").wrapInstance + elif Qt.IsPySide: + func = getattr(Qt, "_shiboken").wrapInstance + else: + raise AttributeError("'module' has no attribute 'wrapInstance'") + + if base is None: + if Qt.IsPyQt4 or Qt.IsPyQt5: + base = Qt.QtCore.QObject + else: + q_object = func(long(ptr), Qt.QtCore.QObject) + meta_object = q_object.metaObject() + + while True: + class_name = meta_object.className() + + try: + base = getattr(Qt.QtWidgets, class_name) + except AttributeError: + try: + base = getattr(Qt.QtCore, class_name) + except AttributeError: + meta_object = meta_object.superClass() + continue + + break + + return func(long(ptr), base) + + +def _isvalid(object): + """Check if the object is valid to use in Python runtime. + + Usage: + See :func:`QtCompat.isValid()` + + Arguments: + object (QObject): QObject to check the validity of. + + """ + if hasattr(Qt, "_shiboken6"): + return getattr(Qt, "_shiboken6").isValid(object) + + elif hasattr(Qt, "_shiboken2"): + return getattr(Qt, "_shiboken2").isValid(object) + + elif hasattr(Qt, "_shiboken"): + return getattr(Qt, "_shiboken").isValid(object) + + elif hasattr(Qt, "_sip"): + return not getattr(Qt, "_sip").isdeleted(object) + + else: + raise AttributeError("'module' has no attribute isValid") + + +def _translate(context, sourceText, *args): + # In Qt4 bindings, translate can be passed 2 or 3 arguments + # In Qt5 bindings, translate can be passed 2 arguments + # The first argument is disambiguation[str] + # The last argument is n[int] + # The middle argument can be encoding[QtCore.QCoreApplication.Encoding] + try: + app = Qt.QtCore.QCoreApplication + except AttributeError: + raise NotImplementedError( + "Missing QCoreApplication implementation for {}".format( + Qt.__binding__ + ) + ) + + def get_arg(index): + try: + return args[index] + except IndexError: + pass + + n = -1 + encoding = None + + if len(args) == 3: + disambiguation, encoding, n = args + else: + disambiguation = get_arg(0) + n_or_encoding = get_arg(1) + + if isinstance(n_or_encoding, int): + n = n_or_encoding + else: + encoding = n_or_encoding + + if Qt.__binding__ in ("PySide2", "PySide6","PyQt5"): + sanitized_args = [context, sourceText, disambiguation, n] + else: + sanitized_args = [ + context, + sourceText, + disambiguation, + encoding or app.CodecForTr, + n, + ] + + return app.translate(*sanitized_args) + + +def _loadUi(uifile, baseinstance=None): + """Dynamically load a user interface from the given `uifile` + + This function calls `uic.loadUi` if using PyQt bindings, + else it implements a comparable binding for PySide. + + Documentation: + http://pyqt.sourceforge.net/Docs/PyQt5/designer.html#PyQt5.uic.loadUi + + Arguments: + uifile (str): Absolute path to Qt Designer file. + baseinstance (QWidget): Instantiated QWidget or subclass thereof + + Return: + baseinstance if `baseinstance` is not `None`. Otherwise + return the newly created instance of the user interface. + + """ + if hasattr(Qt, "_uic"): + return Qt._uic.loadUi(uifile, baseinstance) + + elif hasattr(Qt, "_QtUiTools"): + # Implement `PyQt5.uic.loadUi` for PySide(2) + + path = uifile + widget = baseinstance + + loader = Qt._QtUiTools.QUiLoader() + d = Qt.QtCore.QDir(os.path.dirname(path)) + loader.setWorkingDirectory(d) + + f = Qt.QtCore.QFile(path) + f.open(Qt.QtCore.QFile.ReadOnly) + ui = loader.load(path, widget) + f.close() + + layout = Qt.QtWidgets.QVBoxLayout() + layout.setObjectName("uiLayout") + layout.addWidget(ui) + widget.setLayout(layout) + layout.setContentsMargins(0, 0, 0, 0) + + baseinstance.setMinimumWidth(ui.minimumWidth()) + baseinstance.setMinimumHeight(ui.minimumHeight()) + baseinstance.setMaximumWidth(ui.maximumWidth()) + baseinstance.setMaximumHeight(ui.maximumHeight()) + + Qt.QtCore.QMetaObject.connectSlotsByName(widget) + + return ui + + else: + raise NotImplementedError("No implementation available for loadUi") + + +"""Misplaced members + +These members from the original submodule are misplaced relative PySide2 + +""" +_misplaced_members = { + "PySide6": { + "QtGui.QShortcut": "QtWidgets.QShortcut", + "QtGui.QStringListModel": "QtCore.QStringListModel", + "QtGui.QAction": "QtWidgets.QAction", + "QtUiTools.QUiLoader": ["QtCompat.loadUi", _loadUi], + "shiboken6.wrapInstance": ["QtCompat.wrapInstance", _wrapinstance], + "shiboken6.getCppPointer": ["QtCompat.getCppPointer", _getcpppointer], + "shiboken6.isValid": ["QtCompat.isValid", _isvalid], + "QtWidgets.qApp": "QtWidgets.QApplication.instance()", + "QtCore.QCoreApplication.translate": [ + "QtCompat.translate", _translate + ], + "QtWidgets.QApplication.translate": [ + "QtCompat.translate", _translate + ], + "QtCore.qInstallMessageHandler": [ + "QtCompat.qInstallMessageHandler", _qInstallMessageHandler + ], + "QtWidgets.QStyleOptionViewItem": "QtCompat.QStyleOptionViewItemV4", + "QtMultimedia.QSound": "QtMultimedia.QSound", + }, + "PySide2": { + "QtCore.QStringListModel": "QtCore.QStringListModel", + "QtGui.QStringListModel": "QtCore.QStringListModel", + "QtUiTools.QUiLoader": ["QtCompat.loadUi", _loadUi], + "shiboken2.wrapInstance": ["QtCompat.wrapInstance", _wrapinstance], + "shiboken2.getCppPointer": ["QtCompat.getCppPointer", _getcpppointer], + "shiboken2.isValid": ["QtCompat.isValid", _isvalid], + "QtWidgets.qApp": "QtWidgets.QApplication.instance()", + "QtCore.QCoreApplication.translate": [ + "QtCompat.translate", _translate + ], + "QtWidgets.QApplication.translate": [ + "QtCompat.translate", _translate + ], + "QtCore.qInstallMessageHandler": [ + "QtCompat.qInstallMessageHandler", _qInstallMessageHandler + ], + "QtWidgets.QStyleOptionViewItem": "QtCompat.QStyleOptionViewItemV4", + "QtMultimedia.QSound": "QtMultimedia.QSound", + }, + "PyQt5": { + "QtCore.pyqtProperty": "QtCore.Property", + "QtCore.pyqtSignal": "QtCore.Signal", + "QtCore.pyqtSlot": "QtCore.Slot", + "uic.loadUi": ["QtCompat.loadUi", _loadUi], + "sip.wrapinstance": ["QtCompat.wrapInstance", _wrapinstance], + "sip.unwrapinstance": ["QtCompat.getCppPointer", _getcpppointer], + "sip.isdeleted": ["QtCompat.isValid", _isvalid], + "QtWidgets.qApp": "QtWidgets.QApplication.instance()", + "QtCore.QCoreApplication.translate": [ + "QtCompat.translate", _translate + ], + "QtWidgets.QApplication.translate": [ + "QtCompat.translate", _translate + ], + "QtCore.qInstallMessageHandler": [ + "QtCompat.qInstallMessageHandler", _qInstallMessageHandler + ], + "QtWidgets.QStyleOptionViewItem": "QtCompat.QStyleOptionViewItemV4", + "QtMultimedia.QSound": "QtMultimedia.QSound", + }, + "PySide": { + "QtGui.QAbstractProxyModel": "QtCore.QAbstractProxyModel", + "QtGui.QSortFilterProxyModel": "QtCore.QSortFilterProxyModel", + "QtGui.QStringListModel": "QtCore.QStringListModel", + "QtGui.QItemSelection": "QtCore.QItemSelection", + "QtGui.QItemSelectionModel": "QtCore.QItemSelectionModel", + "QtGui.QItemSelectionRange": "QtCore.QItemSelectionRange", + "QtGui.QAbstractPrintDialog": "QtPrintSupport.QAbstractPrintDialog", + "QtGui.QPageSetupDialog": "QtPrintSupport.QPageSetupDialog", + "QtGui.QPrintDialog": "QtPrintSupport.QPrintDialog", + "QtGui.QPrintEngine": "QtPrintSupport.QPrintEngine", + "QtGui.QPrintPreviewDialog": "QtPrintSupport.QPrintPreviewDialog", + "QtGui.QPrintPreviewWidget": "QtPrintSupport.QPrintPreviewWidget", + "QtGui.QPrinter": "QtPrintSupport.QPrinter", + "QtGui.QPrinterInfo": "QtPrintSupport.QPrinterInfo", + "QtUiTools.QUiLoader": ["QtCompat.loadUi", _loadUi], + "shiboken.wrapInstance": ["QtCompat.wrapInstance", _wrapinstance], + "shiboken.unwrapInstance": ["QtCompat.getCppPointer", _getcpppointer], + "shiboken.isValid": ["QtCompat.isValid", _isvalid], + "QtGui.qApp": "QtWidgets.QApplication.instance()", + "QtCore.QCoreApplication.translate": [ + "QtCompat.translate", _translate + ], + "QtGui.QApplication.translate": [ + "QtCompat.translate", _translate + ], + "QtCore.qInstallMsgHandler": [ + "QtCompat.qInstallMessageHandler", _qInstallMessageHandler + ], + "QtGui.QStyleOptionViewItemV4": "QtCompat.QStyleOptionViewItemV4", + "QtGui.QSound": "QtMultimedia.QSound", + }, + "PyQt4": { + "QtGui.QAbstractProxyModel": "QtCore.QAbstractProxyModel", + "QtGui.QSortFilterProxyModel": "QtCore.QSortFilterProxyModel", + "QtGui.QItemSelection": "QtCore.QItemSelection", + "QtGui.QStringListModel": "QtCore.QStringListModel", + "QtGui.QItemSelectionModel": "QtCore.QItemSelectionModel", + "QtCore.pyqtProperty": "QtCore.Property", + "QtCore.pyqtSignal": "QtCore.Signal", + "QtCore.pyqtSlot": "QtCore.Slot", + "QtGui.QItemSelectionRange": "QtCore.QItemSelectionRange", + "QtGui.QAbstractPrintDialog": "QtPrintSupport.QAbstractPrintDialog", + "QtGui.QPageSetupDialog": "QtPrintSupport.QPageSetupDialog", + "QtGui.QPrintDialog": "QtPrintSupport.QPrintDialog", + "QtGui.QPrintEngine": "QtPrintSupport.QPrintEngine", + "QtGui.QPrintPreviewDialog": "QtPrintSupport.QPrintPreviewDialog", + "QtGui.QPrintPreviewWidget": "QtPrintSupport.QPrintPreviewWidget", + "QtGui.QPrinter": "QtPrintSupport.QPrinter", + "QtGui.QPrinterInfo": "QtPrintSupport.QPrinterInfo", + "uic.loadUi": ["QtCompat.loadUi", _loadUi], + "sip.wrapinstance": ["QtCompat.wrapInstance", _wrapinstance], + "sip.unwrapinstance": ["QtCompat.getCppPointer", _getcpppointer], + "sip.isdeleted": ["QtCompat.isValid", _isvalid], + "QtCore.QString": "str", + "QtGui.qApp": "QtWidgets.QApplication.instance()", + "QtCore.QCoreApplication.translate": [ + "QtCompat.translate", _translate + ], + "QtGui.QApplication.translate": [ + "QtCompat.translate", _translate + ], + "QtCore.qInstallMsgHandler": [ + "QtCompat.qInstallMessageHandler", _qInstallMessageHandler + ], + "QtGui.QStyleOptionViewItemV4": "QtCompat.QStyleOptionViewItemV4", + "QtGui.QSound": "QtMultimedia.QSound", + } +} + +""" Compatibility Members + +This dictionary is used to build Qt.QtCompat objects that provide a consistent +interface for obsolete members, and differences in binding return values. + +{ + "binding": { + "classname": { + "targetname": "binding_namespace", + } + } +} +""" +_compatibility_members = { + "PySide6": { + "QWidget": { + "grab": "QtWidgets.QWidget.grab", + }, + "QHeaderView": { + "sectionsClickable": "QtWidgets.QHeaderView.sectionsClickable", + "setSectionsClickable": + "QtWidgets.QHeaderView.setSectionsClickable", + "sectionResizeMode": "QtWidgets.QHeaderView.sectionResizeMode", + "setSectionResizeMode": + "QtWidgets.QHeaderView.setSectionResizeMode", + "sectionsMovable": "QtWidgets.QHeaderView.sectionsMovable", + "setSectionsMovable": "QtWidgets.QHeaderView.setSectionsMovable", + }, + "QFileDialog": { + "getOpenFileName": "QtWidgets.QFileDialog.getOpenFileName", + "getOpenFileNames": "QtWidgets.QFileDialog.getOpenFileNames", + "getSaveFileName": "QtWidgets.QFileDialog.getSaveFileName", + }, + }, + "PySide2": { + "QWidget": { + "grab": "QtWidgets.QWidget.grab", + }, + "QHeaderView": { + "sectionsClickable": "QtWidgets.QHeaderView.sectionsClickable", + "setSectionsClickable": + "QtWidgets.QHeaderView.setSectionsClickable", + "sectionResizeMode": "QtWidgets.QHeaderView.sectionResizeMode", + "setSectionResizeMode": + "QtWidgets.QHeaderView.setSectionResizeMode", + "sectionsMovable": "QtWidgets.QHeaderView.sectionsMovable", + "setSectionsMovable": "QtWidgets.QHeaderView.setSectionsMovable", + }, + "QFileDialog": { + "getOpenFileName": "QtWidgets.QFileDialog.getOpenFileName", + "getOpenFileNames": "QtWidgets.QFileDialog.getOpenFileNames", + "getSaveFileName": "QtWidgets.QFileDialog.getSaveFileName", + }, + }, + "PyQt5": { + "QWidget": { + "grab": "QtWidgets.QWidget.grab", + }, + "QHeaderView": { + "sectionsClickable": "QtWidgets.QHeaderView.sectionsClickable", + "setSectionsClickable": + "QtWidgets.QHeaderView.setSectionsClickable", + "sectionResizeMode": "QtWidgets.QHeaderView.sectionResizeMode", + "setSectionResizeMode": + "QtWidgets.QHeaderView.setSectionResizeMode", + "sectionsMovable": "QtWidgets.QHeaderView.sectionsMovable", + "setSectionsMovable": "QtWidgets.QHeaderView.setSectionsMovable", + }, + "QFileDialog": { + "getOpenFileName": "QtWidgets.QFileDialog.getOpenFileName", + "getOpenFileNames": "QtWidgets.QFileDialog.getOpenFileNames", + "getSaveFileName": "QtWidgets.QFileDialog.getSaveFileName", + }, + }, + "PySide": { + "QWidget": { + "grab": "QtWidgets.QPixmap.grabWidget", + }, + "QHeaderView": { + "sectionsClickable": "QtWidgets.QHeaderView.isClickable", + "setSectionsClickable": "QtWidgets.QHeaderView.setClickable", + "sectionResizeMode": "QtWidgets.QHeaderView.resizeMode", + "setSectionResizeMode": "QtWidgets.QHeaderView.setResizeMode", + "sectionsMovable": "QtWidgets.QHeaderView.isMovable", + "setSectionsMovable": "QtWidgets.QHeaderView.setMovable", + }, + "QFileDialog": { + "getOpenFileName": "QtWidgets.QFileDialog.getOpenFileName", + "getOpenFileNames": "QtWidgets.QFileDialog.getOpenFileNames", + "getSaveFileName": "QtWidgets.QFileDialog.getSaveFileName", + }, + }, + "PyQt4": { + "QWidget": { + "grab": "QtWidgets.QPixmap.grabWidget", + }, + "QHeaderView": { + "sectionsClickable": "QtWidgets.QHeaderView.isClickable", + "setSectionsClickable": "QtWidgets.QHeaderView.setClickable", + "sectionResizeMode": "QtWidgets.QHeaderView.resizeMode", + "setSectionResizeMode": "QtWidgets.QHeaderView.setResizeMode", + "sectionsMovable": "QtWidgets.QHeaderView.isMovable", + "setSectionsMovable": "QtWidgets.QHeaderView.setMovable", + }, + "QFileDialog": { + "getOpenFileName": "QtWidgets.QFileDialog.getOpenFileName", + "getOpenFileNames": "QtWidgets.QFileDialog.getOpenFileNames", + "getSaveFileName": "QtWidgets.QFileDialog.getSaveFileName", + }, + }, +} + + +def _apply_site_config(): + try: + import QtSiteConfig + except ImportError: + # If no QtSiteConfig module found, no modifications + # to _common_members are needed. + pass + else: + # Provide the ability to modify the dicts used to build Qt.py + if hasattr(QtSiteConfig, 'update_members'): + QtSiteConfig.update_members(_common_members) + + if hasattr(QtSiteConfig, 'update_misplaced_members'): + QtSiteConfig.update_misplaced_members(members=_misplaced_members) + + if hasattr(QtSiteConfig, 'update_compatibility_members'): + QtSiteConfig.update_compatibility_members( + members=_compatibility_members) + + +def _new_module(name): + return types.ModuleType(__name__ + "." + name) + + +def _import_sub_module(module, name): + """import_sub_module will mimic the function of importlib.import_module""" + module = __import__(module.__name__ + "." + name) + for level in name.split("."): + module = getattr(module, level) + return module + + +def _setup(module, extras): + """Install common submodules""" + + Qt.__binding__ = module.__name__ + + def _warn_import_error(exc, module): + msg = str(exc) + if "No module named" in msg: + return + _warn("ImportError(%s): %s" % (module, msg)) + + for name in list(_common_members) + extras: + try: + submodule = _import_sub_module( + module, name) + except ImportError as e: + try: + # For extra modules like sip and shiboken that may not be + # children of the binding. + submodule = __import__(name) + except ImportError as e2: + _warn_import_error(e, name) + _warn_import_error(e2, name) + continue + + setattr(Qt, "_" + name, submodule) + + if name not in extras: + # Store reference to original binding, + # but don't store speciality modules + # such as uic or QtUiTools + setattr(Qt, name, _new_module(name)) + + +def _reassign_misplaced_members(binding): + """Apply misplaced members from `binding` to Qt.py + + Arguments: + binding (dict): Misplaced members + + """ + + for src, dst in _misplaced_members[binding].items(): + dst_value = None + + src_parts = src.split(".") + src_module = src_parts[0] + src_member = None + if len(src_parts) > 1: + src_member = src_parts[1:] + + if isinstance(dst, (list, tuple)): + dst, dst_value = dst + + dst_parts = dst.split(".") + dst_module = dst_parts[0] + dst_member = None + if len(dst_parts) > 1: + dst_member = dst_parts[1] + + # Get the member we want to store in the namesapce. + if not dst_value: + try: + _part = getattr(Qt, "_" + src_module) + while src_member: + member = src_member.pop(0) + _part = getattr(_part, member) + dst_value = _part + except AttributeError: + # If the member we want to store in the namespace does not + # exist, there is no need to continue. This can happen if a + # request was made to rename a member that didn't exist, for + # example if QtWidgets isn't available on the target platform. + _log("Misplaced member has no source: {0}".format(src)) + continue + + try: + src_object = getattr(Qt, dst_module) + except AttributeError: + if dst_module not in _common_members: + # Only create the Qt parent module if its listed in + # _common_members. Without this check, if you remove QtCore + # from _common_members, the default _misplaced_members will add + # Qt.QtCore so it can add Signal, Slot, etc. + msg = 'Not creating missing member module "{m}" for "{c}"' + _log(msg.format(m=dst_module, c=dst_member)) + continue + # If the dst is valid but the Qt parent module does not exist + # then go ahead and create a new module to contain the member. + setattr(Qt, dst_module, _new_module(dst_module)) + src_object = getattr(Qt, dst_module) + # Enable direct import of the new module + sys.modules[__name__ + "." + dst_module] = src_object + + if not dst_value: + dst_value = getattr(Qt, "_" + src_module) + if src_member: + dst_value = getattr(dst_value, src_member) + + setattr( + src_object, + dst_member or dst_module, + dst_value + ) + + +def _build_compatibility_members(binding, decorators=None): + """Apply `binding` to QtCompat + + Arguments: + binding (str): Top level binding in _compatibility_members. + decorators (dict, optional): Provides the ability to decorate the + original Qt methods when needed by a binding. This can be used + to change the returned value to a standard value. The key should + be the classname, the value is a dict where the keys are the + target method names, and the values are the decorator functions. + + """ + + decorators = decorators or dict() + + # Allow optional site-level customization of the compatibility members. + # This method does not need to be implemented in QtSiteConfig. + try: + import QtSiteConfig + except ImportError: + pass + else: + if hasattr(QtSiteConfig, 'update_compatibility_decorators'): + QtSiteConfig.update_compatibility_decorators(binding, decorators) + + _QtCompat = type("QtCompat", (object,), {}) + + for classname, bindings in _compatibility_members[binding].items(): + attrs = {} + for target, binding in bindings.items(): + namespaces = binding.split('.') + try: + src_object = getattr(Qt, "_" + namespaces[0]) + except AttributeError as e: + _log("QtCompat: AttributeError: %s" % e) + # Skip reassignment of non-existing members. + # This can happen if a request was made to + # rename a member that didn't exist, for example + # if QtWidgets isn't available on the target platform. + continue + + # Walk down any remaining namespace getting the object assuming + # that if the first namespace exists the rest will exist. + for namespace in namespaces[1:]: + src_object = getattr(src_object, namespace) + + # decorate the Qt method if a decorator was provided. + if target in decorators.get(classname, []): + # staticmethod must be called on the decorated method to + # prevent a TypeError being raised when the decorated method + # is called. + src_object = staticmethod( + decorators[classname][target](src_object)) + + attrs[target] = src_object + + # Create the QtCompat class and install it into the namespace + compat_class = type(classname, (_QtCompat,), attrs) + setattr(Qt.QtCompat, classname, compat_class) + + +def _pyside6(): + """Initialise PySide6 + + These functions serve to test the existence of a binding + along with set it up in such a way that it aligns with + the final step; adding members from the original binding + to Qt.py + + """ + + import PySide6 as module + extras = ["QtUiTools"] + try: + import shiboken6 + extras.append("shiboken6") + except ImportError as e: + print("ImportError: %s" % e) + + _setup(module, extras) + Qt.__binding_version__ = module.__version__ + + if hasattr(Qt, "_shiboken6"): + Qt.QtCompat.wrapInstance = _wrapinstance + Qt.QtCompat.getCppPointer = _getcpppointer + Qt.QtCompat.delete = shiboken6.delete + + if hasattr(Qt, "_QtUiTools"): + Qt.QtCompat.loadUi = _loadUi + + if hasattr(Qt, "_QtCore"): + Qt.__qt_version__ = Qt._QtCore.qVersion() + Qt.QtCompat.dataChanged = ( + lambda self, topleft, bottomright, roles=None: + self.dataChanged.emit(topleft, bottomright, roles or []) + ) + + if hasattr(Qt, "_QtWidgets"): + Qt.QtCompat.setSectionResizeMode = \ + Qt._QtWidgets.QHeaderView.setSectionResizeMode + + _reassign_misplaced_members("PySide6") + _build_compatibility_members("PySide6") + + +def _pyside2(): + """Initialise PySide2 + + These functions serve to test the existence of a binding + along with set it up in such a way that it aligns with + the final step; adding members from the original binding + to Qt.py + + """ + + import PySide2 as module + extras = ["QtUiTools"] + try: + try: + # Before merge of PySide and shiboken + import shiboken2 + except ImportError: + # After merge of PySide and shiboken, May 2017 + from PySide2 import shiboken2 + extras.append("shiboken2") + except ImportError: + pass + + _setup(module, extras) + Qt.__binding_version__ = module.__version__ + + if hasattr(Qt, "_shiboken2"): + Qt.QtCompat.wrapInstance = _wrapinstance + Qt.QtCompat.getCppPointer = _getcpppointer + Qt.QtCompat.delete = shiboken2.delete + + if hasattr(Qt, "_QtUiTools"): + Qt.QtCompat.loadUi = _loadUi + + if hasattr(Qt, "_QtCore"): + Qt.__qt_version__ = Qt._QtCore.qVersion() + Qt.QtCompat.dataChanged = ( + lambda self, topleft, bottomright, roles=None: + self.dataChanged.emit(topleft, bottomright, roles or []) + ) + + if hasattr(Qt, "_QtWidgets"): + Qt.QtCompat.setSectionResizeMode = \ + Qt._QtWidgets.QHeaderView.setSectionResizeMode + + _reassign_misplaced_members("PySide2") + _build_compatibility_members("PySide2") + + +def _pyside(): + """Initialise PySide""" + + import PySide as module + extras = ["QtUiTools"] + try: + try: + # Before merge of PySide and shiboken + import shiboken + except ImportError: + # After merge of PySide and shiboken, May 2017 + from PySide import shiboken + extras.append("shiboken") + except ImportError: + pass + + _setup(module, extras) + Qt.__binding_version__ = module.__version__ + + if hasattr(Qt, "_shiboken"): + Qt.QtCompat.wrapInstance = _wrapinstance + Qt.QtCompat.getCppPointer = _getcpppointer + Qt.QtCompat.delete = shiboken.delete + + if hasattr(Qt, "_QtUiTools"): + Qt.QtCompat.loadUi = _loadUi + + if hasattr(Qt, "_QtGui"): + setattr(Qt, "QtWidgets", _new_module("QtWidgets")) + setattr(Qt, "_QtWidgets", Qt._QtGui) + if hasattr(Qt._QtGui, "QX11Info"): + setattr(Qt, "QtX11Extras", _new_module("QtX11Extras")) + Qt.QtX11Extras.QX11Info = Qt._QtGui.QX11Info + + Qt.QtCompat.setSectionResizeMode = Qt._QtGui.QHeaderView.setResizeMode + + if hasattr(Qt, "_QtCore"): + Qt.__qt_version__ = Qt._QtCore.qVersion() + Qt.QtCompat.dataChanged = ( + lambda self, topleft, bottomright, roles=None: + self.dataChanged.emit(topleft, bottomright) + ) + + _reassign_misplaced_members("PySide") + _build_compatibility_members("PySide") + + +def _pyqt5(): + """Initialise PyQt5""" + + import PyQt5 as module + extras = ["uic"] + + try: + # Relevant to PyQt5 5.11 and above + from PyQt5 import sip + extras += ["sip"] + except ImportError: + + try: + import sip + extras += ["sip"] + except ImportError: + sip = None + + _setup(module, extras) + if hasattr(Qt, "_sip"): + Qt.QtCompat.wrapInstance = _wrapinstance + Qt.QtCompat.getCppPointer = _getcpppointer + Qt.QtCompat.delete = sip.delete + + if hasattr(Qt, "_uic"): + Qt.QtCompat.loadUi = _loadUi + + if hasattr(Qt, "_QtCore"): + Qt.__binding_version__ = Qt._QtCore.PYQT_VERSION_STR + Qt.__qt_version__ = Qt._QtCore.QT_VERSION_STR + Qt.QtCompat.dataChanged = ( + lambda self, topleft, bottomright, roles=None: + self.dataChanged.emit(topleft, bottomright, roles or []) + ) + + if hasattr(Qt, "_QtWidgets"): + Qt.QtCompat.setSectionResizeMode = \ + Qt._QtWidgets.QHeaderView.setSectionResizeMode + + _reassign_misplaced_members("PyQt5") + _build_compatibility_members('PyQt5') + + +def _pyqt4(): + """Initialise PyQt4""" + + import sip + + # Validation of envivornment variable. Prevents an error if + # the variable is invalid since it's just a hint. + try: + hint = int(QT_SIP_API_HINT) + except TypeError: + hint = None # Variable was None, i.e. not set. + except ValueError: + raise ImportError("QT_SIP_API_HINT=%s must be a 1 or 2") + + for api in ("QString", + "QVariant", + "QDate", + "QDateTime", + "QTextStream", + "QTime", + "QUrl"): + try: + sip.setapi(api, hint or 2) + except AttributeError: + raise ImportError("PyQt4 < 4.6 isn't supported by Qt.py") + except ValueError: + actual = sip.getapi(api) + if not hint: + raise ImportError("API version already set to %d" % actual) + else: + # Having provided a hint indicates a soft constraint, one + # that doesn't throw an exception. + sys.stderr.write( + "Warning: API '%s' has already been set to %d.\n" + % (api, actual) + ) + + import PyQt4 as module + extras = ["uic"] + try: + import sip + extras.append(sip.__name__) + except ImportError: + sip = None + + _setup(module, extras) + if hasattr(Qt, "_sip"): + Qt.QtCompat.wrapInstance = _wrapinstance + Qt.QtCompat.getCppPointer = _getcpppointer + Qt.QtCompat.delete = sip.delete + + if hasattr(Qt, "_uic"): + Qt.QtCompat.loadUi = _loadUi + + if hasattr(Qt, "_QtGui"): + setattr(Qt, "QtWidgets", _new_module("QtWidgets")) + setattr(Qt, "_QtWidgets", Qt._QtGui) + if hasattr(Qt._QtGui, "QX11Info"): + setattr(Qt, "QtX11Extras", _new_module("QtX11Extras")) + Qt.QtX11Extras.QX11Info = Qt._QtGui.QX11Info + + Qt.QtCompat.setSectionResizeMode = \ + Qt._QtGui.QHeaderView.setResizeMode + + if hasattr(Qt, "_QtCore"): + Qt.__binding_version__ = Qt._QtCore.PYQT_VERSION_STR + Qt.__qt_version__ = Qt._QtCore.QT_VERSION_STR + Qt.QtCompat.dataChanged = ( + lambda self, topleft, bottomright, roles=None: + self.dataChanged.emit(topleft, bottomright) + ) + + _reassign_misplaced_members("PyQt4") + + # QFileDialog QtCompat decorator + def _standardizeQFileDialog(some_function): + """Decorator that makes PyQt4 return conform to other bindings""" + def wrapper(*args, **kwargs): + ret = (some_function(*args, **kwargs)) + + # PyQt4 only returns the selected filename, force it to a + # standard return of the selected filename, and a empty string + # for the selected filter + return ret, '' + + wrapper.__doc__ = some_function.__doc__ + wrapper.__name__ = some_function.__name__ + + return wrapper + + decorators = { + "QFileDialog": { + "getOpenFileName": _standardizeQFileDialog, + "getOpenFileNames": _standardizeQFileDialog, + "getSaveFileName": _standardizeQFileDialog, + } + } + _build_compatibility_members('PyQt4', decorators) + + +def _none(): + """Internal option (used in installer)""" + + Mock = type("Mock", (), {"__getattr__": lambda Qt, attr: None}) + + Qt.__binding__ = "None" + Qt.__qt_version__ = "0.0.0" + Qt.__binding_version__ = "0.0.0" + Qt.QtCompat.loadUi = lambda uifile, baseinstance=None: None + Qt.QtCompat.setSectionResizeMode = lambda *args, **kwargs: None + + for submodule in _common_members.keys(): + setattr(Qt, submodule, Mock()) + setattr(Qt, "_" + submodule, Mock()) + + +def _log(text): + if QT_VERBOSE: + sys.stdout.write("Qt.py [info]: %s\n" % text) + + +def _warn(text): + try: + sys.stderr.write("Qt.py [warning]: %s\n" % text) + except UnicodeDecodeError: + import locale + encoding = locale.getpreferredencoding() + sys.stderr.write("Qt.py [warning]: %s\n" % text.decode(encoding)) + + +def _convert(lines): + """Convert compiled .ui file from PySide2 to Qt.py + + Arguments: + lines (list): Each line of of .ui file + + Usage: + >> with open("myui.py") as f: + .. lines = _convert(f.readlines()) + + """ + + def parse(line): + line = line.replace("from PySide2 import", "from Qt import QtCompat,") + line = line.replace("QtWidgets.QApplication.translate", + "QtCompat.translate") + if "QtCore.SIGNAL" in line: + raise NotImplementedError("QtCore.SIGNAL is missing from PyQt5 " + "and so Qt.py does not support it: you " + "should avoid defining signals inside " + "your ui files.") + return line + + parsed = list() + for line in lines: + line = parse(line) + parsed.append(line) + + return parsed + + +def _cli(args): + """Qt.py command-line interface""" + import argparse + + parser = argparse.ArgumentParser() + parser.add_argument("--convert", + help="Path to compiled Python module, e.g. my_ui.py") + parser.add_argument("--compile", + help="Accept raw .ui file and compile with native " + "PySide2 compiler.") + parser.add_argument("--stdout", + help="Write to stdout instead of file", + action="store_true") + parser.add_argument("--stdin", + help="Read from stdin instead of file", + action="store_true") + + args = parser.parse_args(args) + + if args.stdout: + raise NotImplementedError("--stdout") + + if args.stdin: + raise NotImplementedError("--stdin") + + if args.compile: + raise NotImplementedError("--compile") + + if args.convert: + sys.stdout.write("#\n" + "# WARNING: --convert is an ALPHA feature.\n#\n" + "# See https://github.com/mottosso/Qt.py/pull/132\n" + "# for details.\n" + "#\n") + + # + # ------> Read + # + with open(args.convert) as f: + lines = _convert(f.readlines()) + + backup = "%s_backup%s" % os.path.splitext(args.convert) + sys.stdout.write("Creating \"%s\"..\n" % backup) + shutil.copy(args.convert, backup) + + # + # <------ Write + # + with open(args.convert, "w") as f: + f.write("".join(lines)) + + sys.stdout.write("Successfully converted \"%s\"\n" % args.convert) + + +class MissingMember(object): + """ + A placeholder type for a missing Qt object not + included in Qt.py + + Args: + name (str): The name of the missing type + details (str): An optional custom error message + """ + ERR_TMPL = ("{} is not a common object across PySide2 " + "and the other Qt bindings. It is not included " + "as a common member in the Qt.py layer") + + def __init__(self, name, details=''): + self.__name = name + self.__err = self.ERR_TMPL.format(name) + + if details: + self.__err = "{}: {}".format(self.__err, details) + + def __repr__(self): + return "<{}: {}>".format(self.__class__.__name__, self.__name) + + def __getattr__(self, name): + raise NotImplementedError(self.__err) + + def __call__(self, *a, **kw): + raise NotImplementedError(self.__err) + + +def _install(): + # Default order (customize order and content via QT_PREFERRED_BINDING) + default_order = ("PySide6", "PySide2", "PyQt5", "PySide", "PyQt4") + preferred_order = None + if QT_PREFERRED_BINDING_JSON: + # A per-vendor preferred binding customization was defined + # This should be a dictionary of the full Qt.py module namespace to + # apply binding settings to. The "default" key can be used to apply + # custom bindings to all modules not explicitly defined. If the json + # data is invalid this will raise a exception. + # Example: + # {"mylibrary.vendor.Qt": ["PySide2"], "default":["PyQt5","PyQt4"]} + try: + preferred_bindings = json.loads(QT_PREFERRED_BINDING_JSON) + except ValueError: + # Python 2 raises ValueError, Python 3 raises json.JSONDecodeError + # a subclass of ValueError + _warn("Failed to parse QT_PREFERRED_BINDING_JSON='%s'" + % QT_PREFERRED_BINDING_JSON) + _warn("Falling back to default preferred order") + else: + preferred_order = preferred_bindings.get(__name__) + # If no matching binding was used, optionally apply a default. + if preferred_order is None: + preferred_order = preferred_bindings.get("default", None) + if preferred_order is None: + # If a json preferred binding was not used use, respect the + # QT_PREFERRED_BINDING environment variable if defined. + preferred_order = list( + b for b in QT_PREFERRED_BINDING.split(os.pathsep) if b + ) + + order = preferred_order or default_order + + available = { + "PySide6": _pyside6, + "PySide2": _pyside2, + "PyQt5": _pyqt5, + "PySide": _pyside, + "PyQt4": _pyqt4, + "None": _none + } + + _log("Order: '%s'" % "', '".join(order)) + + # Allow site-level customization of the available modules. + _apply_site_config() + + found_binding = False + for name in order: + _log("Trying %s" % name) + + try: + available[name]() + found_binding = True + break + + except ImportError as e: + _log("ImportError: %s" % e) + + except KeyError: + _log("ImportError: Preferred binding '%s' not found." % name) + + if not found_binding: + # If not binding were found, throw this error + raise ImportError("No Qt binding were found.") + + # Install individual members + for name, members in _common_members.items(): + try: + their_submodule = getattr(Qt, "_%s" % name) + except AttributeError: + continue + + our_submodule = getattr(Qt, name) + + # Enable import * + __all__.append(name) + + # Enable direct import of submodule, + # e.g. import Qt.QtCore + sys.modules[__name__ + "." + name] = our_submodule + + for member in members: + # Accept that a submodule may miss certain members. + try: + their_member = getattr(their_submodule, member) + except AttributeError: + _log("'%s.%s' was missing." % (name, member)) + continue + + setattr(our_submodule, member, their_member) + + # Install missing member placeholders + for name, members in _missing_members.items(): + our_submodule = getattr(Qt, name) + + for member in members: + + # If the submodule already has this member installed, + # either by the common members, or the site config, + # then skip installing this one over it. + if hasattr(our_submodule, member): + continue + + placeholder = MissingMember("{}.{}".format(name, member), + details=members[member]) + setattr(our_submodule, member, placeholder) + + # Enable direct import of QtCompat + sys.modules[__name__ + ".QtCompat"] = Qt.QtCompat + + # Backwards compatibility + if hasattr(Qt.QtCompat, 'loadUi'): + Qt.QtCompat.load_ui = Qt.QtCompat.loadUi + + +_install() + +# Setup Binding Enum states +Qt.IsPySide6 = Qt.__binding__ == "PySide6" +Qt.IsPySide2 = Qt.__binding__ == 'PySide2' +Qt.IsPyQt5 = Qt.__binding__ == 'PyQt5' +Qt.IsPySide = Qt.__binding__ == 'PySide' +Qt.IsPyQt4 = Qt.__binding__ == 'PyQt4' + +"""Augment QtCompat + +QtCompat contains wrappers and added functionality +to the original bindings, such as the CLI interface +and otherwise incompatible members between bindings, +such as `QHeaderView.setSectionResizeMode`. + +""" + +Qt.QtCompat._cli = _cli +Qt.QtCompat._convert = _convert + +# Enable command-line interface +if __name__ == "__main__": + _cli(sys.argv[1:]) + + +# The MIT License (MIT) +# +# Copyright (c) 2016-2017 Marcus Ottosson +# +# 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. +# +# In PySide(2), loadUi does not exist, so we implement it +# +# `_UiLoader` is adapted from the qtpy project, which was further influenced +# by qt-helpers which was released under a 3-clause BSD license which in turn +# is based on a solution at: +# +# - https://gist.github.com/cpbotha/1b42a20c8f3eb9bb7cb8 +# +# The License for this code is as follows: +# +# qt-helpers - a common front-end to various Qt modules +# +# Copyright (c) 2015, Chris Beaumont and Thomas Robitaille +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the +# distribution. +# * Neither the name of the Glue project nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +# IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# Which itself was based on the solution at +# +# https://gist.github.com/cpbotha/1b42a20c8f3eb9bb7cb8 +# +# which was released under the MIT license: +# +# Copyright (c) 2011 Sebastian Wiesner +# Modifications by Charl Botha +# +# 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. diff --git a/2023/scripts/animation_tools/studiolibrary/studiovendor/__init__.py b/2023/scripts/animation_tools/studiolibrary/studiovendor/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/2023/scripts/animation_tools/studiolibrary/studiovendor/six.py b/2023/scripts/animation_tools/studiolibrary/studiovendor/six.py new file mode 100644 index 0000000..7aed626 --- /dev/null +++ b/2023/scripts/animation_tools/studiolibrary/studiovendor/six.py @@ -0,0 +1,973 @@ +# Copyright (c) 2010-2018 Benjamin Peterson +# +# 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. + +""" +Utilities for writing code that runs on Python 2 and 3 + +WARNING: THIS VERSION OF SIX HAS BEEN MODIFIED. + +Changed line 658: + + def u(s): + s = s.replace(r'\\', r'\\\\') + if isinstance(s, unicode): + return s + else: + return unicode(s, "unicode_escape") +""" + +from __future__ import absolute_import + +import functools +import itertools +import operator +import sys +import types + +__author__ = "Benjamin Peterson " +__version__ = "1.12.0" + + +# Useful for very coarse version differentiation. +PY2 = sys.version_info[0] == 2 +PY3 = sys.version_info[0] == 3 +PY34 = sys.version_info[0:2] >= (3, 4) + +if PY3: + string_types = str, + integer_types = int, + class_types = type, + text_type = str + binary_type = bytes + + MAXSIZE = sys.maxsize +else: + string_types = basestring, + integer_types = (int, long) + class_types = (type, types.ClassType) + text_type = unicode + binary_type = str + + if sys.platform.startswith("java"): + # Jython always uses 32 bits. + MAXSIZE = int((1 << 31) - 1) + else: + # It's possible to have sizeof(long) != sizeof(Py_ssize_t). + class X(object): + + def __len__(self): + return 1 << 31 + try: + len(X()) + except OverflowError: + # 32-bit + MAXSIZE = int((1 << 31) - 1) + else: + # 64-bit + MAXSIZE = int((1 << 63) - 1) + del X + + +def _add_doc(func, doc): + """Add documentation to a function.""" + func.__doc__ = doc + + +def _import_module(name): + """Import module, returning the module after the last dot.""" + __import__(name) + return sys.modules[name] + + +class _LazyDescr(object): + + def __init__(self, name): + self.name = name + + def __get__(self, obj, tp): + result = self._resolve() + setattr(obj, self.name, result) # Invokes __set__. + try: + # This is a bit ugly, but it avoids running this again by + # removing this descriptor. + delattr(obj.__class__, self.name) + except AttributeError: + pass + return result + + +class MovedModule(_LazyDescr): + + def __init__(self, name, old, new=None): + super(MovedModule, self).__init__(name) + if PY3: + if new is None: + new = name + self.mod = new + else: + self.mod = old + + def _resolve(self): + return _import_module(self.mod) + + def __getattr__(self, attr): + _module = self._resolve() + value = getattr(_module, attr) + setattr(self, attr, value) + return value + + +class _LazyModule(types.ModuleType): + + def __init__(self, name): + super(_LazyModule, self).__init__(name) + self.__doc__ = self.__class__.__doc__ + + def __dir__(self): + attrs = ["__doc__", "__name__"] + attrs += [attr.name for attr in self._moved_attributes] + return attrs + + # Subclasses should override this + _moved_attributes = [] + + +class MovedAttribute(_LazyDescr): + + def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): + super(MovedAttribute, self).__init__(name) + if PY3: + if new_mod is None: + new_mod = name + self.mod = new_mod + if new_attr is None: + if old_attr is None: + new_attr = name + else: + new_attr = old_attr + self.attr = new_attr + else: + self.mod = old_mod + if old_attr is None: + old_attr = name + self.attr = old_attr + + def _resolve(self): + module = _import_module(self.mod) + return getattr(module, self.attr) + + +class _SixMetaPathImporter(object): + + """ + A meta path importer to import six.moves and its submodules. + + This class implements a PEP302 finder and loader. It should be compatible + with Python 2.5 and all existing versions of Python3 + """ + + def __init__(self, six_module_name): + self.name = six_module_name + self.known_modules = {} + + def _add_module(self, mod, *fullnames): + for fullname in fullnames: + self.known_modules[self.name + "." + fullname] = mod + + def _get_module(self, fullname): + return self.known_modules[self.name + "." + fullname] + + def find_module(self, fullname, path=None): + if fullname in self.known_modules: + return self + return None + + def __get_module(self, fullname): + try: + return self.known_modules[fullname] + except KeyError: + raise ImportError("This loader does not know module " + fullname) + + def load_module(self, fullname): + try: + # in case of a reload + return sys.modules[fullname] + except KeyError: + pass + mod = self.__get_module(fullname) + if isinstance(mod, MovedModule): + mod = mod._resolve() + else: + mod.__loader__ = self + sys.modules[fullname] = mod + return mod + + def is_package(self, fullname): + """ + Return true, if the named module is a package. + + We need this method to get correct spec objects with + Python 3.4 (see PEP451) + """ + return hasattr(self.__get_module(fullname), "__path__") + + def get_code(self, fullname): + """Return None + + Required, if is_package is implemented""" + self.__get_module(fullname) # eventually raises ImportError + return None + get_source = get_code # same as get_code + +_importer = _SixMetaPathImporter(__name__) + + +class _MovedItems(_LazyModule): + + """Lazy loading of moved objects""" + __path__ = [] # mark as package + + +_moved_attributes = [ + MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), + MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), + MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"), + MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), + MovedAttribute("intern", "__builtin__", "sys"), + MovedAttribute("map", "itertools", "builtins", "imap", "map"), + MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"), + MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"), + MovedAttribute("getoutput", "commands", "subprocess"), + MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"), + MovedAttribute("reduce", "__builtin__", "functools"), + MovedAttribute("shlex_quote", "pipes", "shlex", "quote"), + MovedAttribute("StringIO", "StringIO", "io"), + MovedAttribute("UserDict", "UserDict", "collections"), + MovedAttribute("UserList", "UserList", "collections"), + MovedAttribute("UserString", "UserString", "collections"), + MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), + MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"), + MovedModule("builtins", "__builtin__"), + MovedModule("configparser", "ConfigParser"), + MovedModule("copyreg", "copy_reg"), + MovedModule("dbm_gnu", "gdbm", "dbm.gnu"), + MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"), + MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), + MovedModule("http_cookies", "Cookie", "http.cookies"), + MovedModule("html_entities", "htmlentitydefs", "html.entities"), + MovedModule("html_parser", "HTMLParser", "html.parser"), + MovedModule("http_client", "httplib", "http.client"), + MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), + MovedModule("email_mime_image", "email.MIMEImage", "email.mime.image"), + MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), + MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"), + MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), + MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), + MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), + MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), + MovedModule("cPickle", "cPickle", "pickle"), + MovedModule("queue", "Queue"), + MovedModule("reprlib", "repr"), + MovedModule("socketserver", "SocketServer"), + MovedModule("_thread", "thread", "_thread"), + MovedModule("tkinter", "Tkinter"), + MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), + MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), + MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), + MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), + MovedModule("tkinter_tix", "Tix", "tkinter.tix"), + MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"), + MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), + MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), + MovedModule("tkinter_colorchooser", "tkColorChooser", + "tkinter.colorchooser"), + MovedModule("tkinter_commondialog", "tkCommonDialog", + "tkinter.commondialog"), + MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), + MovedModule("tkinter_font", "tkFont", "tkinter.font"), + MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), + MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", + "tkinter.simpledialog"), + MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"), + MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"), + MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"), + MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), + MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"), + MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"), +] +# Add windows specific modules. +if sys.platform == "win32": + _moved_attributes += [ + MovedModule("winreg", "_winreg"), + ] + +for attr in _moved_attributes: + setattr(_MovedItems, attr.name, attr) + if isinstance(attr, MovedModule): + _importer._add_module(attr, "moves." + attr.name) +del attr + +_MovedItems._moved_attributes = _moved_attributes + +moves = _MovedItems(__name__ + ".moves") +_importer._add_module(moves, "moves") + + +class Module_six_moves_urllib_parse(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_parse""" + + +_urllib_parse_moved_attributes = [ + MovedAttribute("ParseResult", "urlparse", "urllib.parse"), + MovedAttribute("SplitResult", "urlparse", "urllib.parse"), + MovedAttribute("parse_qs", "urlparse", "urllib.parse"), + MovedAttribute("parse_qsl", "urlparse", "urllib.parse"), + MovedAttribute("urldefrag", "urlparse", "urllib.parse"), + MovedAttribute("urljoin", "urlparse", "urllib.parse"), + MovedAttribute("urlparse", "urlparse", "urllib.parse"), + MovedAttribute("urlsplit", "urlparse", "urllib.parse"), + MovedAttribute("urlunparse", "urlparse", "urllib.parse"), + MovedAttribute("urlunsplit", "urlparse", "urllib.parse"), + MovedAttribute("quote", "urllib", "urllib.parse"), + MovedAttribute("quote_plus", "urllib", "urllib.parse"), + MovedAttribute("unquote", "urllib", "urllib.parse"), + MovedAttribute("unquote_plus", "urllib", "urllib.parse"), + MovedAttribute("unquote_to_bytes", "urllib", "urllib.parse", "unquote", "unquote_to_bytes"), + MovedAttribute("urlencode", "urllib", "urllib.parse"), + MovedAttribute("splitquery", "urllib", "urllib.parse"), + MovedAttribute("splittag", "urllib", "urllib.parse"), + MovedAttribute("splituser", "urllib", "urllib.parse"), + MovedAttribute("splitvalue", "urllib", "urllib.parse"), + MovedAttribute("uses_fragment", "urlparse", "urllib.parse"), + MovedAttribute("uses_netloc", "urlparse", "urllib.parse"), + MovedAttribute("uses_params", "urlparse", "urllib.parse"), + MovedAttribute("uses_query", "urlparse", "urllib.parse"), + MovedAttribute("uses_relative", "urlparse", "urllib.parse"), +] +for attr in _urllib_parse_moved_attributes: + setattr(Module_six_moves_urllib_parse, attr.name, attr) +del attr + +Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes + +_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"), + "moves.urllib_parse", "moves.urllib.parse") + + +class Module_six_moves_urllib_error(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_error""" + + +_urllib_error_moved_attributes = [ + MovedAttribute("URLError", "urllib2", "urllib.error"), + MovedAttribute("HTTPError", "urllib2", "urllib.error"), + MovedAttribute("ContentTooShortError", "urllib", "urllib.error"), +] +for attr in _urllib_error_moved_attributes: + setattr(Module_six_moves_urllib_error, attr.name, attr) +del attr + +Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes + +_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"), + "moves.urllib_error", "moves.urllib.error") + + +class Module_six_moves_urllib_request(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_request""" + + +_urllib_request_moved_attributes = [ + MovedAttribute("urlopen", "urllib2", "urllib.request"), + MovedAttribute("install_opener", "urllib2", "urllib.request"), + MovedAttribute("build_opener", "urllib2", "urllib.request"), + MovedAttribute("pathname2url", "urllib", "urllib.request"), + MovedAttribute("url2pathname", "urllib", "urllib.request"), + MovedAttribute("getproxies", "urllib", "urllib.request"), + MovedAttribute("Request", "urllib2", "urllib.request"), + MovedAttribute("OpenerDirector", "urllib2", "urllib.request"), + MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"), + MovedAttribute("ProxyHandler", "urllib2", "urllib.request"), + MovedAttribute("BaseHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"), + MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"), + MovedAttribute("FileHandler", "urllib2", "urllib.request"), + MovedAttribute("FTPHandler", "urllib2", "urllib.request"), + MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"), + MovedAttribute("UnknownHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"), + MovedAttribute("urlretrieve", "urllib", "urllib.request"), + MovedAttribute("urlcleanup", "urllib", "urllib.request"), + MovedAttribute("URLopener", "urllib", "urllib.request"), + MovedAttribute("FancyURLopener", "urllib", "urllib.request"), + MovedAttribute("proxy_bypass", "urllib", "urllib.request"), + MovedAttribute("parse_http_list", "urllib2", "urllib.request"), + MovedAttribute("parse_keqv_list", "urllib2", "urllib.request"), +] +for attr in _urllib_request_moved_attributes: + setattr(Module_six_moves_urllib_request, attr.name, attr) +del attr + +Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes + +_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"), + "moves.urllib_request", "moves.urllib.request") + + +class Module_six_moves_urllib_response(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_response""" + + +_urllib_response_moved_attributes = [ + MovedAttribute("addbase", "urllib", "urllib.response"), + MovedAttribute("addclosehook", "urllib", "urllib.response"), + MovedAttribute("addinfo", "urllib", "urllib.response"), + MovedAttribute("addinfourl", "urllib", "urllib.response"), +] +for attr in _urllib_response_moved_attributes: + setattr(Module_six_moves_urllib_response, attr.name, attr) +del attr + +Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes + +_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"), + "moves.urllib_response", "moves.urllib.response") + + +class Module_six_moves_urllib_robotparser(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_robotparser""" + + +_urllib_robotparser_moved_attributes = [ + MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"), +] +for attr in _urllib_robotparser_moved_attributes: + setattr(Module_six_moves_urllib_robotparser, attr.name, attr) +del attr + +Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes + +_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"), + "moves.urllib_robotparser", "moves.urllib.robotparser") + + +class Module_six_moves_urllib(types.ModuleType): + + """Create a six.moves.urllib namespace that resembles the Python 3 namespace""" + __path__ = [] # mark as package + parse = _importer._get_module("moves.urllib_parse") + error = _importer._get_module("moves.urllib_error") + request = _importer._get_module("moves.urllib_request") + response = _importer._get_module("moves.urllib_response") + robotparser = _importer._get_module("moves.urllib_robotparser") + + def __dir__(self): + return ['parse', 'error', 'request', 'response', 'robotparser'] + +_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"), + "moves.urllib") + + +def add_move(move): + """Add an item to six.moves.""" + setattr(_MovedItems, move.name, move) + + +def remove_move(name): + """Remove item from six.moves.""" + try: + delattr(_MovedItems, name) + except AttributeError: + try: + del moves.__dict__[name] + except KeyError: + raise AttributeError("no such move, %r" % (name,)) + + +if PY3: + _meth_func = "__func__" + _meth_self = "__self__" + + _func_closure = "__closure__" + _func_code = "__code__" + _func_defaults = "__defaults__" + _func_globals = "__globals__" +else: + _meth_func = "im_func" + _meth_self = "im_self" + + _func_closure = "func_closure" + _func_code = "func_code" + _func_defaults = "func_defaults" + _func_globals = "func_globals" + + +try: + advance_iterator = next +except NameError: + def advance_iterator(it): + return it.next() +next = advance_iterator + + +try: + callable = callable +except NameError: + def callable(obj): + return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) + + +if PY3: + def get_unbound_function(unbound): + return unbound + + create_bound_method = types.MethodType + + def create_unbound_method(func, cls): + return func + + Iterator = object +else: + def get_unbound_function(unbound): + return unbound.im_func + + def create_bound_method(func, obj): + return types.MethodType(func, obj, obj.__class__) + + def create_unbound_method(func, cls): + return types.MethodType(func, None, cls) + + class Iterator(object): + + def next(self): + return type(self).__next__(self) + + callable = callable +_add_doc(get_unbound_function, + """Get the function out of a possibly unbound function""") + + +get_method_function = operator.attrgetter(_meth_func) +get_method_self = operator.attrgetter(_meth_self) +get_function_closure = operator.attrgetter(_func_closure) +get_function_code = operator.attrgetter(_func_code) +get_function_defaults = operator.attrgetter(_func_defaults) +get_function_globals = operator.attrgetter(_func_globals) + + +if PY3: + def iterkeys(d, **kw): + return iter(d.keys(**kw)) + + def itervalues(d, **kw): + return iter(d.values(**kw)) + + def iteritems(d, **kw): + return iter(d.items(**kw)) + + def iterlists(d, **kw): + return iter(d.lists(**kw)) + + viewkeys = operator.methodcaller("keys") + + viewvalues = operator.methodcaller("values") + + viewitems = operator.methodcaller("items") +else: + def iterkeys(d, **kw): + return d.iterkeys(**kw) + + def itervalues(d, **kw): + return d.itervalues(**kw) + + def iteritems(d, **kw): + return d.iteritems(**kw) + + def iterlists(d, **kw): + return d.iterlists(**kw) + + viewkeys = operator.methodcaller("viewkeys") + + viewvalues = operator.methodcaller("viewvalues") + + viewitems = operator.methodcaller("viewitems") + +_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.") +_add_doc(itervalues, "Return an iterator over the values of a dictionary.") +_add_doc(iteritems, + "Return an iterator over the (key, value) pairs of a dictionary.") +_add_doc(iterlists, + "Return an iterator over the (key, [values]) pairs of a dictionary.") + + +if PY3: + def b(s): + return s.encode("latin-1") + + def u(s, encoding=None): + return str(s) + unichr = chr + import struct + int2byte = struct.Struct(">B").pack + del struct + byte2int = operator.itemgetter(0) + indexbytes = operator.getitem + iterbytes = iter + import io + StringIO = io.StringIO + BytesIO = io.BytesIO + _assertCountEqual = "assertCountEqual" + if sys.version_info[1] <= 1: + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" + else: + _assertRaisesRegex = "assertRaisesRegex" + _assertRegex = "assertRegex" +else: + def b(s): + return s + # Workaround for standalone backslash + + def u(s, encoding="unicode_escape"): + + if not isinstance(s, basestring): + s = unicode(s, encoding) + + s = s.replace(r'\\', r'\\\\') + if isinstance(s, unicode): + return s + else: + return unicode(s, encoding) + unichr = unichr + int2byte = chr + + def byte2int(bs): + return ord(bs[0]) + + def indexbytes(buf, i): + return ord(buf[i]) + iterbytes = functools.partial(itertools.imap, ord) + import StringIO + StringIO = BytesIO = StringIO.StringIO + _assertCountEqual = "assertItemsEqual" + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" +_add_doc(b, """Byte literal""") +_add_doc(u, """Text literal""") + + +def assertCountEqual(self, *args, **kwargs): + return getattr(self, _assertCountEqual)(*args, **kwargs) + + +def assertRaisesRegex(self, *args, **kwargs): + return getattr(self, _assertRaisesRegex)(*args, **kwargs) + + +def assertRegex(self, *args, **kwargs): + return getattr(self, _assertRegex)(*args, **kwargs) + + +if PY3: + exec_ = getattr(moves.builtins, "exec") + + def reraise(tp, value, tb=None): + try: + if value is None: + value = tp() + if value.__traceback__ is not tb: + raise value.with_traceback(tb) + raise value + finally: + value = None + tb = None + +else: + def exec_(_code_, _globs_=None, _locs_=None): + """Execute code in a namespace.""" + if _globs_ is None: + frame = sys._getframe(1) + _globs_ = frame.f_globals + if _locs_ is None: + _locs_ = frame.f_locals + del frame + elif _locs_ is None: + _locs_ = _globs_ + exec("""exec _code_ in _globs_, _locs_""") + + exec_("""def reraise(tp, value, tb=None): + try: + raise tp, value, tb + finally: + tb = None +""") + + +if sys.version_info[:2] == (3, 2): + exec_("""def raise_from(value, from_value): + try: + if from_value is None: + raise value + raise value from from_value + finally: + value = None +""") +elif sys.version_info[:2] > (3, 2): + exec_("""def raise_from(value, from_value): + try: + raise value from from_value + finally: + value = None +""") +else: + def raise_from(value, from_value): + raise value + + +print_ = getattr(moves.builtins, "print", None) +if print_ is None: + def print_(*args, **kwargs): + """The new-style print function for Python 2.4 and 2.5.""" + fp = kwargs.pop("file", sys.stdout) + if fp is None: + return + + def write(data): + if not isinstance(data, basestring): + data = str(data) + # If the file has an encoding, encode unicode with it. + if (isinstance(fp, file) and + isinstance(data, unicode) and + fp.encoding is not None): + errors = getattr(fp, "errors", None) + if errors is None: + errors = "strict" + data = data.encode(fp.encoding, errors) + fp.write(data) + want_unicode = False + sep = kwargs.pop("sep", None) + if sep is not None: + if isinstance(sep, unicode): + want_unicode = True + elif not isinstance(sep, str): + raise TypeError("sep must be None or a string") + end = kwargs.pop("end", None) + if end is not None: + if isinstance(end, unicode): + want_unicode = True + elif not isinstance(end, str): + raise TypeError("end must be None or a string") + if kwargs: + raise TypeError("invalid keyword arguments to print()") + if not want_unicode: + for arg in args: + if isinstance(arg, unicode): + want_unicode = True + break + if want_unicode: + newline = unicode("\n") + space = unicode(" ") + else: + newline = "\n" + space = " " + if sep is None: + sep = space + if end is None: + end = newline + for i, arg in enumerate(args): + if i: + write(sep) + write(arg) + write(end) +if sys.version_info[:2] < (3, 3): + _print = print_ + + def print_(*args, **kwargs): + fp = kwargs.get("file", sys.stdout) + flush = kwargs.pop("flush", False) + _print(*args, **kwargs) + if flush and fp is not None: + fp.flush() + +_add_doc(reraise, """Reraise an exception.""") + +if sys.version_info[0:2] < (3, 4): + def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS, + updated=functools.WRAPPER_UPDATES): + def wrapper(f): + f = functools.wraps(wrapped, assigned, updated)(f) + f.__wrapped__ = wrapped + return f + return wrapper +else: + wraps = functools.wraps + + +def with_metaclass(meta, *bases): + """Create a base class with a metaclass.""" + # This requires a bit of explanation: the basic idea is to make a dummy + # metaclass for one level of class instantiation that replaces itself with + # the actual metaclass. + class metaclass(type): + + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + + @classmethod + def __prepare__(cls, name, this_bases): + return meta.__prepare__(name, bases) + return type.__new__(metaclass, 'temporary_class', (), {}) + + +def add_metaclass(metaclass): + """Class decorator for creating a class with a metaclass.""" + def wrapper(cls): + orig_vars = cls.__dict__.copy() + slots = orig_vars.get('__slots__') + if slots is not None: + if isinstance(slots, str): + slots = [slots] + for slots_var in slots: + orig_vars.pop(slots_var) + orig_vars.pop('__dict__', None) + orig_vars.pop('__weakref__', None) + if hasattr(cls, '__qualname__'): + orig_vars['__qualname__'] = cls.__qualname__ + return metaclass(cls.__name__, cls.__bases__, orig_vars) + return wrapper + + +def ensure_binary(s, encoding='utf-8', errors='strict'): + """Coerce **s** to six.binary_type. + + For Python 2: + - `unicode` -> encoded to `str` + - `str` -> `str` + + For Python 3: + - `str` -> encoded to `bytes` + - `bytes` -> `bytes` + """ + if isinstance(s, text_type): + return s.encode(encoding, errors) + elif isinstance(s, binary_type): + return s + else: + raise TypeError("not expecting type '%s'" % type(s)) + + +def ensure_str(s, encoding='utf-8', errors='strict'): + """Coerce *s* to `str`. + + For Python 2: + - `unicode` -> encoded to `str` + - `str` -> `str` + + For Python 3: + - `str` -> `str` + - `bytes` -> decoded to `str` + """ + if not isinstance(s, (text_type, binary_type)): + raise TypeError("not expecting type '%s'" % type(s)) + if PY2 and isinstance(s, text_type): + s = s.encode(encoding, errors) + elif PY3 and isinstance(s, binary_type): + s = s.decode(encoding, errors) + return s + + +def ensure_text(s, encoding='utf-8', errors='strict'): + """Coerce *s* to six.text_type. + + For Python 2: + - `unicode` -> `unicode` + - `str` -> `unicode` + + For Python 3: + - `str` -> `str` + - `bytes` -> decoded to `str` + """ + if isinstance(s, binary_type): + return s.decode(encoding, errors) + elif isinstance(s, text_type): + return s + else: + raise TypeError("not expecting type '%s'" % type(s)) + + + +def python_2_unicode_compatible(klass): + """ + A decorator that defines __unicode__ and __str__ methods under Python 2. + Under Python 3 it does nothing. + + To support Python 2 and 3 with a single code base, define a __str__ method + returning text and apply this decorator to the class. + """ + if PY2: + if '__str__' not in klass.__dict__: + raise ValueError("@python_2_unicode_compatible cannot be applied " + "to %s because it doesn't define __str__()." % + klass.__name__) + klass.__unicode__ = klass.__str__ + klass.__str__ = lambda self: self.__unicode__().encode('utf-8') + return klass + + +# Complete the moves implementation. +# This code is at the end of this module to speed up module loading. +# Turn this module into a package. +__path__ = [] # required for PEP 302 and PEP 451 +__package__ = __name__ # see PEP 366 @ReservedAssignment +if globals().get("__spec__") is not None: + __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable +# Remove other six meta path importers, since they cause problems. This can +# happen if six is removed from sys.modules and then reloaded. (Setuptools does +# this for some reason.) +if sys.meta_path: + for i, importer in enumerate(sys.meta_path): + # Here's some real nastiness: Another "instance" of the six module might + # be floating around. Therefore, we can't use isinstance() to check for + # the six meta path importer, since the other six instance will have + # inserted an importer with different class. + if (type(importer).__name__ == "_SixMetaPathImporter" and + importer.name == __name__): + del sys.meta_path[i] + break + del i, importer +# Finally, add the importer to the meta path import hook. +sys.meta_path.append(_importer) diff --git a/2023/shelves/shelf_Nexus_Animation.mel b/2023/shelves/shelf_Nexus_Animation.mel index c4b9d9f..08480b7 100644 --- a/2023/shelves/shelf_Nexus_Animation.mel +++ b/2023/shelves/shelf_Nexus_Animation.mel @@ -144,5 +144,40 @@ global proc shelf_Nexus_Animation () { -commandRepeatable 1 -flat 1 ; + shelfButton + -enableCommandRepeat 1 + -flexibleWidthType 3 + -flexibleWidthValue 32 + -enable 1 + -width 35 + -height 34 + -manage 1 + -visible 1 + -preventOverride 0 + -annotation "Studio Library - Animation library for Maya" + -enableBackground 0 + -backgroundColor 0 0 0 + -highlightColor 0.321569 0.521569 0.65098 + -align "center" + -label "StudioLib" + -labelOffset 0 + -rotation 0 + -flipX 0 + -flipY 0 + -useAlpha 1 + -font "plainLabelFont" + -imageOverlayLabel "StudioLib" + -overlayLabelColor 0.8 0.8 0.8 + -overlayLabelBackColor 0 0 0 0.5 + -image "studiolibrary.png" + -image1 "studiolibrary.png" + -style "iconOnly" + -marginWidth 0 + -marginHeight 1 + -command "import sys\nimport os\nstudiolibrary_path = r'h:\\Workspace\\Raw\\Tools\\Plugins\\Maya\\2023\\scripts\\animation_tools\\studiolibrary'\nif studiolibrary_path not in sys.path:\n sys.path.insert(0, studiolibrary_path)\nimport studiolibrary\nstudiolibrary.main()" + -sourceType "python" + -commandRepeatable 1 + -flat 1 + ; }