コード例 #1
0
def test_getattrtime():
    """getAttr(time=)"""
    transform = cmdx.createNode("transform")

    for time, value in ((1, 1.0), (10, 10.0)):
        cmds.setKeyframe(str(transform),
                         time=[time],
                         attribute="translateY",
                         value=value)
    cmds.keyTangent(str(transform),
                    edit=True,
                    time=(1, 10),
                    attribute="translateY",
                    outTangentType="linear")

    # These floating point values can differ ever so slightly
    assert_almost_equals(transform["ty"].read(time=1), 1.0, places=5)
    assert_almost_equals(transform["ty"].read(time=5), 5.0, places=5)
    assert_almost_equals(transform["ty"].read(time=10), 10.0, places=5)

    # From the current context (Maya 2018 and above)
    if hasattr(om.MDGContext, "makeCurrent"):
        context = om.MDGContext(om.MTime(1.0, om.MTime.uiUnit()))
        context.makeCurrent()
        assert_almost_equals(transform["ty"].read(), 1.0, places=5)
        context = om.MDGContext(om.MTime(5.0, om.MTime.uiUnit()))
        context.makeCurrent()
        assert_almost_equals(transform["ty"].read(), 5.0, places=5)
        context = om.MDGContext(om.MTime(10.0, om.MTime.uiUnit()))
        context.makeCurrent()
        assert_almost_equals(transform["ty"].read(), 10.0, places=5)
        om.MDGContext.kNormal.makeCurrent()
コード例 #2
0
def create_dg_context_apitwo(t):
    """
    Create a Maya DG Context for querying values at time.
    """
    assert t is None or isinstance(t, (int, float))
    ctx = None
    if t is None:
        ctx = OpenMaya2.MDGContext()
    else:
        unit = OpenMaya2.MTime.uiUnit()
        mtime = OpenMaya2.MTime(float(t), unit)
        ctx = OpenMaya2.MDGContext(mtime)
    return ctx
コード例 #3
0
ファイル: animation.py プロジェクト: planzcg/ragdolize
def getMatrixAttributeInTimeRange(node, attribute, timeRange=None):
    """get matrix atributtes on a range of frames wir maya DGContext
    Args:
        node (str): node name
        attribute (str): attribute name like worldMatrix or parentInverseMatrix
        timeRange (tuple, optional): start and end frames, if si not defined
            it will get the current active animation range. Defaults to None.
    Returns:
        list: list of matrices
    """
    fn = mUtils.getFn(node)
    plug = fn.findPlug(attribute, 0)
    if plug.isArray:
        plug.evaluateNumElements()
        plug = plug.elementByPhysicalIndex(0)
    if not timeRange:
        timeRange=getCurrentAnimRange()
    result = list()
    for x in range(int(timeRange[0]), int(timeRange[1])):
        timeContext = om.MDGContext(om.MTime(x, TIMEUNIT))
        matrixO = plug.asMObject(timeContext)
        fnMat = om.MFnMatrixData(matrixO)
        matrix =  fnMat.matrix()
        result.append(matrix)
    return result
コード例 #4
0
 def time_update(self, *args):
     context = OpenMaya.MDGContext(OpenMayaAnim.MAnimControl.currentTime())
     attr_dict = {
         "old_width": self.old_width.asFloat(context),
         "old_fp": self.old_fp.asFloat(context),
         "fp": self.fp.asFloat(context),
         "width": self.w.asFloat(context),
         "near": self.n.asFloat(context),
         "far": self.f.asFloat(context),
         "fov": self.fov.asFloat(context)
     }
     self.convert_dict(attr_dict)
コード例 #5
0
ファイル: anim.py プロジェクト: kthulhu/zoocore_maya
def iterFrameRangeDGContext(start, end):
    """Generator function to iterate over a time range returning a MDGContext for the current frame.

    :param start: the start frame
     :type start: int
    :param end: the end frame
    :type end: int
    :return: Returns a generator function with each element being a MDGContext with the current frame applied
    :rtype: Generator(om2.MDGContext)
    """
    currentTime = om2Anim.MAnimControl.currentTime()
    perFrame = om2.MTime(start, currentTime.unit)
    for frame in range(start, end + 1):
        context = om2.MDGContext(perFrame)
        yield context
        perFrame += 1
