dd27aab4ce97a68ddc496d5918d8298eebbe1749
[blender.git] / release / scripts / uv_seams_from_islands.py
1 #!BPY
2 """
3 Name: 'Seams from Islands'
4 Blender: 243
5 Group: 'UV'
6 Tooltip: 'Add seams onto the mesh at the bounds of UV islands'
7 """
8
9 # Add a licence here if you wish to re-distribute, we recommend the GPL
10
11 from Blender import Scene, Mesh, Window, sys
12 import BPyMessages
13
14 def seams_from_islands(me):
15         # This function runs out of editmode with a mesh
16         # error cases are alredy checked for
17         
18         # next intex 
19         wrap_q = [1,2,3,0]
20         wrap_t = [1,2,0]
21         edge_uvs = {}
22         for f in me.faces:
23                 f_uv = [(round(uv.x, 6), round(uv.y, 6)) for uv in f.uv]
24                 f_vi = [v.index for v in f]
25                 for i, key in enumerate(f.edge_keys):
26                         if len(f)==3:
27                                 uv1, uv2 = f_uv[i], f_uv[wrap_t[i]]
28                                 vi1, vi2 = f_vi[i], f_vi[wrap_t[i]]
29                         else: # quad
30                                 uv1, uv2 = f_uv[i], f_uv[wrap_q[i]]
31                                 vi1, vi2 = f_vi[i], f_vi[wrap_q[i]]
32                                 
33                         if vi1 > vi2: uv1,uv2 = uv2,uv1
34                         
35                         edge_uvs.setdefault(key, []).append((uv1, uv2))
36         
37         # add seams
38         SEAM = Mesh.EdgeFlags.SEAM
39         for ed in me.edges:
40                 print len(set(edge_uvs[ed.key]))
41                 if len(set(edge_uvs[ed.key])) > 1:
42                         ed.flag |= SEAM
43
44 def main():
45         
46         # Gets the current scene, there can be many scenes in 1 blend file.
47         sce = Scene.GetCurrent()
48         
49         # Get the active object, there can only ever be 1
50         # and the active object is always the editmode object.
51         ob_act = sce.objects.active
52         me = ob_act.getData(mesh=1)
53         
54         if not ob_act or ob_act.type != 'Mesh' or not me.faceUV:
55                 BPyMessages.Error_NoMeshUvActive()
56                 return 
57         
58         # Saves the editmode state and go's out of 
59         # editmode if its enabled, we cant make
60         # changes to the mesh data while in editmode.
61         is_editmode = Window.EditMode()
62         if is_editmode: Window.EditMode(1)
63         
64         Window.WaitCursor(1)
65         
66         t = sys.time()
67         
68         # Run the mesh editing function
69         seams_from_islands(me)
70         
71         # Timing the script is a good way to be aware on any speed hits when scripting
72         print 'My Script finished in %.2f seconds' % (sys.time()-t)
73         Window.WaitCursor(0)
74         
75         
76 # This lets you can import the script without running it
77 if __name__ == '__main__':
78         main()