bugfix, edges with no faces raised an error.
[blender.git] / release / scripts / uv_seams_from_islands.py
1 #!BPY
2 """
3 Name: 'Seams from Islands'
4 Blender: 246
5 Group: 'UV'
6 Tooltip: 'Add seams onto the mesh at the bounds of UV islands'
7 """
8
9 # ***** BEGIN GPL LICENSE BLOCK *****
10 #
11 # Script copyright (C) Campbell Barton
12 #
13 # This program is free software; you can redistribute it and/or
14 # modify it under the terms of the GNU General Public License
15 # as published by the Free Software Foundation; either version 2
16 # of the License, or (at your option) any later version.
17 #
18 # This program is distributed in the hope that it will be useful,
19 # but WITHOUT ANY WARRANTY; without even the implied warranty of
20 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21 # GNU General Public License for more details.
22 #
23 # You should have received a copy of the GNU General Public License
24 # along with this program; if not, write to the Free Software Foundation,
25 # Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
26 #
27 # ***** END GPL LICENCE BLOCK *****
28 # --------------------------------------------------------------------------
29
30 from Blender import Scene, Mesh, Window, sys
31 import BPyMessages
32
33 def seams_from_islands(me):
34         # This function runs out of editmode with a mesh
35         # error cases are alredy checked for
36         
37         # next intex 
38         wrap_q = [1,2,3,0]
39         wrap_t = [1,2,0]
40         edge_uvs = {}
41         for f in me.faces:
42                 f_uv = [(round(uv.x, 6), round(uv.y, 6)) for uv in f.uv]
43                 f_vi = [v.index for v in f]
44                 for i, key in enumerate(f.edge_keys):
45                         if len(f)==3:
46                                 uv1, uv2 = f_uv[i], f_uv[wrap_t[i]]
47                                 vi1, vi2 = f_vi[i], f_vi[wrap_t[i]]
48                         else: # quad
49                                 uv1, uv2 = f_uv[i], f_uv[wrap_q[i]]
50                                 vi1, vi2 = f_vi[i], f_vi[wrap_q[i]]
51                                 
52                         if vi1 > vi2: uv1,uv2 = uv2,uv1
53                         
54                         edge_uvs.setdefault(key, []).append((uv1, uv2))
55         
56         # add seams
57         SEAM = Mesh.EdgeFlags.SEAM
58         for ed in me.edges:
59                 try: # the edge might not be in a face
60                         if len(set(edge_uvs[ed.key])) > 1:
61                                 ed.flag |= SEAM
62                 except:
63                         pass
64
65 def main():
66         
67         # Gets the current scene, there can be many scenes in 1 blend file.
68         sce = Scene.GetCurrent()
69         
70         # Get the active object, there can only ever be 1
71         # and the active object is always the editmode object.
72         ob_act = sce.objects.active
73         me = ob_act.getData(mesh=1)
74         
75         if not ob_act or ob_act.type != 'Mesh' or not me.faceUV:
76                 BPyMessages.Error_NoMeshUvActive()
77                 return 
78         
79         # Saves the editmode state and go's out of 
80         # editmode if its enabled, we cant make
81         # changes to the mesh data while in editmode.
82         is_editmode = Window.EditMode()
83         if is_editmode: Window.EditMode(0)
84         
85         Window.WaitCursor(1)
86         
87         t = sys.time()
88         
89         # Run the mesh editing function
90         seams_from_islands(me)
91         
92         if is_editmode: Window.EditMode(1)
93         
94         # Timing the script is a good way to be aware on any speed hits when scripting
95         print 'UV Seams from Islands finished in %.2f seconds' % (sys.time()-t)
96         Window.WaitCursor(0)
97         
98         
99 # This lets you can import the script without running it
100 if __name__ == '__main__':
101         main()