Advertisement
Guest User

Untitled

a guest
Mar 19th, 2021
522
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.23 KB | None | 0 0
  1. import bpy
  2.  
  3. import bpy_extras
  4. import bpy_extras.mesh_utils
  5. import bmesh
  6.  
  7.  
  8. def get_new_linked_faces(faces, isl_2):
  9.     new_linked_faces = []
  10.     for face in faces:
  11.         for v in face.verts:
  12.             for face2 in v.link_faces:
  13.                 face_id = face2.index
  14.                 if face_id in isl_2 and face2 not in new_linked_faces:
  15.                     new_linked_faces.append(face2)
  16.  
  17.     return new_linked_faces
  18.  
  19.  
  20. def parse_sub_islands(isl, bm):
  21.     isl_2 = isl.copy()
  22.     sub_isls = []
  23.  
  24.     linked_faces = []
  25.  
  26.     first_face = bm.faces[isl_2[0]]
  27.     linked_faces.append(isl_2[0])
  28.     parse_faces = [first_face]
  29.     isl_2.remove(isl_2[0])
  30.  
  31.     while parse_faces:
  32.  
  33.         new_faces = get_new_linked_faces(parse_faces, isl_2)
  34.         if new_faces:
  35.             for face in new_faces:
  36.                 linked_faces.append(face.index)
  37.                 isl_2.remove(face.index)
  38.                 parse_faces = new_faces
  39.  
  40.         elif isl_2:
  41.             if linked_faces:
  42.                 sub_isls.append(linked_faces.copy())
  43.  
  44.             linked_faces = []
  45.  
  46.             parse_faces = [bm.faces[isl_2[0]]]
  47.             linked_faces.append(isl_2[0])
  48.             isl_2.remove(isl_2[0])
  49.  
  50.         else:
  51.             if linked_faces:
  52.                 sub_isls.append(linked_faces.copy())
  53.  
  54.             linked_faces = None
  55.             new_faces = None
  56.             parse_faces = None
  57.             break
  58.  
  59.     return sub_isls
  60.  
  61.  
  62. if bpy.context.mode != 'OBJECT':
  63.     bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
  64.  
  65. active_obj = bpy.context.active_object
  66. context_mode = active_obj.mode
  67. bm = bmesh.new()
  68. bm.from_mesh(active_obj.data)
  69.  
  70. bm.faces.ensure_lookup_table()
  71. bm.verts.ensure_lookup_table()
  72.  
  73. islands = bpy_extras.mesh_utils.mesh_linked_uv_islands(active_obj.data)
  74.  
  75. # decompose to sub-islands
  76. islands_dec = []
  77. for isl_id, isl in enumerate(islands):
  78.     if isl:
  79.         if len(isl) > 1:
  80.             new_isl = parse_sub_islands(isl, bm)
  81.             islands_dec += new_isl
  82.         else:
  83.             islands_dec.append(isl.copy())
  84.  
  85.  
  86. # Revert back
  87. bpy.ops.object.mode_set(mode=context_mode, toggle=False)
  88.  
  89.  
  90. print('Default mesh_linked_uv_islands ', islands)
  91. print('Improved mesh_linked_uv_islands ', islands_dec)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement