Advertisement
Guest User

Untitled

a guest
Dec 5th, 2017
377
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.83 KB | None | 0 0
  1. # 1. First select any faces or any object and click the Get checker size button. The checker size is now stored.
  2. # 2. If you want to set the checker size of the whole object click the 'Set Checker size of object(s)' button.
  3. # 3. Otherwise if you want to set the checker size of shells, click the 'Set Checker size of shells' button
  4.  
  5. # If 'Face shells' option is selected it will scale the UVs of a shell of faces as a whole, for all the shells
  6. # If 'UV Shells' option selected it will scale the UVs of a UV shell as a whole, for all the UV shells
  7.  
  8. # varun.bondwal@yahoo.com, varun.bondwal@gmail.com. Please report any bugs or suggestions.
  9. # v1.2 . Modified script to work in Maya 2012, 2013
  10.  
  11.  
  12. import maya.cmds as cmds
  13. import maya.mel as mel
  14. import maya.OpenMaya as om
  15. import string
  16. import math
  17.  
  18. def chk_str_in_str_array(S1,S2):
  19. flag=0
  20. for i in range(0,len(S2)):
  21. if S1==S2[i]:
  22. flag=1
  23. return flag
  24.  
  25. def get_sel_faces_UV_ratio(set_active):
  26. global active_ratio
  27. totalUVArea = 0
  28. totalFaceArea =0
  29. orig_sele=cmds.ls(sl=True, fl=True)
  30. if len(orig_sele)==0:
  31. om.MGlobal.displayError("Select at least one object")
  32. return
  33. areaParam = om.MScriptUtil()
  34. areaParam.createFromDouble(0.0)
  35. areaPtr = areaParam.asDoublePtr()
  36.  
  37. mel.eval("PolySelectConvert 1")
  38. sele=om.MSelectionList()
  39. om.MGlobal.getActiveSelectionList(sele)
  40. it=om.MItSelectionList(sele)
  41. while not it.isDone():
  42. dagPath=om.MDagPath()
  43. component=om.MObject()
  44. it.getDagPath(dagPath,component)
  45. fn=om.MFnDependencyNode(dagPath.node())
  46. if not component.isNull():
  47. if component.apiType()==om.MFn.kMeshPolygonComponent:
  48. itPoly=om.MItMeshPolygon(dagPath,component)
  49. while not itPoly.isDone():
  50.  
  51. itPoly.getUVArea(areaPtr)
  52. area = om.MScriptUtil.getDouble(areaPtr)
  53. totalUVArea += area
  54.  
  55. itPoly.getArea(areaPtr,om.MSpace.kWorld)
  56. area = om.MScriptUtil.getDouble(areaPtr)
  57. totalFaceArea += area
  58.  
  59. itPoly.next()
  60. it.next()
  61. UV_ratio=totalUVArea/totalFaceArea
  62. if set_active==1:
  63. active_ratio=UV_ratio
  64. if (len(orig_sele)>3):
  65. cmds.text(current_obj, edit=True , l = 'Objects : ' + 'Multiple objects')
  66. elif (len(orig_sele)==1):
  67. cmds.text(current_obj, edit=True , l = 'Object : ' + orig_sele[0])
  68. elif (len(orig_sele)==2):
  69. cmds.text(current_obj, edit=True , l = 'Objects : ' + orig_sele[0] + ', ' + orig_sele[1])
  70. elif (len(orig_sele)==3):
  71. cmds.text(current_obj, edit=True , l = 'Objects : ' + orig_sele[0] + ', ' + orig_sele[1] + ', ' + orig_sele[2])
  72. mel.eval("select -cl")
  73. for i in range(0,len(orig_sele)):
  74. mel.eval("select -add " + orig_sele[i])
  75. return UV_ratio
  76.  
  77.  
  78. def collect_shells(): # returns a list containing one UV from all UV shells of the selected object
  79. mel.eval("ConvertSelectionToUVs")
  80. main_list=cmds.ls(sl=True,fl=True)
  81. UV=cmds.ls(sl=True, fl=True)
  82. new_list=[" "]
  83. while (len(main_list)>0):
  84. #cmds.select(cl=True)
  85. new_list.append(main_list[0])
  86. mel.eval("select "+ main_list[0])
  87. mel.eval("SelectUVShell")
  88. temp_shell=cmds.ls(sl=True,fl=True)
  89. for j in range(0,len(temp_shell)):
  90. main_list.remove(temp_shell[j])
  91.  
  92. new_list.remove(" ")
  93. return new_list
  94.  
  95.  
  96. def get_UV_ratio(set_active): #returns uv ratio of selected object
  97. global active_ratio
  98. sList = om.MSelectionList()
  99. dagp = om.MDagPath()
  100. mobj = om.MObject()
  101.  
  102. sele=cmds.ls(sl=True, fl=True)
  103.  
  104. sList.add(sele[0])
  105. sIter = om.MItSelectionList(sList)
  106. sIter.getDagPath(dagp, mobj)
  107. pIter = om.MItMeshPolygon(dagp)
  108.  
  109. areaParam = om.MScriptUtil()
  110. areaParam.createFromDouble(0.0)
  111. areaPtr = areaParam.asDoublePtr()
  112. totalUVArea = 0
  113. totalFaceArea =0
  114. while not pIter.isDone():
  115. pIter.getUVArea(areaPtr)
  116. area = om.MScriptUtil(areaPtr).asDouble()
  117. totalUVArea += area
  118.  
  119. pIter.getArea(areaPtr,om.MSpace.kWorld)
  120. area = om.MScriptUtil(areaPtr).asDouble()
  121. totalFaceArea += area
  122.  
  123. pIter.next()
  124. UV_ratio=totalUVArea/totalFaceArea
  125. print "UV area"
  126. print totalUVArea
  127. print "total face area"
  128. print totalFaceArea
  129. if set_active==1:
  130. active_ratio=UV_ratio
  131. return UV_ratio
  132.  
  133. def set_UV_ratio(obj):
  134. try:
  135. print active_ratio
  136. except:
  137. om.MGlobal.displayError("Please pick a checker size first")
  138. return
  139.  
  140. orig_sele=cmds.ls(sl=True, fl=True)
  141. if len(orig_sele)==0:
  142. om.MGlobal.displayError("Select at least one object")
  143. return
  144. prog=0.00
  145. cmds.progressBar(progressControl, edit=True, visible=True)
  146. cmds.progressBar(progressControl, edit=True, beginProgress=True)
  147.  
  148. for i in range(0,len(orig_sele)):
  149. if (len(orig_sele)!=0):
  150. if (obj==1):
  151. prog+=(i*1.000/len(orig_sele)*1.000)*20
  152. cmds.progressBar(progressControl, edit=True, pr=prog)
  153. else:
  154. prog+=(i*1.000/len(orig_sele)*1.000)*15
  155. cmds.progressBar(progressControl, edit=True, pr=4+prog)
  156. cmds.select(cl=True)
  157. mel.eval("select " + orig_sele[i])
  158. current_ratio=get_sel_faces_UV_ratio(0)
  159. if current_ratio==0:
  160. current_ratio=1
  161. scale_factor=active_ratio/current_ratio
  162. scale_factor=math.sqrt(scale_factor)
  163. mel.eval("PolySelectConvert 4")
  164. UV_bounds=cmds.polyEvaluate(bc2=True)
  165. u_pivot = (UV_bounds[0][0]+UV_bounds[0][1])/2
  166. v_pivot = (UV_bounds[1][0]+UV_bounds[1][1])/2
  167.  
  168. cmds.polyEditUV(pu=u_pivot, pv=v_pivot, su=scale_factor, sv=scale_factor)
  169.  
  170. cmds.select(cl=True)
  171. for i in range(0,len(orig_sele)):
  172. mel.eval("select -add " + orig_sele[i])
  173.  
  174. cmds.progressBar( progressControl,edit=True, endProgress=True)
  175. cmds.progressBar(progressControl, edit=True, visible=False)
  176. om.MGlobal.displayInfo("Done")
  177.  
  178.  
  179.  
  180. def collect_shells_and_set_shells_UV_ratio():
  181. orig_sele=cmds.ls(sl=True, fl=True)
  182.  
  183. mel.eval("ConvertSelectionToUVs")
  184. main_list=cmds.ls(sl=True,fl=True)
  185. UV=cmds.ls(sl=True, fl=True)
  186. new_list=[" "]
  187.  
  188. orig_len=len(main_list)
  189. cmds.progressBar(progressControl, edit=True, beginProgress=True)
  190. cmds.progressBar(progressControl, edit=True, visible=True)
  191. while (len(main_list)>0):
  192. mel.eval("select "+ main_list[0])
  193. mel.eval("SelectUVShell")
  194. prog=((1.000*orig_len-1.000*len(main_list))/(1.000*orig_len))*20
  195. cmds.progressBar(progressControl, edit=True, pr=prog)
  196.  
  197.  
  198. current_ratio=get_sel_faces_UV_ratio(0)
  199. if current_ratio==0:
  200. current_ratio=1
  201. scale_factor=active_ratio/current_ratio
  202. scale_factor=math.sqrt(scale_factor)
  203. mel.eval("PolySelectConvert 4;") #to UVs
  204. UV_bounds=cmds.polyEvaluate(bc2=True)
  205. u_pivot = (UV_bounds[0][0]+UV_bounds[0][1])/2
  206. v_pivot = (UV_bounds[1][0]+UV_bounds[1][1])/2
  207.  
  208. cmds.polyEditUV(pu=u_pivot, pv=v_pivot, su=scale_factor, sv=scale_factor)
  209.  
  210. temp_shell=cmds.ls(sl=True,fl=True)
  211. for j in range(0,len(temp_shell)):
  212. main_list.remove(temp_shell[j])
  213.  
  214. new_list.remove(" ")
  215. cmds.select(cl=True)
  216. for i in range(0,len(orig_sele)):
  217. mel.eval("select -add " + orig_sele[i])
  218.  
  219. cmds.progressBar( progressControl,edit=True, endProgress=True)
  220. cmds.progressBar(progressControl, edit=True, visible=False)
  221. om.MGlobal.displayInfo("Done")
  222. return new_list
  223.  
  224.  
  225. def set_shells_UV_ratio():
  226. orig_sele=cmds.ls(sl=True, fl=True)
  227.  
  228. sele=cmds.ls(sl=True, fl=True)
  229. if (len(sele)>1):
  230. om.MGlobal.displayError("Select only one object")
  231. return
  232. shells=collect_shells()
  233. for i in range(0, len(shells)):
  234. cmds.select(cl=True)
  235. mel.eval("select "+ shells[i])
  236. mel.eval("SelectUVShell")
  237. #mel.eval("PolySelectConvert 1") # to faces
  238.  
  239. current_ratio=get_sel_faces_UV_ratio(0)
  240. scale_factor=active_ratio/current_ratio
  241. scale_factor=math.sqrt(scale_factor)
  242. mel.eval("PolySelectConvert 4;") #to UVs
  243. UV_bounds=cmds.polyEvaluate(bc2=True)
  244. u_pivot = (UV_bounds[0][0]+UV_bounds[0][1])/2
  245. v_pivot = (UV_bounds[1][0]+UV_bounds[1][1])/2
  246.  
  247. cmds.polyEditUV(pu=u_pivot, pv=v_pivot, su=scale_factor, sv=scale_factor)
  248.  
  249. cmds.select(cl=True)
  250. for i in range(0,len(orig_sele)):
  251. mel.eval("select -add " + orig_sele[i])
  252.  
  253.  
  254. def show_window():
  255. global progressControl
  256. global current_obj
  257. global radio_col
  258. UV_window = cmds.window( title="Maya Checker Size Tool", iconName='Short Name', rtf = 1, s=1, widthHeight=(300, 100), mxb = 0 )
  259.  
  260. if cmds.window(UV_window, ex = True ):
  261. cmds.deleteUI( UV_window,window=True)
  262. UV_window = cmds.window( title="Maya Checker Size Tool", iconName='Short Name', rtf = 1, s=1, widthHeight=(300, 100), mxb = 0 )
  263. cmds.columnLayout( adjustableColumn=True )
  264. cmds.frameLayout(label ="Get Size", w = 30 , h = 80 , mh = 5, mw = 5, bs = "etchedOut" )
  265. cmds.columnLayout( adjustableColumn=True )
  266. UV_get_but = cmds.button( label='Pick Checker Size',en=True, annotation='Store the checker size', command = 'get_sel_faces_UV_ratio(1)' )
  267. current_obj= cmds.text(w = 175 , l = '' , al = 'center')
  268. cmds.setParent( '..' )
  269. cmds.setParent( '..' )
  270. cmds.frameLayout(label ="Set Size", w = 30 , h = 110 , mh = 5, mw = 5, bs = "etchedOut" )
  271. cmds.columnLayout( adjustableColumn=True )
  272. UV_set_but = cmds.button( label='Set Checker Size of object(s)',en=True,annotation='Change checker size of one or more meshes', command='set_UV_ratio(1)')
  273. UV_shell_but = cmds.button( label='Set Checker Size of shells (Single object)', en = True,annotation='Change checker size of object with several shells', command='set_shell_button()')
  274. cmds.rowLayout( numberOfColumns=2, columnWidth2=(100, 100))
  275. radio_col=cmds.radioCollection()
  276. cmds.radioButton('radio_Face', label = 'Face shells', al = 'left')
  277. cmds.radioButton('radio_UV', label = 'UV shells',al = 'left')
  278. cmds.setParent( '..' )
  279. cmds.setParent( '..' )
  280. cmds.setParent( '..' )
  281. cmds.columnLayout( adjustableColumn=True )
  282. progressControl = cmds.progressBar(maxValue=20, width=300)
  283. cmds.progressBar(progressControl, edit=True, visible=False)
  284. cmds.text(w = 175 , l = 'varunbondwal@yahoo.com ' , al = 'right')
  285. cmds.setParent( '..' )
  286. cmds.setParent( '..' )
  287.  
  288. cmds.showWindow( UV_window )
  289.  
  290. def set_shell_button():
  291. tmp_sele=cmds.ls(sl=True, fl=True)
  292.  
  293. try:
  294. print active_ratio
  295. except:
  296. om.MGlobal.displayError("Please pick a checker size first")
  297. return
  298.  
  299. if(len(tmp_sele)==1):
  300. mel.eval("constructionHistory -toggle false")
  301. mel.eval("autoUpdateAttrEd")
  302. mel.eval("updateConstructionHistory")
  303. selected_button = cmds.radioCollection(radio_col,query=1,sl=1)
  304. if (selected_button=="radio_UV"):
  305. collect_shells_and_set_shells_UV_ratio()
  306. else:
  307. shell_UV_scaler()
  308. mel.eval("constructionHistory -toggle false")
  309. mel.eval("autoUpdateAttrEd")
  310. mel.eval("updateConstructionHistory")
  311. else:
  312. om.MGlobal.displayError("Select only one object")
  313.  
  314.  
  315. def shell_UV_scaler():
  316. global sele
  317. sele=cmds.ls(sl=True, fl=True)
  318. if len(sele)>1:
  319. om.MGlobal.displayError("Select only one object")
  320. return
  321. mel.eval("select " + sele[0])
  322. old_mesh_dupe=cmds.duplicate()
  323. cmds.progressBar( progressControl,edit=True, beginProgress=True)
  324. cmds.progressBar(progressControl, edit=True, visible=True)
  325. try:
  326. separated = cmds.polySeparate(ch=True)
  327. cmds.progressBar(progressControl, edit=True, pr=5)
  328. set_UV_ratio(0);
  329. combined_mesh=cmds.polyUnite(ch=True)
  330. mel.eval("polyTransfer -uv 1 -ch off -ao \"" + combined_mesh[0] + "\" \"" + sele[0] + "\"");
  331. cmds.delete(combined_mesh[0])
  332. mel.eval("select "+ sele[0])
  333. cmds.progressBar(progressControl, edit=True, pr=0)
  334. except:
  335. cmds.delete(old_mesh_dupe)
  336. mel.eval("select " + sele[0])
  337. om.MGlobal.displayError("The object has only one face shell")
  338. cmds.progressBar(progressControl, edit=True, endProgress=True)
  339. cmds.progressBar(progressControl, edit=True, visible=False)
  340. om.MGlobal.displayInfo("Done")
  341.  
  342.  
  343. show_window()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement