def get_markers_from_selection():
    """
    Given a selection of nodes, find the associated markers.

    :return: list of Marker objects.
    """
    nodes = maya.cmds.ls(long=True, selection=True) or []
    node_categories = filter_nodes.get_nodes(nodes)
    marker_nodes = node_categories.get('marker', [])

    camera_nodes = node_categories.get('camera', [])
    for node in camera_nodes:
        node_type = maya.cmds.nodeType(node)
        cam = None
        if node_type == 'transform':
            cam = mmapi.Camera(transform=node)
        if node_type == 'camera':
            cam = mmapi.Camera(shape=node)
        tfm_node = cam.get_transform_node()
        below_nodes = maya.cmds.ls(tfm_node, dag=True, long=True)
        marker_nodes += filter_nodes.get_marker_nodes(below_nodes)

    marker_group_nodes = list(node_categories['markergroup'])
    for node in marker_group_nodes:
        below_nodes = maya.cmds.ls(node, dag=True, long=True)
        marker_nodes += filter_nodes.get_marker_nodes(below_nodes)

    # Convert nodes into Marker objects.
    marker_nodes = list(set(marker_nodes))
    marker_list = []
    for node in marker_nodes:
        mkr = mmapi.Marker(node=node)
        marker_list.append(mkr)
    return marker_list
def swap_between_selected_markers_and_bundles():
    """
    Toggles the selection of Markers and Bundles.

    If a marker is selected, the attached bundle will be selected and
    vice versa.
    """
    sel = maya.cmds.ls(sl=True, long=True) or []
    if len(sel) == 0:
        LOG.warning('Select a node.')
        return

    node_filtered = filter_nodes.get_nodes(sel)
    num_marker = len(node_filtered['marker'])
    num_bundle = len(node_filtered['bundle'])
    new_sel = []

    if num_marker >= num_bundle:
        bnd_nodes = convert_selection.get_bundles_from_markers(
            node_filtered['marker'])
        new_sel += bnd_nodes
        new_sel += node_filtered['camera']
        new_sel += node_filtered['collection']
        new_sel += node_filtered['other']
    else:
        mkr_nodes = convert_selection.get_markers_from_bundles(
            node_filtered['bundle'])
        new_sel += mkr_nodes
        new_sel += node_filtered['camera']
        new_sel += node_filtered['collection']
        new_sel += node_filtered['other']

    maya.cmds.select(new_sel, replace=True)
    return
def select_both_markers_and_bundles():
    """
    Get the connected Markers and bundles, and select them.
    """
    sel = maya.cmds.ls(sl=True, long=True) or []
    if len(sel) == 0:
        LOG.warning('Select a node.')
        return

    node_filtered = filter_nodes.get_nodes(sel)
    num_marker = len(node_filtered['marker'])
    num_bundle = len(node_filtered['bundle'])

    mkr_nodes = []
    bnd_nodes = []
    if num_marker >= num_bundle:
        bnd_nodes = convert_selection.get_bundles_from_markers(
            node_filtered['marker'])
        mkr_nodes = convert_selection.get_markers_from_bundles(bnd_nodes)
    else:
        mkr_nodes = convert_selection.get_markers_from_bundles(
            node_filtered['bundle'])
        bnd_nodes = convert_selection.get_bundles_from_markers(mkr_nodes)

    new_sel = []
    new_sel += mkr_nodes
    new_sel += bnd_nodes
    new_sel += node_filtered['camera']
    new_sel += node_filtered['collection']
    new_sel += node_filtered['other']

    maya.cmds.select(new_sel, replace=True)
    return
Beispiel #4
0
def get_collections():
    nodes = maya.cmds.ls(type='objectSet', long=True) or []
    node_categories = filter_nodes.get_nodes(nodes)
    cols = []
    for col_node in node_categories['collection']:
        col = mmapi.Collection(name=col_node)
        cols.append(col)
    return cols
def get_collections():
    """
    Get all Collection objects defined in the scene.

    :returns: A list of Collection objects.
    :rtype: [Collection, ..]
    """
    nodes = maya.cmds.ls(type='objectSet', long=True) or []
    node_categories = filter_nodes.get_nodes(nodes)
    cols = []
    for col_node in node_categories['collection']:
        col = mmapi.Collection(node=col_node)
        cols.append(col)
    return cols
def get_selected_cameras():
    """
    Return the (associated) Camera objects from the selection.

    :returns: Camera objects.
    :rtype: mmSolver.api.Camera
    """
    cams = []
    nodes = maya.cmds.ls(sl=True, long=True) or []

    added_cameras = []
    objects = filternodes.get_nodes(nodes)
    for node in objects['camera']:
        cam = None
        if maya.cmds.nodeType(node) == 'camera':
            cam = mmapi.Camera(shape=node)
        else:
            cam = mmapi.Camera(transform=node)
        if cam is None:
            continue
        shp_node = cam.get_shape_node()
        if shp_node not in added_cameras:
            cams.append(cam)
            added_cameras.append(shp_node)

    for node in objects['marker']:
        mkr = mmapi.Marker(name=node)
        cam = mkr.get_camera()
        if cam is None:
            continue
        shp_node = cam.get_shape_node()
        if shp_node not in added_cameras:
            cams.append(cam)
            added_cameras.append(shp_node)

    for node in objects['markergroup']:
        mkr_grp = mmapi.MarkerGroup(name=node)
        cam = mkr_grp.get_camera()
        if cam is None:
            continue
        shp_node = cam.get_shape_node()
        if shp_node not in added_cameras:
            cams.append(cam)
            added_cameras.append(shp_node)

    return cams
Beispiel #7
0
def create_marker():
    """
    Create a new marker under the current viewport camera, or under
    the selected camera, if a camera is selected.
    """
    mmapi.load_plugin()

    sel = maya.cmds.ls(sl=True, long=True)
    node_filtered = filter_nodes.get_nodes(sel)
    cams = node_filtered['camera']
    cams = filter(is_not_startup_cam, cams)
    mkr_grps = node_filtered['markergroup']

    cam = None
    mkr_grp = None
    if len(cams) > 0 and len(mkr_grps) > 0:
        msg = 'Please select a camera or marker group; '
        msg += 'both node types are selected.'
        LOG.error(msg)

    elif len(cams) == 0 and len(mkr_grps) == 0:
        node = __get_camera()
        if node is None:
            msg = 'Please activate a viewport to get a camera.'
            LOG.error(msg)
            return
        if is_startup_cam(node) is True:
            msg = "Cannot create Markers in 'persp' camera."
            LOG.error(msg)
            return
        if maya.cmds.nodeType(node) == 'transform':
            cam = mmapi.Camera(transform=node)
        elif maya.cmds.nodeType(node) == 'camera':
            cam = mmapi.Camera(shape=node)
        else:
            LOG.error('Camera node is invalid; %r', node)
            return

    elif len(cams) > 0 and len(mkr_grps) == 0:
        node = cams[0]
        if maya.cmds.nodeType(node) == 'transform':
            cam = mmapi.Camera(transform=node)
        elif maya.cmds.nodeType(node) == 'camera':
            cam = mmapi.Camera(shape=node)
        else:
            LOG.error('Camera node is invalid; %r', node)
            return

    elif len(cams) == 0 and len(mkr_grps) > 0:
        node = mkr_grps[0]
        mkr_grp = mmapi.MarkerGroup(name=node)

    else:
        LOG.error('Should not get here.')

    bnd_name = mmapi.get_bundle_name('bundle1')
    bnd = mmapi.Bundle().create_node(
        name=bnd_name
    )

    mkr_name = mmapi.get_marker_name('marker1')
    mkr = mmapi.Marker().create_node(
        name=mkr_name,
        cam=cam,
        mkr_grp=mkr_grp,
        bnd=bnd
    )

    maya.cmds.select(mkr.get_node(), replace=True)
    return
Beispiel #8
0
def main():
    """
    Triangulate Bundle on current-frame

    Perform a reprojection of the selected bundle (or bundle connected
    to the selected marker), at the current frame.

    Usage:

    1) Select markers or connected bundles (or both).

    2) Run tool.

    3) Bundle is triangulated in TX, TY and TZ.

    .. note::

        If a Bundle has locked attributes, they will be unlocked and
        then relocked.

    """
    # If a bundle has locked attributes, they will be unlocked and
    # then relocked.
    relock = True

    # Get Markers and Bundles
    sel = maya.cmds.ls(sl=True) or []
    filter_nodes = filternodes.get_nodes(sel)
    mkr_nodes = filter_nodes.get('marker', [])
    bnd_nodes = filter_nodes.get('bundle', [])
    if len(mkr_nodes) == 0 and len(bnd_nodes) == 0:
        msg = 'Please select at least one marker / bundle!'
        LOG.warning(msg)
        return

    # Get Markers from Bundles
    for bnd_node in bnd_nodes:
        bnd = mmapi.Bundle(node=bnd_node)
        bnd_node_full = bnd.get_node()
        bnd_mkr_list = bnd.get_marker_list()
        mkr_count = len(bnd_mkr_list)
        if mkr_count == 0:
            msg = ('Cannot find Marker from Bundle, '
                   'Bundle doesn\'t have any Markers connected. '
                   'bnd=%r mkr_count=%r')
            LOG.warning(msg, bnd_node_full, mkr_count)
            continue
        elif mkr_count > 1:
            msg = ('Cannot find Marker from Bundle, '
                   'Bundle has more than 1 Marker. '
                   'bnd=%r mkr_count=%r')
            LOG.warning(msg, bnd_node_full, mkr_count)
            continue
        assert mkr_count == 1
        mkr = bnd_mkr_list[0]
        mkr_node_full = mkr.get_node()
        mkr_nodes.append(mkr_node_full)

    # Get  list of markers to operate on.
    mkr_list = []
    have_mkr_nodes = []
    attrs = ['translateX', 'translateY', 'translateZ']
    for mkr_node in mkr_nodes:
        mkr = mmapi.Marker(node=mkr_node)
        mkr_node_full = mkr.get_node()
        if mkr_node_full in have_mkr_nodes:
            msg = 'Skipping Marker, already have it; mkr=%r'
            LOG.debug(msg, mkr_node_full)
            continue

        # Get Bundle
        bnd = mkr.get_bundle()
        if bnd is None:
            msg = 'Marker does not have a connected Bundle; mkr=%r'
            LOG.warning(msg, mkr_node_full)
            continue
        bnd_node_full = bnd.get_node()

        # Check we can handle locked attributes.
        locked_num = 0
        for attr in attrs:
            plug = bnd_node_full + '.' + attr
            locked = maya.cmds.getAttr(plug, lock=True)
            locked_num += int(locked)
        if relock is False:
            if locked_num > 0:
                msg = ('Bundle must have unlocked translate attributes: '
                       'bnd=%r')
                LOG.warning(msg, bnd_node_full)
                continue
        elif relock is True:
            # Check the bundle isn't referenced and has locked attrs.
            referenced = maya.cmds.referenceQuery(bnd_node_full,
                                                  isNodeReferenced=True)
            if referenced is True and locked_num > 0:
                msg = (
                    'Bundle has locked translate attributes and is referenced '
                    '(cannot be unlocked): '
                    'bnd=%r')
                LOG.warning(msg, bnd_node_full)
                continue

        mkr_list.append(mkr)
        have_mkr_nodes.append(mkr_node_full)

    # Do projection
    modified_bnds = lib.current_frame(mkr_list, relock=relock)

    # Select all moved bundle nodes.
    modified_bnd_nodes = [bnd.get_node() for bnd in modified_bnds]
    if len(modified_bnd_nodes) > 0:
        maya.cmds.select(modified_bnd_nodes, replace=True)
    else:
        msg = 'No Bundle nodes modified, see Script Editor for details.'
        LOG.warning(msg)
    return