def create_anim_curve_node_apione(
        times,
        values,
        node_attr=None,
        tangent_in_type=OpenMayaAnim1.MFnAnimCurve.kTangentGlobal,
        tangent_out_type=OpenMayaAnim1.MFnAnimCurve.kTangentGlobal,
        anim_type=OpenMayaAnim1.MFnAnimCurve.kAnimCurveTL,
        undo_cache=None):
    """
    Create an animCurve using Maya API (one).

    :param times: Time values for the animCurve
    :type times: list

    :param values: Values for the animCurve.
    :type values: list

    :param node_attr: The 'plug' to connect the animCurve to.
    :type node_attr: str

    :param tangent_in_type: The "in" tangent type for keyframes.
    :type tangent_in_type: maya.OpenMayaAnim.MFnAnimCurve.kTangent*

    :param tangent_out_type: The "out" tangent type for keyframes.
    :type tangent_out_type: maya.OpenMayaAnim.MFnAnimCurve.kTangent*

    :param anim_type: The type of animation curve node.
    :type anim_type: maya.OpenMayaAnim.MFnAnimCurve.kAnimCurve*

    :param undo_cache: The Maya AnimCurve Undo Cache data structure or
                       None if no undo is required.
    :type undo_cache: maya.OpenMayaAnim.MAnimCurveChange

    :return: MFnAnimCurve object attached to a newly created animation curve.
    :rtype: maya.OpenMaya.MFnAnimCurve
    """
    if not isinstance(times, list):
        raise ValueError('times must be a list or sequence type.')
    if not isinstance(values, list):
        raise ValueError('times must be a list or sequence type.')
    if len(times) == 0:
        raise ValueError('times must have 1 or more values.')
    if len(values) == 0:
        raise ValueError('values must have 1 or more values.')
    if len(times) != len(values):
        raise ValueError('Number of times and values does not match.')

    # create anim curve
    animfn = OpenMayaAnim1.MFnAnimCurve()
    if node_attr is None:
        animCurve = animfn.create(anim_type)
    else:
        # Get the plug to be animated.
        dst_plug = node_utils.get_as_plug(node_attr)

        objs = OpenMaya1.MObjectArray()
        find = OpenMayaAnim1.MAnimUtil.findAnimation(dst_plug, objs)
        if find is True and objs.length() > 0:
            animfn = OpenMayaAnim1.MFnAnimCurve(objs[0])
        else:
            animfn = OpenMayaAnim1.MFnAnimCurve()
            animfn.create(dst_plug)

    # Copy the times into an MTimeArray and the values into an MDoubleArray.
    time_array = OpenMaya1.MTimeArray()
    value_array = OpenMaya1.MDoubleArray()
    for time, value in zip(times, values):
        time_array.append(OpenMaya1.MTime(time, OpenMaya1.MTime.uiUnit()))
        value_array.append(value)

    # force a default undo cache
    if not undo_cache:
        undo_cache = OpenMayaAnim1.MAnimCurveChange()

    # Add the keys to the animCurve.
    animfn.addKeys(
        time_array,
        value_array,
        tangent_in_type,
        tangent_out_type,
        False,  # overwrite any keys that get in our way
        undo_cache)
    return animfn
Exemplo n.º 2
0
    def pre_import():
        if not cmds.pluginInfo('kikoUndoer', q=1, l=1):
            cmds.loadPlugin('kikoUndoer', quiet=True)

        MayaUndoHelper.anim_curve_change = OpenMayaAnim.MAnimCurveChange()
        MayaUndoHelper.dg_modifier = OpenMaya.MDGModifier()