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
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
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
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