def merge_faces(): """Removes edges inside of face selection.""" selected = mampy.complist() if not selected: raise NothingSelected() control_object = next(iter(selected)) if not control_object.type == MFn.kMeshPolygonComponent or not len(control_object) > 1: raise InvalidSelection("Must have at least two connected faces selected.") new_faces = ComponentList() for face in selected: # We must first collect all necessary elements before we operate on them. # This is to avoid getting uncertain information due to indices changing # when performing the delete function. border_vertices = ComponentList() internal_edges = ComponentList() for connected_face in face.get_connected_components(): border_vertices.append(connected_face.to_vert(border=True)) internal_edges.append(connected_face.to_edge(internal=True)) # We only delete once per object to perserve as much information as # possible. cmds.polyDelEdge(internal_edges.cmdslist()) # Collect the most shared face on the border vertices to get new faces # from the delete operation. for border_vert in border_vertices: counter = collections.Counter() for idx in border_vert.indices: f = border_vert.new().add(idx).to_face() counter.update(f.indices) new_faces.append(face.new().add(counter.most_common(1).pop()[0])) # Select and be happy! cmds.select(new_faces.cmdslist())
def cleanupHierarchicalSubdivisionConversion(object): """ This definition cleans Maya hierarchical polygonal conversion. :param object: Object to cleanup. ( String ) """ cmds.select(object) cmds.polySelectConstraint(m=3, t=8, sz=3) cmds.polySelectConstraint(dis=True) nsidesFaces = cmds.ls(sl=True, l=True, fl=True) cmds.select(nsidesFaces) cmds.polySelectConstraint(m=3, t=1, order=True, orb=(3, 3)) cmds.polySelectConstraint(dis=True) nsideVertices = cmds.ls(sl=True, l=True, fl=True) offendingEdges = [] for vertice in nsideVertices: faces = cmds.ls(cmds.polyListComponentConversion(vertice, fv=True, tf=True), fl=True, l=True) faces = [face for face in faces if not face in nsidesFaces] if len(faces) == 2: faceEdgesA = cmds.ls(cmds.polyListComponentConversion(faces[0], ff=True, te=True), fl=True, l=True) faceEdgesB = cmds.ls(cmds.polyListComponentConversion(faces[1], ff=True, te=True), fl=True, l=True) sharedEdge = list(set(faceEdgesA).intersection(faceEdgesB)) offendingEdges.append(sharedEdge[0]) cmds.polySelectSp(offendingEdges, loop=True) cmds.polyDelEdge(cmds.ls(sl=True), cv=True, ch=True) cmds.select(object)
def del_line(set_name, base_list): model_list = cmds.sets(set_name, q=True) for model_name in model_list: tag_list = [] for key in base_list: ele = model_name + '.e[' + str(key) + ']' tag_list.append(ele) cmds.polyDelEdge(tag_list, cv=True, ch=True)
def del_line(group_name,base_list): model_list = cmds.listRelatives(group_name,children=True) for model_name in model_list: tag_list =list() for key in base_list: ele = model_name+'.e[' + str(key)+']' tag_list.append(ele) cmds.polyDelEdge(tag_list,cv=True,ch=True)
def hexalate(): list=cmds.ls(sl=1,fl=1) for i in range (len(list)): cmds.polyTriangulate(list[i], ch = True) edgeCount = cmds.polyEvaluate( e=1) cmds.select( (list[i] + '.e[0:' + str(edgeCount) + ']'), r=True) hexEdgeSet = cmds.sets(name = 'edgeSetHex') cmds.polySubdivideFacet( list[i], dv = 1, m=0, ch=1) cmds.select(hexEdgeSet, r=1) cmds.polyDelEdge(cv=1, ch=1) cmds.select(hexEdgeSet, r = 1, ne = 1) cmds.delete() cmds.select(list)
def hexalate(): list = cmds.ls(sl=1, fl=1) for i in range(len(list)): cmds.polyTriangulate(list[i], ch=True) edgeCount = cmds.polyEvaluate(e=1) cmds.select((list[i] + '.e[0:' + str(edgeCount) + ']'), r=True) hexEdgeSet = cmds.sets(name='edgeSetHex') cmds.polySubdivideFacet(list[i], dv=1, m=0, ch=1) cmds.select(hexEdgeSet, r=1) cmds.polyDelEdge(cv=1, ch=1) cmds.select(hexEdgeSet, r=1, ne=1) cmds.delete() cmds.select(list)
def edgeDelete(self , vtxs): edgeIds = [] for v in vtxs: for e in self.getNearComponents(v , edgesConnected=1): edgeIds.append(e) edgeIds = set(edgeIds) edgeComponent = Om2.MFnSingleIndexedComponent() components = edgeComponent.create(Om2.MFn.kMeshEdgeComponent) map(edgeComponent.addElement , edgeIds) edgeSel = Om2.MSelectionList() edgeSel.add((self.mDag , components)) Om2.MGlobal.setActiveSelectionList(edgeSel) cm.polyDelEdge(cv=True , ch=False)
def edge_loop_to_curve(edge_name, delete_edges=False): cmds.select(edge_name) cmds.pickWalk(edge_name, type="edgeloop", d="right") curve_name, shape_name = cmds.polyToCurve(form=2, degree=3) cvs = cmds.getAttr("{}.spans".format(curve_name)) curve_points = [] for cv_id in range(cvs): cv_name = "{}.cv[{}]".format(curve_name, cv_id) pos = get_position(cv_name) curve_points.append(Component(cv_name, *pos)) if delete_edges: cmds.select(edge_name) cmds.pickWalk(edge_name, type="edgeloop", d="right") cmds.polyDelEdge(cv=True) cmds.select(curve_name) cmds.Delete() return curve_points
def cleanupHierarchicalSubdivisionConversion(object): """ Cleans Maya hierarchical polygonal conversion. :param object: Object to cleanup. :type object: str """ cmds.select(object) cmds.polySelectConstraint(m=3, t=8, sz=3) cmds.polySelectConstraint(dis=True) nsidesFaces = cmds.ls(sl=True, l=True, fl=True) cmds.select(nsidesFaces) cmds.polySelectConstraint(m=3, t=1, order=True, orb=(3, 3)) cmds.polySelectConstraint(dis=True) nsideVertices = cmds.ls(sl=True, l=True, fl=True) offendingEdges = [] for vertice in nsideVertices: faces = cmds.ls(cmds.polyListComponentConversion(vertice, fv=True, tf=True), fl=True, l=True) faces = [face for face in faces if not face in nsidesFaces] if len(faces) == 2: faceEdgesA = cmds.ls(cmds.polyListComponentConversion(faces[0], ff=True, te=True), fl=True, l=True) faceEdgesB = cmds.ls(cmds.polyListComponentConversion(faces[1], ff=True, te=True), fl=True, l=True) sharedEdge = list(set(faceEdgesA).intersection(faceEdgesB)) offendingEdges.append(sharedEdge[0]) cmds.polySelectSp(offendingEdges, loop=True) cmds.polyDelEdge(cmds.ls(sl=True), cv=True, ch=True) cmds.select(object)
def main_type2(self): theSel = cmds.ls(sl=1) polyName = theSel[0] if '.' in polyName: polyName = polyName.split('.')[0] returnVal = functions_falloff_class.main( polyName, clamp=self.spinBox.value(), isfallOffModules=self.checkBox2.isChecked(), delLevel=1) #for i in returnVal: # functions_falloff_class.selEdgeByIntArray(i, add=1) preWholeDelArray = [] for fa in returnVal: for f in fa: preWholeDelArray.append('%s.e[%s]' % (polyName, str(f))) cmds.polyDelEdge(preWholeDelArray, cv=1)
def ldmt_rebuildSubdiv(): #Get the selected mesh selectedMesh=cmds.ls( selection=True )[0] #Get the vertex count i.e. vertex id of last vertex... vertexCount=cmds.polyEvaluate( v=1 ) edgeCount=cmds.polyEvaluate(e=1 ) vertexId = selectedMesh+'.vtx['+str(vertexCount)+']' #Convert selection to edges... x=cmds.polyListComponentConversion(vertexId,fv=True,te=True ) cmds.select(x) #get the edges number... k=x[0].rfind(']') l=x[0].rfind('[') start = x[0][l+1:] edges = str(start[:-1]) colon = edges.split(':') #Select edge loops and rings... mel.eval('SelectEdgeLoopSp;') mel.eval('SelectContiguousEdges;') mel.eval('polySelectEdgesEveryN "edgeRing" 2;') selectedEdges = cmds.ls(sl=1,fl=1) count=0 while len(selectedEdges)<edgeCount*10/21: if count >3: break mel.eval('polySelectEdgesEveryN "edgeRing" 2;') mel.eval('SelectContiguousEdges;') selectedEdges = cmds.ls(sl=1,fl=1) count += 1 mel.eval('polySelectEdgesEveryN "edgeRing" 2;') mel.eval('polySelectEdgesEveryN "edgeRing" 2;') #Delete the selected edgeloops cmds.polyDelEdge( cv=True ) cmds.select(selectedMesh)
def main(self, protectloop=True, reducelevel=1): theSel = cmds.ls(sl=1) polyName = theSel[0] if '.' in polyName: polyName = polyName.split('.')[0] # if user in the edge mode selected.filter the detail tags.just keep model name. self.progress = qw.QProgressDialog() self.progress.show() wholeDelArrayTemp = self.calculateBaseDeleteArray(polyName, delLevel=reducelevel) filterArray = self.filterCrease(polyName, wholeDelArrayTemp[1], isProtectCreaseLoop=protectloop) self.progress.setMaximum(5) self.progress.setLabelText('struct final data...') self.progress.setValue(3) preWholeDelArray = [ '%s.e[%s]' % (polyName, str(fa)) for fa in filterArray ] self.progress.setLabelText('delete edges...') self.progress.setValue(4) cmds.polyDelEdge(preWholeDelArray, cv=1) self.progress.setValue(5) self.progress.close() print 'done'
def polyDelEdge(*args, **kwargs): res = cmds.polyDelEdge(*args, **kwargs) if not kwargs.get('query', kwargs.get('q', False)): res = _factories.maybeConvert(res, _general.PyNode) return res
import maya.mel as mel #Get the selected mesh selectedMesh=cmds.ls( selection=True )[0] #Get the vertex count i.e. vertex id of last vertex... vertexCount=cmds.polyEvaluate( v=True ) vertexId = selectedMesh+'.vtx['+str(vertexCount)+']' cmds.select(vertexId) #Convert selection to edges... x=cmds.polyListComponentConversion( fv=True,te=True ) cmds.select(x) #get the edges number... k=x[0].rfind(']') l=x[0].rfind('[') start = x[0][l+1:] edges = str(start[:-1]) colon = edges.split(':') #Select edge loops and rings... mel.eval('SelectEdgeLoopSp;') mel.eval('polySelectEdgesEveryN "edgeRing" 2;') mel.eval('SelectEdgeLoopSp;') mel.eval('SelectEdgeLoopSp;') mel.eval('SelectEdgeLoopSp;') mel.eval('polySelectEdgesEveryN "edgeRing" 2;') #Delete the selected edgeloops cmds.polyDelEdge( cv=True ) cmds.select(selectedMesh)
def dlEd(*args): cmds.polyDelEdge()
def weld_all(obj_name, source_positions_2D, dest_positions_2D, maintain_source_shape=False): """Welds all the source verticies to the destination verticies by bridging or merging Args: obj_name (str): name of the object to weld source_positions_2D (float[][]): positions of source vertecies dest_positions_2D (float[][]): positions of destination vertecies maintain_source_shape (bool): maintain the shape of the source object by leaving a bridge between the two borders Returns: None """ cmds.select(cl=True) num_verts = cmds.polyEvaluate(obj_name, v=True) # Script encounters float comparison errors if I don't round all of the positions source_positions_2D = [[[round(i, 2) for i in pos] for pos in sp] for sp in source_positions_2D] dest_positions_2D = [[[round(i, 2) for i in pos] for pos in dp] for dp in dest_positions_2D] # Looping through all the vertices of the object to find the verts that match the stored positions source_verts = [] dest_verts = [] for i in range(num_verts): vert = "{}.vtx[{}]".format(obj_name, i) pos = get_position(vert) pos = [round(i, 2) for i in pos] idx = 0 for sp, dp in zip(source_positions_2D, dest_positions_2D): if pos in sp: source_verts.append((idx, vert)) elif pos in dp: dest_verts.append((idx, vert)) idx += 1 # Splitting the vertices into chunks based on the vert count of the border edges source_verts = [j for i, j in sorted(source_verts, key=lambda x: x[0])] dest_verts = [j for i, j in sorted(dest_verts, key=lambda x: x[0])] chunk_length = len(dest_positions_2D[0]) sv_split = [ source_verts[i:i + chunk_length] for i in range(0, len(source_verts), chunk_length) ] dv_split = [ dest_verts[i:i + chunk_length] for i in range(0, len(dest_verts), chunk_length) ] # Bridging each pair of border edges together edges_to_delete = [] for s_verts, d_verts in zip(sv_split, dv_split): source_edge_ring = cmds.polyListComponentConversion(s_verts, te=True, internal=True) dest_edge_ring = cmds.polyListComponentConversion(d_verts, te=True, internal=True) cmds.select(source_edge_ring, dest_edge_ring) try: cmds.polyBridgeEdge(divisions=0, twist=0, taper=1, curveType=0, smoothingAngle=30, direction=0, sourceDirection=0, targetDirection=0) edges_to_delete.append(source_edge_ring) except RuntimeError: raise Exception( "Precision too low, lower current working units to mm") if not maintain_source_shape: # Deleting the leftover edge loop from bridge cmds.select(cl=True) for edge_loop in edges_to_delete: cmds.select(edge_loop, add=True) cmds.polyDelEdge(cv=True)
creaseProtectArray = [] if isProtectCreaseLoop: for i in creaseArray: edgeLoop = cmds.polySelect(polyName, edgeLoop=int(i), ass=0, q=1) for el in edgeLoop: creaseProtectArray.append(int(el)) for i in noneCreaseArray: if i not in creaseProtectArray: arrayWithoutCrease.append(i) else: arrayWithoutCrease = list(noneCreaseArray) return arrayWithoutCrease theSel = cmds.ls(sl=1) polyName = theSel[0] wholeDelArrayTemp = calculateBaseDeleteArray(polyName) filterArray = filterCrease(polyName, wholeDelArrayTemp[1]) preWholeDelArray = ['%s.e[%s]' % (polyName, str(fa)) for fa in filterArray] cmds.polyDelEdge(preWholeDelArray, cv=1) print 'done'