def middle2(self, s): middleL = [] #use input field data to determine flat uv set flatUvSet = self.findFlatUvSet(s) #get tips of geo and split to top and bottom pairs pair1, pair2 = self.findTips(s, flatUvSet) #select edges going the length on the cards and list as vertices pm.polyUVSet(s, currentUVSet =1, uvSet=flatUvSet) side1Edge = pm.polySelect(s, ass = 1, shortestEdgePathUV = (pair1[0].getUVIndices(str(flatUvSet))[0], pair1[1].getUVIndices(str(flatUvSet))[0])) side1 = pm.ls(pm.polyListComponentConversion(side1Edge, fe =1, tv =1), fl = 1) if len(side1) > 2: side2Edge = pm.polySelect(s, ass = 1, shortestEdgePathUV = (pair2[0].getUVIndices(str(flatUvSet))[0], pair2[1].getUVIndices(str(flatUvSet))[0])) side2 = pm.ls(pm.polyListComponentConversion(side2Edge, fe =1, tv =1), fl = 1) #select bottom verts and walk(traverse) to the middle of the geo on both sides mid1 = pm.ls(self.traverse(start = pair1[0], listToWalk = side1, multiplyBy = 0.5 )) mid2 = pm.ls(self.traverse(start = pair2[0], listToWalk = side2, multiplyBy = 0.5 )) #select shortest path between the 2 middle points and add to the middleL list MidLine = pm.polySelect(s, ass = 1, shortestEdgePathUV = (mid1[0].getUVIndices(str(flatUvSet))[0], mid2[0].getUVIndices(str(flatUvSet))[0])) middleL.append(MidLine) pm.select(cl = 1) if len(side1) % 2 == 0: mid3 = pm.ls(self.traverse(start = pair1[-1], listToWalk = side1, multiplyBy = 0.5 )) mid4 = pm.ls(self.traverse(start = pair2[-1], listToWalk = side2, multiplyBy = 0.5 )) MidLine2 = pm.polySelect(s, ass = 1, shortestEdgePathUV = (mid3[0].getUVIndices(str(flatUvSet))[0], mid4[0].getUVIndices(str(flatUvSet))[0])) middleL.append(MidLine2) pm.select(cl = 1) return pm.ls( middleL, fl = True)
def prefixUV(self): #查询对象的所有UV,返回状态值和错误值,用于和其他方法交互 err = u'初始化错误' state = False try: if self.selection is None: raise NoChoosedError return for obj in self.selection: stateUV, err = self.__checkUV(obj) if stateUV is False: continue #指定当前UV为self.UV pm.polyUVSet(obj, currentUVSet=True, uvSet=self.UV) except NoChoosedError: d = u'可能为无选择导致的程序错误' pm.warning(d) state = False err = d return state, err else: d = u'完成操作,运行时 %s' % err pm.warning(d) state = True return state, err
def copyUV(self, uv2): #强制设定当前UV为工作UV,无法设定则不继续执行 state, err = self.prefixUV() print u'完成预设操作' if state is True and err == self.preErr: try: if self.UV == uv2: raise SameUVError except SameUVError: d = u'无法将 UV 集复制到自身' pm.warning(d) return else: self.UV = uv2 print self.UV else: d = u'工作UV错误或不存在,无法继续执行' print(d) pm.warning(d) return for obj in self.selection: state = self.__checkUV(obj) if not state: d = u'基础UV错误或不存在,无法继续执行' print(d) pm.warning(d) return #将工作UV复制到当前UV pm.polyUVSet(obj, copy=True, nuv=uv2)
def __delUniformedUV(self, obj): #删除工作中尝试的临时UV allUV = pm.polyUVSet(obj, query=True, allUVSets=True) if 'mwi_showUV' in allUV: pm.polyUVSet(obj, delete=True, uvSet='mwi_showUV') if 'mwi_refUV' in allUV: pm.polyUVSet(obj, delete=True, uvSet='mwi_refUV')
def delete_set(self, *args): uvset = self.uvs.getSelectItem()[0].split(' | ') try: pm.polyUVSet(uvset[0], delete=True, uvSet=uvset[1]) self.update_sets() except RuntimeError: pm.warning('The defualt uv set cannot be deleted.') self.update_sets()
def uvsettool(arg): #拷贝uvset到默认uvset sel =pm.ls(sl=1) for i in range(len(sel)): cruv = pm.getAttr(sel[i].getShapes()[0]+".currentUVSet") if cruv!="map1": alluvset=pm.polyUVSet(sel[i],q=1,allUVSets=1) pm.polyUVSet(sel[i],copy=True,uvSet=cruv,nuv="map1") else: alluvset=pm.polyUVSet(sel[i],q=1,allUVSets=1) if len(alluvset)>=1: uvrightset = [u for u in alluvset if u=="UVChannel_1"] if uvrightset!=[]: pm.setAttr(sel[i].getShapes()[0]+".currentUVSet",uvrightset[0],type="string") cruv = pm.getAttr(sel[i].getShapes()[0]+".currentUVSet") pm.polyUVSet(sel[i],copy=True,uvSet=cruv,nuv="map1") for i in range(len(sel)): pm.select(sel[i],r=1) alluvset=pm.polyUVSet(sel[i],q=1,allUVSets=1) print sel[i],alluvset for n in range(len(alluvset)): if len( alluvset)!=1: if alluvset[n]!="map1": pm.setAttr(sel[i].getShapes()[0]+".currentUVSet",alluvset[n],type="string") try: pm.polyUVSet(delete=True) except: pass
def dup_set(self, *args): uvset = self.uvs.getSelectItem()[0].split(' | ') bdialog = pm.promptDialog(title='Duplicate UVSet', message='Enter New UVSet Name:', button=['OK', 'Cancel'], defaultButton='OK', cancelButton='Cancel', dismissString='Cancel') if bdialog == 'OK': pm.polyUVSet(uvset[0], copy=True, uvSet=uvset[1], newUVSet=pm.promptDialog(q=True, text=True)) self.update_sets()
def __checkUV(self, obj): state = True print('----------------------------------------------') print u'预处理程序,正在检查UV' #查询对象的所有UV allUV = pm.polyUVSet(obj, query=True, allUVSets=True) #检查指定的UV是否存在 if type(self.UV) == type(None): state = False err = '无UV'.decode('utf-8') raise NoChoosedError return state, err try: if self.UV not in allUV: d = u'UV:%s不存在于对象UV集中' % (self.UV) pm.warning(d) state = False err = u'有不存在的UV,请通过控制台检查日志' return state, err except TypeError: d = u'UV:%s不存在于对象UV集中' % (self.UV) pm.warning(d) state = False err = u'有不存在的UV,请通过控制台检查日志' return state, err print u'UV:%s存在于对象UV集中,当前对象%s' % (self.UV, str(obj)) err = self.preErr return state, err
def _get_overlapping_uvs(cls, node): """ Check if mesh has overlapping UVs. :param node: node to check :type node: str :returns: True is has overlapping UVs, False otherwise :rtype: bool """ ovl = GetOverlappingUVs() overlapping_faces = [] for i, uv in enumerate(pm.polyUVSet(node, q=1, auv=1)): pm.polyUVSet(node, cuv=1, uvSet=uv) overlapping_faces.extend(ovl._getOverlapUVFaces(str(node))) return overlapping_faces
def get_current_uv_set(shape): uv_sets = pm.polyUVSet(shape, q=True, currentUVSet=True) if uv_sets: return uv_sets[0] else: return 'map1'
def fix_uvsets(cls): """Fixes uvSets (DiffuseUV -> map1) """ for node in pm.selected(): shape = node.getShape() # get current uvset uvset_names = pm.polyUVSet(shape, query=True, allUVSets=True) if 'DiffuseUV' in uvset_names: if len(uvset_names) == 1: # Copy values of uvset "DiffuseUV" to "map1" pm.polyUVSet(shape, copy=True, nuv='map1', uvSet='DiffuseUV') # set current uvset to map1 pm.polyUVSet(shape, currentUVSet=True, uvSet='map1') # delete uv set # pm.polyUVSet( shape, delete=True, uvSet='DiffuseUV') else: if 'map1' in uvset_names: # set current uvset to map1 uvs = shape.getUVs(uvSet='map1') if len(uvs[0]) == 0: # Copy values of uvset "DiffuseUV" to "map1" pm.polyUVSet(shape, copy=True, nuv='map1', uvSet='DiffuseUV')
def middle(self,s): if self.midCtrlCheckBox.getValue() == 1: number = self.randSliderT.getValue()/10 else: number = 0.5 #use input field data to determine flat uv set flatUvSet = self.findFlatUvSet(s) #get tips of geo and split to top and bottom pairs pair1, pair2 = self.findTips(s, flatUvSet) #select edges going the length on the cards and list as vertices pm.polyUVSet(s, currentUVSet =1, uvSet=flatUvSet)###not sure that I need it side1Edge = pm.polySelect(s, ass = 1, shortestEdgePathUV = (pair1[0].getUVIndices(str(flatUvSet))[0], pair2[0].getUVIndices(str(flatUvSet))[0])) side1 = pm.ls(pm.polyListComponentConversion(side1Edge, fe =1, tv =1), fl = 1) side2Edge = pm.polySelect(s, ass = 1, shortestEdgePathUV = (pair1[1].getUVIndices(str(flatUvSet))[0], pair2[1].getUVIndices(str(flatUvSet))[0])) side2 = pm.ls(pm.polyListComponentConversion(side2Edge, fe =1, tv =1), fl = 1) #select bottom verts and walk(traverse) to the middle of the geo on both sides mid1 = pm.ls(self.traverse(start = pair1[0], listToWalk = side1, multiplyBy = number )) mid2 = pm.ls(self.traverse(start = pair1[1], listToWalk = side2, multiplyBy = number )) #select shortest path between the 2 middle points and add to the middleL list MidLine = pm.polySelect(s, ass = 1, shortestEdgePathUV = (mid1[0].getUVIndices(str(flatUvSet))[0], mid2[0].getUVIndices(str(flatUvSet))[0])) pm.select(cl = 1) return MidLine
def noMultipleUVsets(*arg): # Check meshList meshList = pm.ls(type='mesh') if not meshList: return [] # Check Multiple UV Sets for mesh in meshList: if mesh.isIntermediate(): continue UVsets = pm.polyUVSet(mesh, q=True, allUVSets=True) if not UVsets: continue if len(UVsets) > 1: return True
def transfer(self): haircap = self.capName.getText() oldSel = pm.ls(sl = 1) pm.select(pm.ls(o=1, sl=1)) selected = pm.ls(sl = 1) pm.select(cl = 1) myCurrentUvSet = pm.polyUVSet(selected[0], q = True , currentUVSet = True )[0] if pm.objExists(haircap) and self.transferCheckBox.getValue() == 1: for object in selected: pm.transferAttributes(haircap, object, sampleSpace=0,transferUVs=1, transferColors=0, sourceUvSet = 'map1',targetUvSet = 'map1') elif len(selected) > 1 and self.transferCheckBox.getValue() == 0: last = selected.pop(-1) for object in selected: if pm.polyEvaluate(object, v = 1) == pm.polyEvaluate(last, v = 1): pm.select([last, object]) pm.transferAttributes(sampleSpace=5,transferUVs=1, transferColors=0,sourceUvSet = myCurrentUvSet, targetUvSet = myCurrentUvSet ) else: pm.error( "assign hair cap geo, or select more than one object with same topology") pm.select(oldSel)
def _check_indiv_UVSets(self,chkNode=None): u""" >>Start Pipeline Check: check the mesh objects that has multiple uvsets 检查物体是否有多个uvset 注意:如果当前有选择物体,将仅作用于选择的物体 """ msgAttr = '_iffyMsg_dags' chk_trns = self.get_chk_nodes(chkNode) kMoreThanOneUVSet = [] for i in chk_trns: i_shp = i.getShape(ni=True) kUVSets = pm.polyUVSet(i, query=True, allUVSets=1) if len(kUVSets) > 1: kMoreThanOneUVSet.append(i) if kMoreThanOneUVSet: self.update_msgs(msgAttr,">>IFFY--Multiple UVsets Objects",kMoreThanOneUVSet) else: om.MGlobal.displayInfo(u">>>mesh的没有2个以上的uvset ") return kMoreThanOneUVSet
def checkUV(self, obj): state = True print(u'正在检查UV') #查询对象的所有UV allUV = pm.polyUVSet(obj, query=True, allUVSets=True) #检查指定的UV是否存在 try: if self.baseUV not in allUV: print u'基础UV:%s不存在于对象UV中,跳过当前对象%s' % (self.baseUV, str(obj)) state = False return state if self.workUV not in allUV: print u'工作UV:%s不存在于对象UV中,跳过当前对象%s' % (self.workUV, str(obj)) state = False return state except TypeError: d = u'UV有错误' pm.warning(d) state = False return state return state
def selMultipleUVsets(*arg): # Check meshList meshList = pm.ls(type='mesh') if not meshList: return [] # Check Multiple UV Sets multipleUVsets = [] for mesh in meshList: if mesh.isIntermediate(): continue UVsets = pm.polyUVSet(mesh, q=True, allUVSets=True) if not UVsets: continue if len(UVsets) > 1: multipleUVsets.append(mesh) pm.select(multipleUVsets)
def UVFix(self): oldSel = pm.ls(sl = 1) selected = pm.ls(sl = 1, o = 1) pm.select(cl = 1) for s in selected: #############get info from other nodes myCurrentUvSet = pm.polyUVSet(s, q = True , currentUVSet = True )[0] pair1, pair2 = self.findTips(s, myCurrentUvSet) ###############select and store roots and tips tipsUV = [] rootEdges = pm.ls( pm.polySelect( s, ass = 1 ,shortestEdgePath = (pair2[0].index(), pair2[1].index() ) ), fl = 1) tipsUV.append( pm.ls( pm.polyListComponentConversion( rootEdges, fe =1, tuv =1), fl = True ) ) tipEdges = pm.ls( pm.polySelect( s, ass = 1 ,shortestEdgePath = (pair1[0].index(), pair1[1].index() ) ), fl = 1) tipsUV.append( pm.ls( pm.polyListComponentConversion( tipEdges, fe =1, tuv =1), fl = True ) ) #########select and unfold the middle part of the mesh pm.select( pm.ls(tipsUV, fl = 1), replace = True ) pm.runtime.InvertSelection() if self.squareCheckBox.getValue() == 1: pm.unfold(ps=0, us=False, i=4312, gmb=0.9457, pub=0, oa=1, ss=15.5797, gb=0.7597) ###########selecting length boarders side1 = pm.ls(pm.polySelect(ebp = [ tipEdges[0].index(), rootEdges[0].index()], ass = True ), fl = 1) side1 = [n for n in side1 if n not in rootEdges and n not in tipEdges] side2 = pm.ls(pm.polySelect(ebp = [ tipEdges[-1].index(), rootEdges[-1].index()], ass = True ), fl = 1) side2 = [n for n in side2 if n not in rootEdges and n not in tipEdges] ##########calculate all the averages boarder1Avg = self.tupleAvg([pair1[0].getUV(uvSet = myCurrentUvSet), pair2[0].getUV(uvSet = myCurrentUvSet)]) boarder2Avg = self.tupleAvg([pair1[1].getUV(uvSet = myCurrentUvSet), pair2[1].getUV(uvSet = myCurrentUvSet)]) islandAvg = self.tupleAvg([boarder1Avg, boarder2Avg]) #########straighten length boarders for x in side1: pm.polyEditUV(x, u = boarder1Avg[0], r = False, uvSetName = myCurrentUvSet) for x in side2: pm.polyEditUV(x, u = boarder2Avg[0], r = False, uvSetName = myCurrentUvSet) ##########get the perimeter of the uv island borderUVs = ['{}.map[{}]'.format(s,x.getUVIndices()[0]) for x in pm.ls(s.vtx, fl = 1) if x.isOnBoundary()] pm.select(borderUVs) pm.runtime.InvertSelection() pm.Unfold3D(pm.selected(),rs=2, ite=0, bi=1, p=0, u=1, ms=1024, tf=1) else: pm.Unfold3D(pm.selected(),rs=2, ite=0, bi=1, p=0, u=1, ms=1024, tf=1) pm.select(oldSel)
def delMultipleUVsets(*arg): # Check meshList meshList = pm.ls(type='mesh') if not meshList: return [] # Check Multiple UV Sets for mesh in meshList: if mesh.isIntermediate(): continue UVsets = pm.polyUVSet(mesh, q=True, allUVSets=True) if not UVsets: continue if len(UVsets) > 1: current = pm.polyUVSet(mesh, q=True, currentUVSet=True)[0] if current != UVsets[0]: pm.polyUVSet(mesh, copy=True, uvSet=current, nuv=UVsets[0]) for UV in UVsets[1:]: pm.polyUVSet(mesh, delete=True, uvSet=UV) pm.delete(mesh, ch=True)
def removeExtraSets(cls, obj, *args, **kwargs): """ remove all uv sets except for the default one """ for i in pm.polyUVSet(obj, query=True, allUVSetsIndices=True)[1:]: name = pm.getAttr(obj+'.uvSet['+str(i)+'].uvSetName') pm.polyUVSet(obj, delete=True, uvSet=name)
def __uniformUV(self, obj): #查询对象的所有UV #另一种风格写法:allUV=obj.getUVSetNames() allUV = pm.polyUVSet(obj, query=True, allUVSets=True) #强制指定当前UV为self.baseUV pm.polyUVSet(obj, currentUVSet=True, uvSet=self.baseUV) #创建新UV为mwi_showUV if 'mwi_showUV' in allUV: pm.polyUVSet(obj, delete=True, uvSet='mwi_showUV') ##另外一种风格写法:obj.createUVSet('mwi_showUV') pm.polyUVSet(obj, create=True, uvSet='mwi_showUV') #复制当前UV到mwi_showUV pm.polyUVSet(obj, copy=True, nuv='mwi_showUV') #判断是否存在self.workUV的传入UV,不存在着创建self.workUV的传入UV if self.workUV not in allUV: pm.polyUVSet(obj, create=True, uvSet=self.workUV) #创建新UV为mwi_refUV if 'mwi_refUV' in allUV: pm.polyUVSet(obj, delete=True, uvSet='mwi_refUV') pm.polyUVSet(obj, create=True, uvSet='mwi_refUV') #复制self.workUV到mwi_refUV pm.polyUVSet(obj, copy=True, nuv='mwi_refUV', uvSet=self.workUV) print u'UV统一完毕' state = True return state
def select_set(self, *args): uvset = self.uvs.getSelectItem()[0].split(' | ') pm.polyUVSet(uvset[0], currentUVSet=True, uvSet=uvset[1])
def make_lightmap(): sel = pm.ls(sl=True) for s in sel: pm.polyUVSet(s, copy=True, uvSet='map1', newUVSet='lightmap')
def findFlatUvSet(self, s): sub = self.UvSetSearchName.getText().lower() flatUvSet = [n for n in pm.polyUVSet(s, q = True, allUVSets = True) if sub in n.lower()] if len(flatUvSet)>=1: return flatUvSet[0] else:pm.error('no matching UV set')
def grabUV(self): uv = pm.polyUVSet(cuv = 1, q = 1)[0] self.UvSetSearchName.setText(uv)
def get_uv_sets(): sel = pm.ls(sl=True) for s in sel: print(pm.polyUVSet(query=True, allUVSets=True))
def copy_uv_sets(): sel = pm.ls(sl=True) for s in sel: pm.polyUVSet(s, copy=True, uvSet='map1', newUVSet='lightmap')
def getUVSets(cls, *args, **kwargs): """ """ return pm.polyUVSet(query=True, allUVSets=True)
def UpdateUVs(self): z = self.uvZ() xy = self.uvXY() print uv self.original.setUV(z, uvSet="Z") self.original.setUV(xy, uvSet="XY") test = PivotPoint(selected[0]) test.UpdateUVs() print test.locator.getTransform().getTranslation() print test.vPosition #Setup UVSets for storing Pivots mesh = pm.ls(sl=True)[0].getShape() while len(pm.polyUVSet(mesh, auv=True, query=True)) < 4: #Pivots are encoding into UV2 UV3 pm.polyUVSet(mesh, copy=True) set = pm.polyUVSet(mesh, auv=True, query=True) setXY = set[2] setZ = set[3] pm.polyUVSet(mesh, rename=True, newUVSet='XY', uvSet=setXY) pm.polyUVSet(mesh, rename=True, newUVSet='Z', uvSet=setZ) selection = pm.polyListComponentConversion(pm.ls(sl=True), tv=True) pivot = pm.spaceLocator('PivotPoint') #Clear out existing XY.Z UVs
def removeExtraSets(cls, obj, *args, **kwargs): """ remove all uv sets except for the default one """ for i in pm.polyUVSet(obj, query=True, allUVSetsIndices=True)[1:]: name = pm.getAttr(obj + '.uvSet[' + str(i) + '].uvSetName') pm.polyUVSet(obj, delete=True, uvSet=name)
import pymel.core as pm sel=pm.ls(sl=True) for obj in sel: if obj.getShape().type()=='mesh': pm.polyQuad(obj,kgb=True,ws=True,khe=False,ktb=False) pm.polySoftEdge(obj,a=180) if pm.polyUVSet(obj,auv=True,q=True): if 'UVW' in pm.polyUVSet(obj,auv=True,q=True): pm.polyCopyUV(obj,uvSetNameInput="UVW", uvSetName="map1", ch=0) pm.polyUVSet(obj,uvs="UVW",delete=True) pm.delete(obj,ch=True) pm.select(sel,r=True) shaders=pm.ls(type='phong') for shader in shaders: if len(shader.split('_'))>1: name=shader.split('_')[1] else: name=shader shader.rename(name+'_MTL')
sl=pm.ls(l=1, sl=1) orig = "" sh = "" uvmap = [] slSz=len(sl) sc=sl[0] tg=sl[1:] i = 0 for i in xrange(len(tg)): sh=FindShMesh(sl[i]) uvmap=pm.polyUVSet(sh, q=1, cuv=1) orig=FindOrigMesh(sl[0]) if orig == "None": orig=FindShMesh(sl[0]) pm.select(orig,tg[i]) pm.transferAttributes(fuv=0, uvs=2, pos=0, clb=1, sus=str(uvmap[0]), sm=3, spa=1, nml=0, col=2) pm.delete(tg[i],ch=1) else: pm.setAttr((orig + ".intermediateObject"), 0) pm.select(sl[i]) pm.select(orig, add=1) pm.transferAttributes(fuv=0, uvs=2, pos=0, clb=1, sus=uvs[0], sm=3, spa=1, nml=0, col=2)