Beispiel #1
0
    def compute(self, plug, dataBlock):
        """
        Node computation method:
            * plug is a connection point related to one of our node attributes (either an input or an output).
            * dataBlock contains the data on which we will base our computations.
        """
        # pylint: disable=no-self-use
        if plug != AngularScalarMath.outAngle:
            return om2.kUnknownParameter

        angle = dataBlock.inputValue(
            AngularScalarMath.inAngle).asAngle().asDegrees()
        scalar = dataBlock.inputValue(AngularScalarMath.inScalar).asDouble()
        operation = dataBlock.inputValue(
            AngularScalarMath.inOperation).asShort()

        outAngleHandle = dataBlock.outputValue(AngularScalarMath.outAngle)

        if operation == 0:
            outAngleHandle.setMAngle(om2.MAngle(angle, om2.MAngle.kDegrees))
        elif operation == 1:
            outAngle = angle + scalar
            outAngleHandle.setMAngle(om2.MAngle(outAngle, om2.MAngle.kDegrees))
        elif operation == 2:
            outAngle = angle - scalar
            outAngleHandle.setMAngle(om2.MAngle(outAngle, om2.MAngle.kDegrees))
        elif operation == 3:
            outAngle = angle * scalar
            outAngleHandle.setMAngle(om2.MAngle(outAngle, om2.MAngle.kDegrees))
        elif operation == 4:
            if scalar != 0.0:
                outAngle = angle / scalar
            else:
                outAngle = 9999.999
            outAngleHandle.setMAngle(om2.MAngle(outAngle, om2.MAngle.kDegrees))
        elif operation == 5:
            outAngle = math.pow(angle, scalar)
            outAngleHandle.setMAngle(om2.MAngle(outAngle, om2.MAngle.kDegrees))
        elif operation == 6:
            outAngle = min(angle, scalar)
            outAngleHandle.setMAngle(om2.MAngle(outAngle, om2.MAngle.kDegrees))
        elif operation == 7:
            outAngle = max(angle, scalar)
            outAngleHandle.setMAngle(om2.MAngle(outAngle, om2.MAngle.kDegrees))

        outAngleHandle.setClean()
    def compute(self, plug, dataBlock):
        """
        Node computation method:
            * plug is a connection point related to one of our node attributes (either an input or an output).
            * dataBlock contains the data on which we will base our computations.
        """
        # pylint: disable=no-self-use
        if plug != DoubleToAngle.outAngle:
            return om2.kUnknownParameter

        double = dataBlock.inputValue(DoubleToAngle.inDouble).asDouble()
        outAngleHandle = dataBlock.outputValue(DoubleToAngle.outAngle)

        outAngleHandle.setMAngle(om2.MAngle(double, om2.MAngle.kDegrees))
        outAngleHandle.setClean()
    def compute(self, plug, dataBlock):
        """
        Node computation method:
            * plug is a connection point related to one of our node attributes (either an input or an output).
            * dataBlock contains the data on which we will base our computations.
        """
        # pylint: disable=no-self-use
        if plug != AngularTrigMath.outAngle:
            return om2.kUnknownParameter

        angle1 = dataBlock.inputValue(AngularTrigMath.inAngle1).asAngle()
        operation = dataBlock.inputValue(AngularTrigMath.inOperation).asShort()

        outAngleHandle = dataBlock.outputValue(AngularTrigMath.outAngle)

        if operation == 0:
            outAngleHandle.setMAngle(angle1)
        elif operation == 1:
            outAngle = math.cos(angle1.asRadians())
            outAngleHandle.setMAngle(om2.MAngle(outAngle, om2.MAngle.kDegrees))
        elif operation == 2:
            outAngle = math.sin(angle1.asRadians())
            outAngleHandle.setMAngle(om2.MAngle(outAngle, om2.MAngle.kDegrees))
        elif operation == 3:
            outAngle = math.tan(angle1.asRadians())
            outAngleHandle.setMAngle(om2.MAngle(outAngle, om2.MAngle.kDegrees))
        elif operation == 4:
            resAngle = angle1.asDegrees()
            if resAngle > 1.0:
                resAngle = 1.0
            elif resAngle < -1.0:
                resAngle = -1.0
            outAngle = math.acos(resAngle)
            outAngleHandle.setMAngle(om2.MAngle(outAngle))
        elif operation == 5:
            resAngle = angle1.asDegrees()
            if resAngle > 1.0:
                resAngle = 1.0
            elif resAngle < -1.0:
                resAngle = -1.0
            outAngle = math.asin(resAngle)
            outAngleHandle.setMAngle(om2.MAngle(outAngle))
        elif operation == 6:
            outAngle = math.atan(angle1.asRadians())
            outAngleHandle.setMAngle(om2.MAngle(outAngle, om2.MAngle.kRadians))
        elif operation == 7:
            angle2 = dataBlock.inputValue(AngularTrigMath.inAngle2).asAngle()
            outAngle = math.atan2(angle1.asRadians(), angle2.asRadians())
            outAngleHandle.setMAngle(om2.MAngle(outAngle, om2.MAngle.kRadians))

        outAngleHandle.setClean()
Beispiel #4
0
    def compute(self, plug, dataBlock):
        """
        Node computation method:
            * plug is a connection point related to one of our node attributes (either an input or an output).
            * dataBlock contains the data on which we will base our computations.
        """
        # pylint: disable=no-self-use
        if (plug != EulerScalarMath.outEuler
                and plug != EulerScalarMath.outEulerX
                and plug != EulerScalarMath.outEulerY
                and plug != EulerScalarMath.outEulerZ):
            return om2.kUnknownParameter

        operation = dataBlock.inputValue(EulerScalarMath.inOperation).asShort()
        euler = dataBlock.inputValue(EulerScalarMath.inEuler).asDouble3()
        scalar = dataBlock.inputValue(EulerScalarMath.inScalar).asDouble()
        eulerRotOder = dataBlock.inputValue(
            EulerScalarMath.inEulerRotOrder).asShort()
        outRotOrder = dataBlock.inputValue(
            EulerScalarMath.inResRotOrder).asShort()

        eEuler = om2.MEulerRotation(euler, eulerRotOder)

        outEulerHandle = dataBlock.outputValue(EulerScalarMath.outEuler)

        if operation == 0:
            eEuler.reorderIt(outRotOrder)
            outEulerHandle.set3Double(eEuler.x, eEuler.y, eEuler.z)
        elif operation == 1:
            eEuler.reorderIt(outRotOrder)
            eScalar = om2.MEulerRotation(
                om2.MAngle(scalar, om2.MAngle.kDegrees).asRadians(),
                om2.MAngle(scalar, om2.MAngle.kDegrees).asRadians(),
                om2.MAngle(scalar, om2.MAngle.kDegrees).asRadians(),
                outRotOrder)
            eOutEuler = eEuler + eScalar
            outEulerHandle.set3Double(eOutEuler.x, eOutEuler.y, eOutEuler.z)
        elif operation == 2:
            eEuler.reorderIt(outRotOrder)
            eScalar = om2.MEulerRotation(
                om2.MAngle(scalar, om2.MAngle.kDegrees).asRadians(),
                om2.MAngle(scalar, om2.MAngle.kDegrees).asRadians(),
                om2.MAngle(scalar, om2.MAngle.kDegrees).asRadians(),
                outRotOrder)
            eOutEuler = eEuler - eScalar
            outEulerHandle.set3Double(eOutEuler.x, eOutEuler.y, eOutEuler.z)
        elif operation == 3:
            eEuler.reorderIt(outRotOrder)
            eOutEuler = eEuler * scalar
            outEulerHandle.set3Double(eOutEuler.x, eOutEuler.y, eOutEuler.z)

        outEulerHandle.setClean()
Beispiel #5
0
def getMRotFromNodeOutput(node_mob, rotOrder=om2.MEulerRotation.kXYZ):
    """
    finds the angular output of the argument node and returns it
     as a Euler rotation where that angle is the X element
    :param node_mob: [MObject] the node to get the output port from
    :param rotOrder: [int] the factory constant for the desired rotation order
                            the returned Euler rotation should be set to
    :return: [MEulerRotation] the Euler rotation composition where the
                                angular output on the argument node is the X value
    """
    mfn_dep = om2.MFnDependencyNode(node_mob)
    angle = om2.MAngle(0.0)
    if node_mob.hasFn(om2.MFn.kAnimBlend) and mfn_dep.hasAttribute(
            _MAYA_OUTPUT_ATTRIBUTE_NAME):
        plug = mfn_dep.findPlug(_MAYA_OUTPUT_ATTRIBUTE_NAME, False)
        angle = plug.asMAngle()

    rot = om2.MEulerRotation(angle.asRadians(), 0.0, 0.0, rotOrder)
    return rot
