class mjEyelidComponentGuide(mjEyelidComponent): """Eyelid Component Guide""" def __init__(self, name='mjEyelid', parent=None): Profiler.getInstance().push("Construct Eyelid Guide Component:" + name) super(mjEyelidComponentGuide, self).__init__(name, parent) # ========= # Attributes // Create Attributes Controls. # ========= guideUpSettingsAttrGrp = AttributeGroup("Eyelid Up", parent=self) guideLowSettingsAttrGrp = AttributeGroup("Eyelid Low", parent=self) self.numUpDeformersAttr = IntegerAttribute( 'Num Deformers', value=10, minValue=1, maxValue=50, parent=guideUpSettingsAttrGrp) self.upMedialFactorAttr = ScalarAttribute( 'Medial Blink Factor', value=0.25, minValue=0, maxValue=1, parent=guideUpSettingsAttrGrp) self.upLateralFactorAttr = ScalarAttribute( 'Lateral Blink Factor', value=0.65, minValue=0, maxValue=1, parent=guideUpSettingsAttrGrp) self.numLowDeformersAttr = IntegerAttribute( 'Num Deformers', value=10, minValue=1, maxValue=50, parent=guideLowSettingsAttrGrp) self.lowMedialFactorAttr = ScalarAttribute( 'Medial Blink Factor', value=0.25, minValue=0, maxValue=1, parent=guideLowSettingsAttrGrp) self.lowLateralFactorAttr = ScalarAttribute( 'Lateral Blink Factor', value=0.65, minValue=0, maxValue=1, parent=guideLowSettingsAttrGrp) self.numUpDeformersAttr.setValueChangeCallback( self.updateNumUpDeformers) self.numLowDeformersAttr.setValueChangeCallback( self.updateNumLowDeformers) # ========= # Controls // Create the Guide Controls, Name them, give them a shape, a color and scale it. # ========= self.eyeballCtrl = Control('eyeball', parent=self.ctrlCmpGrp, shape="sphere") self.eyeballCtrl.scalePoints(Vec3(0.35, 0.35, 0.35)) self.eyeballCtrl.setColor("red") self.lidMedialCtrl = Control('lidMedial', parent=self.eyeballCtrl, shape="sphere") self.lidMedialCtrl.scalePoints(Vec3(0.025, 0.025, 0.025)) self.lidMedialCtrl.setColor("peach") self.lidLateralCtrl = Control('lidLateral', parent=self.eyeballCtrl, shape="sphere") self.lidLateralCtrl.scalePoints(Vec3(0.025, 0.025, 0.025)) self.lidLateralCtrl.setColor("peach") self.lidUpCtrl = Control('lidUp', parent=self.eyeballCtrl, shape="sphere") self.lidUpCtrl.scalePoints(Vec3(0.025, 0.025, 0.025)) self.lidUpCtrl.setColor("peach") self.lidUpMedialCtrl = Control('lidUpMedial', parent=self.eyeballCtrl, shape="sphere") self.lidUpMedialCtrl.scalePoints(Vec3(0.025, 0.025, 0.025)) self.lidUpMedialCtrl.setColor("peach") self.lidUpLateralCtrl = Control('lidUpLateral', parent=self.eyeballCtrl, shape="sphere") self.lidUpLateralCtrl.scalePoints(Vec3(0.025, 0.025, 0.025)) self.lidUpLateralCtrl.setColor("peach") self.lidLowCtrl = Control('lidLow', parent=self.eyeballCtrl, shape="sphere") self.lidLowCtrl.scalePoints(Vec3(0.025, 0.025, 0.025)) self.lidLowCtrl.setColor("peach") self.lidLowMedialCtrl = Control('lidLowMedial', parent=self.eyeballCtrl, shape="sphere") self.lidLowMedialCtrl.scalePoints(Vec3(0.025, 0.025, 0.025)) self.lidLowMedialCtrl.setColor("peach") self.lidLowLateralCtrl = Control('lidLowLateral', parent=self.eyeballCtrl, shape="sphere") self.lidLowLateralCtrl.scalePoints(Vec3(0.025, 0.025, 0.025)) self.lidLowLateralCtrl.setColor("peach") # =============== # Add Debug Splice Ops # =============== # Add Lid Up Canvas Op self.debugLidUpCanvasOp = CanvasOperator( 'Debug_Canvas_Eyelid_Up_Op', 'MJCG.Solvers.mjEyelidDebugSolver') self.addOperator(self.debugLidUpCanvasOp) # Add Attributes Inputs self.debugLidUpCanvasOp.setInput('drawDebug', self.drawDebugInputAttr) self.debugLidUpCanvasOp.setInput('rigScale', self.rigScaleInputAttr) self.debugLidUpCanvasOp.setInput('Deformer_Count', self.numUpDeformersInputAttr) # Add Xfo Inputs self.debugLidUpCanvasOp.setInput('Eye_Center', self.eyeballCtrl) self.debugLidUpCanvasOp.setInput('Lid_Medial', self.lidMedialCtrl) self.debugLidUpCanvasOp.setInput('Lid_MedialCen', self.lidUpMedialCtrl) self.debugLidUpCanvasOp.setInput('Lid_Center_Ref', self.lidUpCtrl) self.debugLidUpCanvasOp.setInput('Lid_Center_Ctrl', self.lidUpCtrl) self.debugLidUpCanvasOp.setInput('Lid_LateralCen', self.lidUpLateralCtrl) self.debugLidUpCanvasOp.setInput('Lid_Lateral', self.lidLateralCtrl) # Add Xfo Outputs self.debugLidUpCanvasOp.setOutput('result', self.eyelidUpOutput.getTarget()) # Add Lid Low Canvas Op self.debugLidLowCanvasOp = CanvasOperator( 'Debug_Canvas_Eyelid_Low_Op', 'MJCG.Solvers.mjEyelidDebugSolver') self.addOperator(self.debugLidLowCanvasOp) # Add Attributes Inputs self.debugLidLowCanvasOp.setInput('drawDebug', self.drawDebugInputAttr) self.debugLidLowCanvasOp.setInput('rigScale', self.rigScaleInputAttr) self.debugLidLowCanvasOp.setInput('Deformer_Count', self.numLowDeformersInputAttr) # Add Xfo Inputs self.debugLidLowCanvasOp.setInput('Eye_Center', self.eyeballCtrl) self.debugLidLowCanvasOp.setInput('Lid_Medial', self.lidMedialCtrl) self.debugLidLowCanvasOp.setInput('Lid_MedialCen', self.lidLowMedialCtrl) self.debugLidLowCanvasOp.setInput('Lid_Center_Ref', self.lidLowCtrl) self.debugLidLowCanvasOp.setInput('Lid_Center_Ctrl', self.lidLowCtrl) self.debugLidLowCanvasOp.setInput('Lid_LateralCen', self.lidLowLateralCtrl) self.debugLidLowCanvasOp.setInput('Lid_Lateral', self.lidLateralCtrl) # Add Xfo Outputs self.debugLidLowCanvasOp.setOutput('result', self.eyelidLowOutput.getTarget()) # ========= # Position Data // Get the Guide Controls Position data, else set them at their initial position. # ========= self.default_data = { "name": name, "location": "L", "eyeballXfo": Xfo(Vec3(0.322, 15.500, 0.390)), "lidMedialXfo": Xfo(Vec3(0.168, 15.445, 0.520)), "lidLateralXfo": Xfo(Vec3(0.465, 15.47, 0.465)), "lidUpXfo": Xfo(Vec3(0.322, 15.585, 0.605)), "lidUpMedialXfo": Xfo(Vec3(0.203, 15.515, 0.525)), "lidUpLateralXfo": Xfo(Vec3(0.432, 15.55, 0.538)), "lidLowXfo": Xfo(Vec3(0.322, 15.434, 0.6)), "lidLowMedialXfo": Xfo(Vec3(0.24, 15.45, 0.513)), "lidLowLateralXfo": Xfo(Vec3(0.413, 15.44, 0.525)), "lidUpMedialBlink": self.upMedialFactorAttr.getValue(), "lidUpLateralBlink": self.upLateralFactorAttr.getValue(), "lidLowMedialBlink": self.lowMedialFactorAttr.getValue(), "lidLowLateralBlink": self.lowLateralFactorAttr.getValue(), "numUpDeformers": self.numUpDeformersAttr.getValue(), "numLowDeformers": self.numLowDeformersAttr.getValue(), } self.loadData(self.default_data) Profiler.getInstance().pop() # ========== # Callbacks # ========== def updateNumUpDeformers(self, countUp): if countUp == 0: raise IndexError("'count' must be > 0") #Lip Up lidUpOutputs = self.eyelidUpOutput.getTarget() if countUp > len(lidUpOutputs): for i in xrange(len(lidUpOutputs), countUp): debugUpCtrl = Control('Lid_Up_' + str(i + 1).zfill(2), parent=self.outputHrcGrp, shape="sphere") debugUpCtrl.rotatePoints(90, -90, 180) debugUpCtrl.scalePoints(Vec3(0.01, 0.01, 0.01)) debugUpCtrl.setColor("yellowLight") lidUpOutputs.append(debugUpCtrl) elif countUp < len(lidUpOutputs): numExtraUpCtrls = len(lidUpOutputs) - countUp for i in xrange(numExtraUpCtrls): extraUpCtrl = lidUpOutputs.pop() self.outputHrcGrp.removeChild(extraUpCtrl) return True def updateNumLowDeformers(self, countLow): if countLow == 0: raise IndexError("'count' must be > 0") #Lip Low lidLowOutputs = self.eyelidLowOutput.getTarget() if countLow > len(lidLowOutputs): for i in xrange(len(lidLowOutputs), countLow): debugLowCtrl = Control('Lid_Low_' + str(i + 1).zfill(2), parent=self.outputHrcGrp, shape="sphere") debugLowCtrl.rotatePoints(90, -90, 180) debugLowCtrl.scalePoints(Vec3(0.01, 0.01, 0.01)) debugLowCtrl.setColor("yellowLight") lidLowOutputs.append(debugLowCtrl) elif countLow < len(lidLowOutputs): numExtraLowCtrls = len(lidLowOutputs) - countLow for i in xrange(numExtraLowCtrls): extraLowCtrl = lidLowOutputs.pop() self.outputHrcGrp.removeChild(extraLowCtrl) return True # ============= # Data Methods # ============= def saveData(self): data = super(mjEyelidComponentGuide, self).saveData() data['eyeballXfo'] = self.eyeballCtrl.xfo data['lidMedialXfo'] = self.lidMedialCtrl.xfo data['lidLateralXfo'] = self.lidLateralCtrl.xfo data['lidUpXfo'] = self.lidUpCtrl.xfo data['lidUpMedialXfo'] = self.lidUpMedialCtrl.xfo data['lidUpLateralXfo'] = self.lidUpLateralCtrl.xfo data['lidLowXfo'] = self.lidLowCtrl.xfo data['lidLowMedialXfo'] = self.lidLowMedialCtrl.xfo data['lidLowLateralXfo'] = self.lidLowLateralCtrl.xfo data['numUpDeformers'] = self.numUpDeformersAttr.getValue() data['numLowDeformers'] = self.numLowDeformersAttr.getValue() data['lidUpMedialBlink'] = self.upMedialFactorAttr.getValue() data['lidUpLateralBlink'] = self.upLateralFactorAttr.getValue() data['lidLowMedialBlink'] = self.lowMedialFactorAttr.getValue() data['lidLowLateralBlink'] = self.lowLateralFactorAttr.getValue() return data def loadData(self, data): super(mjEyelidComponentGuide, self).loadData(data) self.eyeballCtrl.xfo = data['eyeballXfo'] self.lidMedialCtrl.xfo = data['lidMedialXfo'] self.lidLateralCtrl.xfo = data['lidLateralXfo'] self.lidUpCtrl.xfo = data['lidUpXfo'] self.lidUpMedialCtrl.xfo = data['lidUpMedialXfo'] self.lidUpLateralCtrl.xfo = data['lidUpLateralXfo'] self.lidLowCtrl.xfo = data['lidLowXfo'] self.lidLowMedialCtrl.xfo = data['lidLowMedialXfo'] self.lidLowLateralCtrl.xfo = data['lidLowLateralXfo'] self.numUpDeformersAttr.setValue(data["numUpDeformers"]) self.numLowDeformersAttr.setValue(data["numLowDeformers"]) self.numUpDeformersInputAttr.setValue(data["numUpDeformers"]) self.numLowDeformersInputAttr.setValue(data["numLowDeformers"]) self.upMedialFactorInputAttr.setValue(data['lidUpMedialBlink']) self.upLateralFactorInputAttr.setValue(data['lidUpLateralBlink']) self.lowMedialFactorInputAttr.setValue(data['lidLowMedialBlink']) self.lowLateralFactorInputAttr.setValue(data['lidLowLateralBlink']) self.debugLidUpCanvasOp.evaluate() self.debugLidLowCanvasOp.evaluate() return True def getRigBuildData(self): data = super(mjEyelidComponentGuide, self).getRigBuildData() eyeballPosition = self.eyeballCtrl.xfo.tr eyeballOriXfo = Xfo() eyeballOriXfo.tr = eyeballPosition eyeballOriOffset = Quat(Vec3(0.0, 0.894, 0.0), -0.448) if self.getLocation() == "R": eyeballOriXfo.ori.subtract(eyeballOriOffset) data['eyeballXfo'] = eyeballOriXfo eyelidUpVOffset = Vec3(0.0, 0.2, 0.0) eyelidUpVXfo = Xfo() eyelidUpVXfo.tr = eyeballPosition.add(eyelidUpVOffset) data['eyelidUpVXfo'] = eyelidUpVXfo data['lidMedialXfo'] = self.lidMedialCtrl.xfo data['lidLateralXfo'] = self.lidLateralCtrl.xfo data['lidUpXfo'] = self.lidUpCtrl.xfo data['lidUpMedialXfo'] = self.lidUpMedialCtrl.xfo data['lidUpLateralXfo'] = self.lidUpLateralCtrl.xfo data['lidLowXfo'] = self.lidLowCtrl.xfo data['lidLowMedialXfo'] = self.lidLowMedialCtrl.xfo data['lidLowLateralXfo'] = self.lidLowLateralCtrl.xfo data['numUpDeformers'] = self.numUpDeformersAttr.getValue() data['numLowDeformers'] = self.numLowDeformersAttr.getValue() data['lidUpMedialBlink'] = self.upMedialFactorAttr.getValue() data['lidUpLateralBlink'] = self.upLateralFactorAttr.getValue() data['lidLowMedialBlink'] = self.lowMedialFactorAttr.getValue() data['lidLowLateralBlink'] = self.lowLateralFactorAttr.getValue() return data # ============== # Class Methods # ============== @classmethod def getComponentType(cls): return 'Guide' @classmethod def getRigComponentClass(cls): return mjEyelidComponentRig
class SimpleControlComponentGuide(SimpleControlComponent): """Simple Control Component Guide""" def __init__(self, name='SimpleControl', parent=None): Profiler.getInstance().push( "Construct Simple Control Guide Component:" + name) super(SimpleControlComponentGuide, self).__init__(name, parent) # ========= # Attributes # ========= # Add Component Params to IK control guideSettingsAttrGrp = AttributeGroup("GuideSettings", parent=self) self.ctrlSizeInputAttr = ScalarAttribute('ctrlSize', value=5.0, minValue=1.0, maxValue=50.0, parent=guideSettingsAttrGrp) self.ctrlSizeInputAttr.setValueChangeCallback(self.resizeMainCtrl) # ========= # Controls # ========= # Guide Controls self.mainCtrl = Control('main', parent=self.ctrlCmpGrp, shape='square') self.mainCtrl.rotatePoints(90, 0, 0) data = { "location": 'M', "ctrlSize": self.ctrlSizeInputAttr.getValue(), "ctrlXfo": Xfo(tr=Vec3(0.0, 0.0, 0.0)) } self.loadData(data) Profiler.getInstance().pop() # ============= # Data Methods # ============= def saveData(self): """Save the data for the component to be persisted. Return: The JSON data object """ data = super(SimpleControlComponentGuide, self).saveData() data["ctrlSize"] = self.ctrlSizeInputAttr.getValue() data["ctrlXfo"] = self.mainCtrl.xfo return data def loadData(self, data): """Load a saved guide representation from persisted data. Arguments: data -- object, The JSON data object. Return: True if successful. """ super(SimpleControlComponentGuide, self).loadData(data) self.ctrlSizeInputAttr.setValue(data["ctrlSize"]) self.mainCtrl.xfo = data["ctrlXfo"] scaleValue = data["ctrlSize"] self.mainCtrl.setShape('square') self.mainCtrl.rotatePoints(90, 0, 0) self.mainCtrl.scalePoints(Vec3(scaleValue, scaleValue, scaleValue)) return True def getRigBuildData(self): """Returns the Guide data used by the Rig Component to define the layout of the final rig. Return: The JSON rig data object. """ data = super(SimpleControlComponentGuide, self).getRigBuildData() data["ctrlSize"] = self.ctrlSizeInputAttr.getValue() data["ctrlXfo"] = self.mainCtrl.xfo return data # ========== # Callbacks # ========== def resizeMainCtrl(self, newSize): self.mainCtrl.setShape('square') self.mainCtrl.rotatePoints(90, 0, 0) self.mainCtrl.scalePoints(Vec3(newSize, newSize, newSize)) # ============== # Class Methods # ============== @classmethod def getComponentType(cls): """Enables introspection of the class prior to construction to determine if it is a guide component. Return: The true if this component is a guide component. """ return 'Guide' @classmethod def getRigComponentClass(cls): """Returns the corresponding rig component class for this guide component class Return: The rig component class. """ return SimpleControlComponentRig
class ArmComponentGuide(ArmComponent): """Arm Component Guide""" def __init__(self, name='arm', parent=None, *args, **kwargs): Profiler.getInstance().push("Construct Arm Guide Component:" + name) super(ArmComponentGuide, self).__init__(name, parent, *args, **kwargs) # =========== # Attributes # =========== # Add Component Params to IK control guideSettingsAttrGrp = AttributeGroup("GuideSettings", parent=self) self.bicepFKCtrlSizeInputAttr = ScalarAttribute( 'bicepFKCtrlSize', value=1.75, minValue=0.0, maxValue=10.0, parent=guideSettingsAttrGrp) self.forearmFKCtrlSizeInputAttr = ScalarAttribute( 'forearmFKCtrlSize', value=1.5, minValue=0.0, maxValue=10.0, parent=guideSettingsAttrGrp) # ========= # Controls # ========= # Guide Controls self.bicepCtrl = Control('bicep', parent=self.ctrlCmpGrp, shape="sphere") self.bicepCtrl.setColor('blue') self.forearmCtrl = Control('forearm', parent=self.ctrlCmpGrp, shape="sphere") self.forearmCtrl.setColor('blue') self.wristCtrl = Control('wrist', parent=self.ctrlCmpGrp, shape="sphere") self.wristCtrl.setColor('blue') armGuideSettingsAttrGrp = AttributeGroup("DisplayInfo_ArmSettings", parent=self.bicepCtrl) self.armGuideDebugAttr = BoolAttribute('drawDebug', value=True, parent=armGuideSettingsAttrGrp) self.guideOpHost = Transform('guideOpHost', self.ctrlCmpGrp) # Guide Operator self.armGuideKLOp = KLOperator('guide', 'TwoBoneIKGuideSolver', 'Kraken') self.addOperator(self.armGuideKLOp) # Add Att Inputs self.armGuideKLOp.setInput('drawDebug', self.armGuideDebugAttr) self.armGuideKLOp.setInput('rigScale', self.rigScaleInputAttr) # Add Source Inputs self.armGuideKLOp.setInput('root', self.bicepCtrl) self.armGuideKLOp.setInput('mid', self.forearmCtrl) self.armGuideKLOp.setInput('end', self.wristCtrl) # Add Target Outputs self.armGuideKLOp.setOutput('guideOpHost', self.guideOpHost) self.default_data = { "name": name, "location": "L", "bicepXfo": Xfo(Vec3(2.275, 15.3, -0.75)), "forearmXfo": Xfo(Vec3(5.0, 13.5, -0.75)), "wristXfo": Xfo(Vec3(7.2, 12.25, 0.5)), "bicepFKCtrlSize": self.bicepFKCtrlSizeInputAttr.getValue(), "forearmFKCtrlSize": self.forearmFKCtrlSizeInputAttr.getValue() } self.loadData(self.default_data) Profiler.getInstance().pop() # ============= # Data Methods # ============= def saveData(self): """Save the data for the component to be persisted. Return: The JSON data object """ data = super(ArmComponentGuide, self).saveData() data['bicepXfo'] = self.bicepCtrl.xfo data['forearmXfo'] = self.forearmCtrl.xfo data['wristXfo'] = self.wristCtrl.xfo return data def loadData(self, data): """Load a saved guide representation from persisted data. Arguments: data -- object, The JSON data object. Return: True if successful. """ super(ArmComponentGuide, self).loadData(data) self.bicepCtrl.xfo = data['bicepXfo'] self.forearmCtrl.xfo = data['forearmXfo'] self.wristCtrl.xfo = data['wristXfo'] guideOpName = ''.join([ self.getName().split('GuideKLOp')[0], self.getLocation(), 'GuideKLOp' ]) self.armGuideKLOp.setName(guideOpName) self.armGuideKLOp.evaluate() return True def getRigBuildData(self): """Returns the Guide data used by the Rig Component to define the layout of the final rig.. Return: The JSON rig data object. """ data = super(ArmComponentGuide, self).getRigBuildData() # values bicepPosition = self.bicepCtrl.xfo.tr forearmPosition = self.forearmCtrl.xfo.tr wristPosition = self.wristCtrl.xfo.tr # Calculate Bicep Xfo rootToWrist = wristPosition.subtract(bicepPosition).unit() rootToElbow = forearmPosition.subtract(bicepPosition).unit() bone1Normal = rootToWrist.cross(rootToElbow).unit() bone1ZAxis = rootToElbow.cross(bone1Normal).unit() bicepXfo = Xfo() bicepXfo.setFromVectors(rootToElbow, bone1Normal, bone1ZAxis, bicepPosition) # Calculate Forearm Xfo elbowToWrist = wristPosition.subtract(forearmPosition).unit() elbowToRoot = bicepPosition.subtract(forearmPosition).unit() bone2Normal = elbowToRoot.cross(elbowToWrist).unit() bone2ZAxis = elbowToWrist.cross(bone2Normal).unit() forearmXfo = Xfo() forearmXfo.setFromVectors(elbowToWrist, bone2Normal, bone2ZAxis, forearmPosition) # Calculate Wrist Xfo wristXfo = Xfo() wristXfo.tr = self.wristCtrl.xfo.tr wristXfo.ori = forearmXfo.ori upVXfo = xfoFromDirAndUpV(bicepPosition, wristPosition, forearmPosition) upVXfo.tr = forearmPosition upVXfo.tr = upVXfo.transformVector(Vec3(0, 0, 5)) # Lengths bicepLen = bicepPosition.subtract(forearmPosition).length() forearmLen = forearmPosition.subtract(wristPosition).length() data['bicepXfo'] = bicepXfo data['forearmXfo'] = forearmXfo data['wristXfo'] = wristXfo data['upVXfo'] = upVXfo data['bicepLen'] = bicepLen data['forearmLen'] = forearmLen return data # ============== # Class Methods # ============== @classmethod def getComponentType(cls): """Enables introspection of the class prior to construction to determine if it is a guide component. Return: The true if this component is a guide component. """ return 'Guide' @classmethod def getRigComponentClass(cls): """Returns the corresponding rig component class for this guide component class Return: The rig component class. """ return ArmComponentRig
class MainSrtComponentGuide(MainSrtComponent): """MainSrt Component Guide""" def __init__(self, name="mainSrt", parent=None, data=None): Profiler.getInstance().push("Construct MainSrt Guide Component:" + name) super(MainSrtComponentGuide, self).__init__(name, parent) # ========= # Attributes # ========= # Add Component Params to IK control guideSettingsAttrGrp = AttributeGroup("GuideSettings", parent=self) self.mainSrtSizeInputAttr = ScalarAttribute( "mainSrtSize", value=5.0, minValue=1.0, maxValue=50.0, parent=guideSettingsAttrGrp ) # ========= # Controls # ========= # Guide Controls self.mainSrtCtrl = Control("mainSrt", parent=self.ctrlCmpGrp, shape="circle") if data is None: data = { "location": "M", "mainSrtSize": self.mainSrtSizeInputAttr.getValue(), "mainSrtXfo": Xfo(tr=Vec3(0.0, 0.0, 0.0)), } self.loadData(data) Profiler.getInstance().pop() # ============= # Data Methods # ============= def saveData(self): """Save the data for the component to be persisted. Return: The JSON data object """ data = super(MainSrtComponentGuide, self).saveData() data["mainSrtSize"] = self.mainSrtSizeInputAttr.getValue() data["mainSrtXfo"] = self.mainSrtCtrl.xfo return data def loadData(self, data): """Load a saved guide representation from persisted data. Arguments: data -- object, The JSON data object. Return: True if successful. """ super(MainSrtComponentGuide, self).loadData(data) self.mainSrtSizeInputAttr.setValue(data["mainSrtSize"]) self.mainSrtCtrl.xfo = data["mainSrtXfo"] self.mainSrtCtrl.scalePoints(Vec3(data["mainSrtSize"], 1.0, data["mainSrtSize"])) return True def getRigBuildData(self): """Returns the Guide data used by the Rig Component to define the layout of the final rig. Return: The JSON rig data object. """ data = super(MainSrtComponentGuide, self).getRigBuildData() data["mainSrtSize"] = self.mainSrtSizeInputAttr.getValue() data["mainSrtXfo"] = self.mainSrtCtrl.xfo return data # ============== # Class Methods # ============== @classmethod def getComponentType(cls): """Enables introspection of the class prior to construction to determine if it is a guide component. Return: The true if this component is a guide component. """ return "Guide" @classmethod def getRigComponentClass(cls): """Returns the corresponding rig component class for this guide component class Return: The rig component class. """ return MainSrtComponentRig
class TwistComponentGuide(TwistComponent): """Twist Component Guide""" def __init__(self, name='twist', parent=None): Profiler.getInstance().push('Construct Spine Guide Component:' + name) super(TwistComponentGuide, self).__init__(name, parent) # ========= # Controls # ======== guideSettingsAttrGrp = AttributeGroup('GuideSettings', parent=self) self.numDeformersAttr = IntegerAttribute('numDeformers', value=1, minValue=0, maxValue=20, parent=guideSettingsAttrGrp) self.blendBiasAttr = ScalarAttribute('blendBias', value=0.0, minValue=0, maxValue=1.0, parent=guideSettingsAttrGrp) # Guide Controls triangleCtrl = Control('triangle', shape='triangle') triangleCtrl.rotatePoints(90, 0, 0) triangleCtrl.scalePoints(Vec3(0.25, 0.25, 0.25)) triangleCtrl.scalePoints(Vec3(1.0, 0.5, 1.0)) triangleCtrl.translatePoints(Vec3(0.0, 1.25, 0.0)) triangleCtrl.rotatePoints(0, 90, 0) self.originCtrl = Control('origin', parent=self.ctrlCmpGrp, shape='circle') self.originCtrl.rotatePoints(90, 0, 0) self.originCtrl.rotatePoints(0, 90, 0) self.originCtrl.appendCurveData(triangleCtrl.getCurveData()) self.insertCtrl = Control('insert', parent=self.ctrlCmpGrp, shape='circle') self.insertCtrl.rotatePoints(90, 0, 0) self.insertCtrl.rotatePoints(0, 90, 0) self.insertCtrl.appendCurveData(triangleCtrl.getCurveData()) self.default_data = { 'name': name, 'location': 'M', 'blendBias': 0.5, 'originXfo': Xfo(Vec3(0.0, 0.0, 0.0)), 'insertXfo': Xfo(Vec3(5.0, 0.0, 0.0)), 'numDeformers': 5 } self.loadData(self.default_data) Profiler.getInstance().pop() # ============= # Data Methods # ============= def saveData(self): """Save the data for the component to be persisted. Return: The JSON data object """ data = super(TwistComponentGuide, self).saveData() data['blendBias'] = self.blendBiasAttr.getValue() data['originXfo'] = self.originCtrl.xfo data['insertXfo'] = self.insertCtrl.xfo data['numDeformers'] = self.numDeformersAttr.getValue() return data def loadData(self, data): """Load a saved guide representation from persisted data. Arguments: data -- object, The JSON data object. Return: True if successful. """ super(TwistComponentGuide, self).loadData(data) self.blendBiasAttr.setValue(data.get('blendBias', 0.0)) self.originCtrl.xfo = data.get('originXfo', Xfo()) self.insertCtrl.xfo = data.get('insertXfo', Xfo()) self.numDeformersAttr.setValue(data.get('numDeformers', 5)) return True def getRigBuildData(self): """Returns the Guide data used by the Rig Component to define the layout of the final rig. Return: The JSON rig data object. """ data = super(TwistComponentGuide, self).getRigBuildData() data['blendBias'] = self.blendBiasAttr.getValue() data['originXfo'] = self.originCtrl.xfo data['insertXfo'] = self.insertCtrl.xfo originUpVXfo = Xfo(Vec3(0.0, 1.0, 0.0)) insertUpVXfo = Xfo(Vec3(0.0, 1.0, 0.0)) data['originUpVXfo'] = self.originCtrl.xfo * originUpVXfo data['insertUpVXfo'] = self.insertCtrl.xfo * insertUpVXfo data['numDeformers'] = self.numDeformersAttr.getValue() return data # ============== # Class Methods # ============== @classmethod def getComponentType(cls): """Enables introspection of the class prior to construction to determine if it is a guide component. Return: The true if this component is a guide component. """ return 'Guide' @classmethod def getRigComponentClass(cls): """Returns the corresponding rig component class for this guide component class Return: The rig component class. """ return TwistComponentRig