forked from bartvdbraak/blender
3e1a5ce7a2
moved bpy into bpy.data and bpy will be eventually replace the root level 'Blender' module. currently we have bpy.library bpy.config and bpy.data
136 lines
3.8 KiB
Python
136 lines
3.8 KiB
Python
#!BPY
|
|
"""
|
|
Name: 'UVs from unselected adjacent'
|
|
Blender: 242
|
|
Group: 'UVCalculation'
|
|
Tooltip: 'Assign UVs to selected faces from surrounding unselected faces.'
|
|
"""
|
|
__author__ = "Campbell Barton"
|
|
__url__ = ("blender", "elysiun")
|
|
__version__ = "1.0 2006/02/07"
|
|
|
|
__bpydoc__ = """\
|
|
This script sets the UV mapping and image of selected faces from adjacent unselected faces.
|
|
|
|
Use this script in face select mode for texturing between textured faces.
|
|
"""
|
|
|
|
# ***** BEGIN GPL LICENSE BLOCK *****
|
|
#
|
|
# Script copyright (C) Campbell J Barton
|
|
#
|
|
# This program is free software; you can redistribute it and/or
|
|
# modify it under the terms of the GNU General Public License
|
|
# as published by the Free Software Foundation; either version 2
|
|
# of the License, or (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software Foundation,
|
|
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
#
|
|
# ***** END GPL LICENCE BLOCK *****
|
|
# --------------------------------------------------------------------------
|
|
|
|
|
|
from Blender import *
|
|
import bpy
|
|
|
|
def mostUsedImage(imageList): # Returns the image most used in the list.
|
|
if not imageList:
|
|
return None
|
|
elif len(imageList) < 3:
|
|
return imageList[0]
|
|
|
|
# 3+ Images, Get the most used image for surrounding faces.
|
|
imageCount = {}
|
|
for image in imageList:
|
|
if image:
|
|
image_key= image.name
|
|
else:
|
|
image_key = None
|
|
|
|
try:
|
|
imageCount[image_key]['imageCount'] +=1 # an extra user of this image
|
|
except:
|
|
imageCount[image_key] = {'imageCount':1, 'blenderImage':image} # start with 1 user.
|
|
|
|
# Now a list of tuples, (imageName, {imageCount, image})
|
|
imageCount = imageCount.items()
|
|
|
|
try: imageCount.sort(key=lambda a: a[1])
|
|
except: imageCount.sort(lambda a,b: cmp(a[1], b[1]))
|
|
|
|
|
|
return imageCount[-1][1]['blenderImage']
|
|
|
|
|
|
def main():
|
|
scn = bpy.data.scenes.active
|
|
ob = scn.objects.active
|
|
if ob == None or ob.type != 'Mesh':
|
|
Draw.PupMenu('ERROR: No mesh object in face select mode.')
|
|
return
|
|
me = ob.getData(mesh=1)
|
|
|
|
if not me.faceUV:
|
|
Draw.PupMenu('ERROR: No mesh object in face select mode.')
|
|
return
|
|
|
|
SELECT_FLAG = Mesh.FaceFlags.SELECT
|
|
HIDE_FLAG = Mesh.FaceFlags.HIDE
|
|
def use_face(f_flag):
|
|
if f_flag & HIDE_FLAG: return False
|
|
elif f_flag & SELECT_FLAG: return True
|
|
else: return False
|
|
|
|
selfaces = [f for f in me.faces if use_face(f.flag)]
|
|
unselfaces = [f for f in me.faces if not use_face(f.flag)]
|
|
|
|
# Gather per Vert UV and Image, store in vertUvAverage
|
|
vertUvAverage = [[[],[]] for i in xrange(len(me.verts))]
|
|
|
|
for f in unselfaces: # Unselected faces only.
|
|
fuv = f.uv
|
|
for i,v in enumerate(f):
|
|
vertUvAverage[v.index][0].append(fuv[i])
|
|
vertUvAverage[v.index][1].append(f.image)
|
|
|
|
# Average per vectex UV coords
|
|
for vertUvData in vertUvAverage:
|
|
uvList = vertUvData[0]
|
|
if uvList:
|
|
# Convert from a list of vectors into 1 vector.
|
|
vertUvData[0] = reduce(lambda a,b: a+b, uvList, Mathutils.Vector(0,0)) * (1.0/len(uvList))
|
|
else:
|
|
vertUvData[0] = None
|
|
|
|
|
|
|
|
# Assign to selected faces
|
|
TEX_FLAG = Mesh.FaceModes['TEX']
|
|
for f in selfaces:
|
|
uvlist = []
|
|
imageList = []
|
|
for i,v in enumerate(f):
|
|
uv, vImages = vertUvAverage[v.index]
|
|
uvlist.append( uv )
|
|
imageList.extend(vImages)
|
|
|
|
if None not in uvlist:
|
|
# all the faces images used by this faces vert. some faces will be added twice but thats ok.
|
|
# Get the most used image and assign to the face.
|
|
image = mostUsedImage(imageList)
|
|
f.uv = uvlist
|
|
|
|
if image:
|
|
f.image = image
|
|
f.mode |= TEX_FLAG
|
|
Window.RedrawAll()
|
|
|
|
if __name__ == '__main__':
|
|
main() |