Fix for bug #12806: compositor nodes with use nodes disabled
[blender.git] / release / scripts / uv_from_adjacent.py
1 #!BPY
2 """
3 Name: 'UVs from unselected adjacent'
4 Blender: 242
5 Group: 'UVCalculation'
6 Tooltip: 'Assign UVs to selected faces from surrounding unselected faces.'
7 """
8 __author__ = "Campbell Barton"
9 __url__ = ("blender", "blenderartists.org")
10 __version__ = "1.0 2006/02/07"
11
12 __bpydoc__ = """\
13 This script sets the UV mapping and image of selected faces from adjacent unselected faces.
14
15 Use this script in face select mode for texturing between textured faces.
16 """
17
18 # ***** BEGIN GPL LICENSE BLOCK *****
19 #
20 # Script copyright (C) Campbell J Barton
21 #
22 # This program is free software; you can redistribute it and/or
23 # modify it under the terms of the GNU General Public License
24 # as published by the Free Software Foundation; either version 2
25 # of the License, or (at your option) any later version.
26 #
27 # This program is distributed in the hope that it will be useful,
28 # but WITHOUT ANY WARRANTY; without even the implied warranty of
29 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
30 # GNU General Public License for more details.
31 #
32 # You should have received a copy of the GNU General Public License
33 # along with this program; if not, write to the Free Software Foundation,
34 # Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
35 #
36 # ***** END GPL LICENCE BLOCK *****
37 # --------------------------------------------------------------------------
38
39
40 from Blender import *
41 import bpy
42
43 def mostUsedImage(imageList): # Returns the image most used in the list.
44         if not imageList:
45                 return None
46         elif len(imageList) < 3:
47                 return imageList[0]
48         
49         # 3+ Images, Get the most used image for surrounding faces.
50         imageCount = {}
51         for image in imageList:
52                 if image:
53                         image_key= image.name
54                 else:
55                         image_key = None
56                 
57                 try:
58                         imageCount[image_key]['imageCount'] +=1 # an extra user of this image
59                 except:
60                         imageCount[image_key] = {'imageCount':1, 'blenderImage':image} # start with 1 user.
61         
62         # Now a list of tuples, (imageName, {imageCount, image})
63         imageCount = imageCount.items()
64         
65         try:    imageCount.sort(key=lambda a: a[1])
66         except: imageCount.sort(lambda a,b: cmp(a[1], b[1]))
67         
68         
69         return imageCount[-1][1]['blenderImage']        
70
71
72 def main():
73         sce = bpy.data.scenes.active
74         ob = sce.objects.active
75         
76         if ob == None or ob.type != 'Mesh':
77                 Draw.PupMenu('ERROR: No mesh object in face select mode.')
78                 return
79         me = ob.getData(mesh=1)
80         
81         if not me.faceUV:
82                 Draw.PupMenu('ERROR: No mesh object in face select mode.')
83                 return
84         
85         selfaces = [f for f in me.faces if f.sel]
86         unselfaces = [f for f in me.faces if not f.sel]
87         
88         
89         # Gather per Vert UV and Image, store in vertUvAverage
90         vertUvAverage = [[[],[]] for i in xrange(len(me.verts))]
91         
92         for f in unselfaces: # Unselected faces only.
93                 fuv = f.uv
94                 for i,v in enumerate(f):
95                         vertUvAverage[v.index][0].append(fuv[i])
96                         vertUvAverage[v.index][1].append(f.image)
97                         
98         # Average per vectex UV coords
99         for vertUvData in vertUvAverage:
100                 uvList = vertUvData[0]
101                 if uvList:
102                         # Convert from a list of vectors into 1 vector.
103                         vertUvData[0] = reduce(lambda a,b: a+b, uvList, Mathutils.Vector(0,0)) * (1.0/len(uvList))
104                 else:
105                         vertUvData[0] = None
106         
107         # Assign to selected faces
108         TEX_FLAG = Mesh.FaceModes['TEX']
109         for f in selfaces:
110                 uvlist = []
111                 imageList = []
112                 for i,v in enumerate(f):
113                         uv, vImages = vertUvAverage[v.index]
114                         uvlist.append( uv )
115                         imageList.extend(vImages)
116                 
117                 if None not in uvlist:                  
118                         # all the faces images used by this faces vert. some faces will be added twice but thats ok.
119                         # Get the most used image and assign to the face.
120                         image = mostUsedImage(imageList) 
121                         f.uv = uvlist
122                         
123                         if image:
124                                 f.image = image
125                                 f.mode |= TEX_FLAG
126         Window.RedrawAll()
127         
128 if __name__ == '__main__':
129         main()