Beispiel #6
0
    def compute(self, plug, dataBlock):
        """
        Node computation method:
            * plug is a connection point related to one of our node attributes (either an input or an output).
            * dataBlock contains the data on which we will base our computations.
        """
        rotation = dataBlock.inputValue(TwistExtractor.inRotation).asDouble3()
        rotOrder = dataBlock.inputValue(
            TwistExtractor.inRotationOrder).asShort()
        eRoll = om2.MEulerRotation(rotation, rotOrder)
        useUpObj = dataBlock.inputValue(TwistExtractor.inUseUpVec).asBool()
        revTwist = dataBlock.inputValue(TwistExtractor.inInvTwist).asBool()

        # Non flip ROO = XYZ
        # Not working = XZY
        twistOrder = om2.MEulerRotation.kXYZ
        eRoll.reorderIt(twistOrder)

        # Non-Roll orientation
        mtxFn = om2.MTransformationMatrix()
        mtxFn.rotateBy(eRoll, om2.MSpace.kWorld)
        mRoll = mtxFn.asMatrix()

        qNonRoll = om2.MQuaternion()

        nAim = om2.MVector(mRoll[0], mRoll[1], mRoll[2])
        nAim.normalize()
        nAimAxis = om2.MVector.kXaxisVector
        qAim = om2.MQuaternion(nAimAxis, nAim)
        qNonRoll *= qAim

        if useUpObj:
            vUp = om2.MVector(
                dataBlock.inputValue(TwistExtractor.inUpVec).asFloat3())
            nNormal = vUp - ((vUp * nAim) * nAim)
            nNormal.normalize()
            nUp = om2.MVector.kYaxisVector.rotateBy(qAim)
            angle = nUp.angle(nNormal)
            qNormal = om2.MQuaternion(angle, nAim)
            if not nNormal.isEquivalent(nUp.rotateBy(qNormal), 1.0e-5):
                angle = 2.0 * kPI - angle
                qNormal = om2.MQuaternion(angle, nAim)
            qNonRoll *= qNormal
        eNonRoll = qNonRoll.asEulerRotation()
        eNonRoll = om2.MEulerRotation(eNonRoll.x, eNonRoll.y, eNonRoll.z,
                                      twistOrder)

        # Extract Twist from orientations
        qRoll = eRoll.asQuaternion()
        qExtract180 = qNonRoll * qRoll.inverse()
        eExtract180 = qExtract180.asEulerRotation()
        twist = -eExtract180.x
        if revTwist:
            twist *= -1.0

        # Output Twist
        if plug == TwistExtractor.outTwist:
            outTwistHdle = dataBlock.outputValue(TwistExtractor.outTwist)
            outTwistHdle.setMAngle(om2.MAngle(twist))
            outTwistHdle.setClean()

        # Output Twist Distribution
        if plug == TwistExtractor.outTwistDist:
            invDist = dataBlock.inputValue(TwistExtractor.inRevDist).asBool()
            outTwistDistHdle = dataBlock.outputArrayValue(
                TwistExtractor.outTwistDist)
            outputs = len(outTwistDistHdle)
            step = twist / (outputs - 1) if outputs > 1 else twist
            outList = []
            outList.extend(range(outputs))
            if not invDist:
                outList.reverse()
            # pylint: disable=consider-using-enumerate
            for i in range(len(outList)):
                outTwistDistHdle.jumpToLogicalElement(i)
                resultHdle = outTwistDistHdle.outputValue()
                result = step * outList[i] if outputs > 1 else twist
                resultHdle.setMAngle(om2.MAngle(result))
            outTwistDistHdle.setAllClean()

        return
Beispiel #7
0
    def initialize():
        """
        Defines the set of attributes for this node. The attributes declared in this function are assigned
        as static members to QuadraticCurve class. Instances of QuadraticCurve will use these attributes to create plugs
        for use in the compute() method.
        """
        mAttr = om2.MFnMatrixAttribute()
        nAttr = om2.MFnNumericAttribute()
        uAttr = om2.MFnUnitAttribute()
        tAttr = om2.MFnTypedAttribute()

        QuadraticCurve.inControlPoints = mAttr.create(
            "controlPoints", "cp", om2.MFnMatrixAttribute.kDouble)
        mAttr.array = True
        INPUT_ATTR(mAttr)

        QuadraticCurve.inEnableTwist = nAttr.create(
            "enableTwist", "etw", om2.MFnNumericData.kBoolean, False)
        INPUT_ATTR(nAttr)

        QuadraticCurve.inStartUpObj = mAttr.create(
            "startUpObjectMatrix", "suom", om2.MFnMatrixAttribute.kFloat)
        INPUT_ATTR(mAttr)

        QuadraticCurve.inEndUpObj = mAttr.create("endUpObjectMatrix", "euom",
                                                 om2.MFnMatrixAttribute.kFloat)
        INPUT_ATTR(mAttr)

        QuadraticCurve.inLockLength = nAttr.create("lockLength", "locklen",
                                                   om2.MFnNumericData.kFloat,
                                                   0.0)
        nAttr.setMin(0.0)
        nAttr.setMax(1.0)
        INPUT_ATTR(nAttr)

        QuadraticCurve.inRestLength = nAttr.create("restLength", "rlength",
                                                   om2.MFnNumericData.kFloat,
                                                   0.0)
        nAttr.setMin(0.0)
        INPUT_ATTR(nAttr)

        QuadraticCurve.inSlide = nAttr.create("slide", "slide",
                                              om2.MFnNumericData.kFloat, 0.0)
        nAttr.setMin(0.0)
        nAttr.setMax(1.0)
        INPUT_ATTR(nAttr)

        QuadraticCurve.inPreferredAngle = uAttr.create(
            "preferredAngle", "pangle", om2.MFnUnitAttribute.kAngle)
        uAttr.setMin(0.0)
        uAttr.setMax(om2.MAngle(360.0, om2.MAngle.kDegrees).asRadians())
        INPUT_ATTR(uAttr)

        QuadraticCurve.outTransforms = mAttr.create(
            "outTransforms", "otrans", om2.MFnMatrixAttribute.kDouble)
        mAttr.array = True
        OUTPUT_ATTR(mAttr)

        QuadraticCurve.outCurve = tAttr.create("outCurve", "ocrv",
                                               om2.MFnData.kNurbsCurve)
        OUTPUT_ATTR(tAttr)

        QuadraticCurve.addAttribute(QuadraticCurve.inControlPoints)
        QuadraticCurve.addAttribute(QuadraticCurve.inEnableTwist)
        QuadraticCurve.addAttribute(QuadraticCurve.inStartUpObj)
        QuadraticCurve.addAttribute(QuadraticCurve.inEndUpObj)
        QuadraticCurve.addAttribute(QuadraticCurve.inLockLength)
        QuadraticCurve.addAttribute(QuadraticCurve.inRestLength)
        QuadraticCurve.addAttribute(QuadraticCurve.inSlide)
        QuadraticCurve.addAttribute(QuadraticCurve.inPreferredAngle)
        QuadraticCurve.addAttribute(QuadraticCurve.outTransforms)
        QuadraticCurve.addAttribute(QuadraticCurve.outCurve)
        QuadraticCurve.attributeAffects(QuadraticCurve.inControlPoints,
                                        QuadraticCurve.outCurve)
        QuadraticCurve.attributeAffects(QuadraticCurve.inControlPoints,
                                        QuadraticCurve.outTransforms)
        QuadraticCurve.attributeAffects(QuadraticCurve.inEnableTwist,
                                        QuadraticCurve.outTransforms)
        QuadraticCurve.attributeAffects(QuadraticCurve.inStartUpObj,
                                        QuadraticCurve.outTransforms)
        QuadraticCurve.attributeAffects(QuadraticCurve.inEndUpObj,
                                        QuadraticCurve.outTransforms)
        QuadraticCurve.attributeAffects(QuadraticCurve.inLockLength,
                                        QuadraticCurve.outTransforms)
        QuadraticCurve.attributeAffects(QuadraticCurve.inRestLength,
                                        QuadraticCurve.outTransforms)
        QuadraticCurve.attributeAffects(QuadraticCurve.inSlide,
                                        QuadraticCurve.outTransforms)
        QuadraticCurve.attributeAffects(QuadraticCurve.inPreferredAngle,
                                        QuadraticCurve.outTransforms)