コード例 #6
0
    def compute(self, plug, data_block):
        """
        Perform the computation.
        """
        this_node = self.thisMObject()
        if ((plug == VelocityNode.m_out_speed)
                or (plug == VelocityNode.m_out_speed_text)
                or (plug == VelocityNode.m_out_dummy_float)
                or (plug == VelocityNode.m_out_dummy_string)):
            # Get the translate plug creating the MDataHandle with a DG context.
            point_plug = OpenMaya.MPlug(this_node, VelocityNode.m_input_point)

            # Get Data Handles
            time_handle = data_block.inputValue(VelocityNode.m_time)
            time_interval_handle = data_block.inputValue(
                VelocityNode.m_time_interval)
            fps_handle = data_block.inputValue(
                VelocityNode.m_frames_per_second)
            precision_handle = data_block.inputValue(
                VelocityNode.m_text_precision)
            point_now_handle = data_block.inputValue(
                VelocityNode.m_input_point)

            # Get value
            time = time_handle.asTime()
            time_interval = time_interval_handle.asTime()
            interval = time_interval.asUnits(OpenMaya.MTime.uiUnit()) * 2
            fps = fps_handle.asDouble()
            precision = precision_handle.asInt()
            point_now = point_now_handle.asVector()

            # Point at previous frame
            dg_context_prev = OpenMaya.MDGContext(time - time_interval)
            point_prev_handle = point_plug.asMDataHandle(dg_context_prev)
            point_prev = point_prev_handle.asVector()

            # Point at next frame
            dg_context_next = OpenMaya.MDGContext(time + time_interval)
            point_next_handle = point_plug.asMDataHandle(dg_context_next)
            point_next = point_next_handle.asVector()

            # Scene Scale
            scale_handle = data_block.inputValue(VelocityNode.m_unit_scale)
            scale_factor = 1.0
            scale_index = scale_handle.asShort()
            if scale_index == UNIT_SCALE_MILLIMETER_VALUE:
                scale_factor = 0.001
            elif scale_index == UNIT_SCALE_CENTIMETER_VALUE:
                scale_factor = 0.01
            elif scale_index == UNIT_SCALE_DECIMETER_VALUE:
                scale_factor = 0.1
            elif scale_index == UNIT_SCALE_METER_VALUE:
                scale_factor = 1.0
            elif scale_index == UNIT_SCALE_KILOMETER_VALUE:
                scale_factor = 1000.0

            # Display Unit
            display_unit_handle = data_block.inputValue(
                VelocityNode.m_display_unit)
            display_unit_str = ""
            display_unit_factor = 0.0
            display_unit = display_unit_handle.asShort()
            if display_unit == DISPLAY_UNIT_KM_PER_HOUR_VALUE:
                display_unit_factor = fps * 60 * 60 * 0.001
                display_unit_str = "km/h"
            elif display_unit == DISPLAY_UNIT_MILES_PER_HOUR_VALUE:
                display_unit_factor = fps * 60 * 60 * 0.000621371192
                display_unit_str = "mph"
            elif display_unit == DISPLAY_UNIT_METERS_PER_HOUR_VALUE:
                display_unit_factor = fps * 60 * 60
                display_unit_str = "m/h"
            elif display_unit == DISPLAY_UNIT_METERS_PER_SECOND_VALUE:
                display_unit_factor = fps
                display_unit_str = "m/s"
            elif display_unit == DISPLAY_UNIT_FEET_PER_HOUR_VALUE:
                display_unit_factor = fps * 60 * 60 * 3.28084
                display_unit_str = "ft/h"
            elif display_unit == DISPLAY_UNIT_FEET_PER_SECOND_VALUE:
                display_unit_factor = fps * 3.28084
                display_unit_str = "ft/s"

            # Distance
            dx = point_now[0] - point_prev[0]
            dy = point_now[1] - point_prev[1]
            dz = point_now[2] - point_prev[2]
            speed_raw = math.sqrt((dx * dx) + (dy * dy) + (dz * dz))
            dx = point_now[0] - point_next[0]
            dy = point_now[1] - point_next[1]
            dz = point_now[2] - point_next[2]
            speed_raw += math.sqrt((dx * dx) + (dy * dy) + (dz * dz))
            speed = (speed_raw * scale_factor * display_unit_factor) / interval
            speed_raw = speed_raw / interval

            # Output Speed
            out_speed_handle = data_block.outputValue(VelocityNode.m_out_speed)
            out_speed_handle.setDouble(speed)
            out_speed_handle.setClean()

            # Output Speed Raw
            out_speed_raw_handle = data_block.outputValue(
                VelocityNode.m_out_speed_raw)
            out_speed_raw_handle.setDouble(speed_raw)
            out_speed_raw_handle.setClean()

            # Output Speed String
            speed_str = "{:" + str(precision) + "} " + display_unit_str
            speed_str = speed_str.format(speed)
            out_text_handle = data_block.outputValue(
                VelocityNode.m_out_speed_text)
            out_text_handle.setString(speed_str)
            out_text_handle.setClean()

            # Output Dummy attributes
            out_dummy_float_handle = data_block.outputValue(
                VelocityNode.m_out_dummy_float)
            out_dummy_float_handle.setDouble(0.0)
            out_dummy_float_handle.setClean()

            # Output Speed String
            out_dummy_string_handle = data_block.outputValue(
                VelocityNode.m_out_dummy_string)
            out_dummy_string_handle.setString('')
            out_dummy_string_handle.setClean()

            data_block.setClean(plug)
        else:
            return None
