
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report
Hi all,
This is a difficult one to explain and I think that it probably arises from my lack of knowledge of how UVs actually work.
I've written a script that aligns a UV shell orthogonal to a selected edge, however it only seems to work when I select certain edges. When it doesn't work it's because the selected edge will only convert to one UV point (ID?) when I call polyListComponentConversion(). What I want to know is why some edges that I select will convert to two UVs, and some will only convert to one. It seems like border edges happily convert to two UVs.
For instance, selecting this edge, between UV points 88 and 99 will return an error, because the conversion will only return one UV ID.
However, selecting this edge will work fine, and I can't understand why.
As far as I can see, both of these edges are connected to two UV points, so would one work and the other not?
Thanks!
Code is attached in full below.
''' Created on 18 Jul 2016 @author: BenjiA About: This tool attempts to rotate a UV shell so that it is oriented 90 degrees orthogonal to the edge that you select Use: Select an edge and run the tool, if you get a list index out of range error, try another edge ''' import pymel.core as pm; import maya.api.OpenMaya as om; def GetSel(): #Get the selected edge sel = pm.selected(); if not sel: raise RuntimeError('Select an edge or a face, and run the tool again'); else: selType = pm.nodeType(sel); #make sure its an edge by converting it to an edge selEdge = pm.polyListComponentConversion(te=1); return selEdge[0]; def GetVectorsAndRotate(sel): #convert the edge selection to uvs selUVs = pm.polyListComponentConversion(tuv=1); if len(selUVs) < 2: print 'selUvs length is ' + str(len(selUVs)); raise RuntimeError('Select a face or an edge with more connected UV point'); else: print 'selUvs length is ' + str(len(selUVs)); #get the two UV points individually UV0 = pm.polyEditUV(selUVs[0], query=1, u=1, v=1); UV1 = pm.polyEditUV(selUVs[1], query=1, u=1, v=1); #work out the vector that represents the edge between the UV points edgeVect = pm.datatypes.Vector((UV0[0] - UV1[0]), (UV0[1] - UV1[1])); #normalize it edgeVect = edgeVect.normal(); print 'Edge vector is:', edgeVect; #get the vector orthogonal to the edge vector orthVect = pm.datatypes.Vector(-edgeVect[1], edgeVect[0]); #normalize it orthVect = orthVect.normal(); print 'Perpendicular vector is:', orthVect; #calculate the arctangent of the orthogonal vector atan = pm.datatypes.atan2(orthVect[1], orthVect[0]); print 'Arctangent is:', atan; #convert the arctangent to degrees degrees = pm.datatypes.degrees(atan); print 'Atan to degree conversion is:', degrees; #get the parent object of the selected uv points selObj = pm.PyNode(sel, s=1); selObj = selObj.split("."); selParent = pm.PyNode(selObj[0]).getParent(); #select the whole shell selFaces = pm.polySelect(ets=1); #rotate the shell by the calculated degrees pm.polyEditUV(a=-degrees, pu=0.5, pv=0.5); GetVectorsAndRotate(GetSel());
Solved! Go to Solution.