コード例 #7
0
    def prepareForDraw(self, objPath, cameraPath, frameContext, oldData):
        ## Retrieve data cache (create if does not exist)
        data = oldData
        if not isinstance(data, DrawNodeData):
            data = DrawNodeData()
        
        mtObj = self.getDepNode(str(objPath))
        objMfn = OpenMaya.MFnDependencyNode(mtObj)
        data.name = objMfn.findPlug('nodeName', False).asString()
        data.startFrame = objMfn.findPlug('startTime', False).asInt()
        data.endFrame = objMfn.findPlug('endTime', False).asInt()

        thisNode   = objPath.node()
        timeBufferPlug   = OpenMaya.MPlug(thisNode, DrawNodeDrawOverride.timeBuffer)
        timeBuffer = timeBufferPlug.asInt()
        modePlug = OpenMaya.MPlug(thisNode, DrawNodeDrawOverride.mode)
        data.mode = modePlug.asInt()
        relativePlug = OpenMaya.MPlug(thisNode, DrawNodeDrawOverride.isRelative)
        data.isRelative = relativePlug.asBool()

        keyFrames = []
        if cmds.keyframe(data.name, q = True, tc = True):
            keyFrames  = list(set(cmds.keyframe(data.name, q = True, tc = True)))
            keyFrames  = [int(x) for x in keyFrames]

        currentTime = OpenMayaAnim.MAnimControl.currentTime()
        selectedNode = self.getDepNode(data.name)
        fnThisNode = OpenMaya.MFnDependencyNode(selectedNode)
        worldMatrixAttr = fnThisNode.attribute("worldMatrix")
        pointPlug = OpenMaya.MPlug(selectedNode, worldMatrixAttr)
        pointPlug = pointPlug.elementByLogicalIndex(0)

        activeCam = util.getCam()

        #check if translate attribute is changed
        self.deleteCallbacks()
        self.callbacks.append(OpenMayaAnim.MAnimMessage.addAnimKeyframeEditCheckCallback(self.keyFrameAddedCallback))
        self.callbacks.append(OpenMayaAnim.MAnimMessage.addAnimKeyframeEditedCallback(self.keyFrameEditedCallback))
        self.callbacks.append(OpenMaya.MEventMessage.addEventCallback('graphEditorChanged', self.graphEditorChangedCallback))
        
        if not data.isRelative:
            if not self.isPointCached or not self.allPoints.keys():
                self.allPoints = {}
                for i in range(data.startFrame, data.endFrame):
                    timeContext = OpenMaya.MDGContext(OpenMaya.MTime(i))
                    
                    #Finally get the data  
                    pointMMatrix = OpenMaya.MFnMatrixData(pointPlug.asMObject(timeContext)).matrix()
                    relativePoint = (pointMMatrix[12], pointMMatrix[13], pointMMatrix[14])

                    if i in keyFrames:
                        self.allPoints[i] = (relativePoint, 1)
                    else:
                        self.allPoints[i] = (relativePoint, 0)
                self.isPointCached = True
        else:
            if not self.isPointCached or not self.allFramePoints.keys():
                self.allFramePoints = {}

                for currentFrame in range(data.startFrame, data.endFrame):
                    self.allFramePoints[currentFrame] = {}
                    for i in range(data.startFrame, data.endFrame):
                        timeContext = OpenMaya.MDGContext(OpenMaya.MTime(i))
                        
                        #Finally get the data  
                        pointMMatrix = OpenMaya.MFnMatrixData(pointPlug.asMObject(timeContext)).matrix()
                        relativePoint = util.makeCameraRelative(pointMMatrix, activeCam, i, currentFrame)

                        if i in keyFrames:
                            self.allFramePoints[currentFrame][i] = (relativePoint, 1)
                        else:
                            self.allFramePoints[currentFrame][i] = (relativePoint, 0)

        points = {}
        if not data.isRelative:
            for i in range(int(currentTime.value - timeBuffer), int(currentTime.value + timeBuffer + 1)):
                #Get matrix plug as MObject so we can get it's data.                
                try:
                    points[i] = self.allPoints[i]
                except:
                    pass
        else:
            for i in range(int(currentTime.value - timeBuffer), int(currentTime.value + timeBuffer + 1)):
                #Get matrix plug as MObject so we can get it's data.
                
                try:
                    points[i] = self.allFramePoints[currentTime.value][i]
                except:
                    pass
                
        data.points = points
        
        if not data.isRelative:
            data.allPoints = self.allPoints
        else:
            try:
                data.allPoints = self.allFramePoints[currentTime.value]
            except:
                pass

        dotColorPlug      = OpenMaya.MPlug(thisNode, DrawNodeDrawOverride.dotColor)
        keyFrameColorPlug = OpenMaya.MPlug(thisNode, DrawNodeDrawOverride.keyFrameColor)
        lineColorPlug     = OpenMaya.MPlug(thisNode, DrawNodeDrawOverride.lineColor)
        travelerColorPlug = OpenMaya.MPlug(thisNode, DrawNodeDrawOverride.travelerColor)
        sizePlug          = OpenMaya.MPlug(thisNode, DrawNodeDrawOverride.size)
        keySizePlug       = OpenMaya.MPlug(thisNode, DrawNodeDrawOverride.keySize)
        lineWidthPlug     = OpenMaya.MPlug(thisNode, DrawNodeDrawOverride.lineWidth)    

        dotColor      = (dotColorPlug.child(0).asFloat(), dotColorPlug.child(1).asFloat(), dotColorPlug.child(2).asFloat(), 1.0)
        keyFrameColor = (keyFrameColorPlug.child(0).asFloat(), keyFrameColorPlug.child(1).asFloat(), keyFrameColorPlug.child(2).asFloat(), 1.0)
        lineColor     = (lineColorPlug.child(0).asFloat(), lineColorPlug.child(1).asFloat(), lineColorPlug.child(2).asFloat(), 1.0)
        travelerColor = (travelerColorPlug.child(0).asFloat(), travelerColorPlug.child(1).asFloat(), travelerColorPlug.child(2).asFloat(), 1.0)

        data.dotColor      = OpenMaya.MColor(dotColor)
        data.lineColor     = OpenMaya.MColor(lineColor)
        data.travelerColor = OpenMaya.MColor(travelerColor)
        data.keyFrameColor = OpenMaya.MColor(keyFrameColor) 

        allFrames = data.points.keys()
        allFrames.sort()
        
        #making dot absolute value
        point     = data.points[allFrames[0]][0]
        sizeFactor = util.getDistance(point, activeCam)/1500
        
        data.size       = sizeFactor * round(sizePlug.asFloat(), 2)
        data.keySize    = sizeFactor * round(keySizePlug.asFloat(), 2)
        data.lineWidth  = round(lineWidthPlug.asFloat(), 2) 
        
        return data