forked from bartvdbraak/blender
pep8 corrections and no need to use C's _OT_ syntax when accessing operator names from py
This commit is contained in:
parent
8d996df7ce
commit
c3b978828c
@ -258,7 +258,7 @@ class Mesh(bpy_types.ID):
|
||||
'''
|
||||
|
||||
OTHER_INDEX = 2,3,0,1 # opposite face index
|
||||
|
||||
|
||||
if faces is None:
|
||||
faces= self.faces
|
||||
|
||||
@ -270,13 +270,13 @@ class Mesh(bpy_types.ID):
|
||||
edge_keys = f.edge_keys
|
||||
for i, edkey in enumerate(f.edge_keys):
|
||||
edges.setdefault(edkey, []).append(edge_keys[OTHER_INDEX[i]])
|
||||
|
||||
|
||||
for edkey in seams:
|
||||
edges[edkey] = []
|
||||
|
||||
|
||||
# Collect edge loops here
|
||||
edge_loops = []
|
||||
|
||||
edge_loops = []
|
||||
|
||||
for edkey, ed_adj in edges.items():
|
||||
if 0 <len(ed_adj) < 3: # 1 or 2
|
||||
# Seek the first edge
|
||||
@ -286,22 +286,22 @@ class Mesh(bpy_types.ID):
|
||||
other_dir = ed_adj[1]
|
||||
else:
|
||||
other_dir = None
|
||||
|
||||
|
||||
ed_adj[:] = []
|
||||
|
||||
|
||||
flipped = False
|
||||
|
||||
|
||||
while 1:
|
||||
# from knowing the last 2, look for th next.
|
||||
ed_adj = edges[context_loop[-1]]
|
||||
if len(ed_adj) != 2:
|
||||
|
||||
|
||||
if other_dir and flipped==False: # the original edge had 2 other edges
|
||||
flipped = True # only flip the list once
|
||||
context_loop.reverse()
|
||||
ed_adj[:] = []
|
||||
context_loop.append(other_dir) # save 1 lookiup
|
||||
|
||||
|
||||
ed_adj = edges[context_loop[-1]]
|
||||
if len(ed_adj) != 2:
|
||||
ed_adj[:] = []
|
||||
@ -309,14 +309,14 @@ class Mesh(bpy_types.ID):
|
||||
else:
|
||||
ed_adj[:] = []
|
||||
break
|
||||
|
||||
|
||||
i = ed_adj.index(context_loop[-2])
|
||||
context_loop.append( ed_adj[ not i] )
|
||||
|
||||
|
||||
# Dont look at this again
|
||||
ed_adj[:] = []
|
||||
|
||||
|
||||
|
||||
return edge_loops
|
||||
|
||||
|
||||
|
@ -50,8 +50,8 @@ img_format_exts = {
|
||||
'THEORA':'ogg',
|
||||
}
|
||||
|
||||
movie_formats = ('QUICKTIME_QTKIT',
|
||||
'QUICKTIME_CARBONTKIT',
|
||||
movie_formats = ('QUICKTIME_QTKIT',
|
||||
'QUICKTIME_CARBONTKIT',
|
||||
'AVIRAW',
|
||||
'AVIJPEG',
|
||||
'AVICODEC',
|
||||
@ -62,30 +62,30 @@ movie_formats = ('QUICKTIME_QTKIT',
|
||||
def guess_player_path(preset):
|
||||
if preset == 'BLENDER24':
|
||||
player_path = 'blender'
|
||||
|
||||
|
||||
if platform.system() == 'Darwin':
|
||||
test_path = '/Applications/blender 2.49.app/Contents/MacOS/blender'
|
||||
elif platform.system() == 'Windows':
|
||||
test_path = '/Program Files/Blender Foundation/Blender/blender.exe'
|
||||
|
||||
|
||||
if os.path.exists(test_path):
|
||||
player_path = test_path
|
||||
|
||||
elif preset == 'DJV':
|
||||
player_path = 'djv_view'
|
||||
|
||||
|
||||
if platform.system() == 'Darwin':
|
||||
test_path = '/Applications/djv-0.8.2.app/Contents/Resources/bin/djv_view'
|
||||
if os.path.exists(test_path):
|
||||
player_path = test_path
|
||||
|
||||
|
||||
elif preset == 'FRAMECYCLER':
|
||||
player_path = 'framecycler'
|
||||
|
||||
|
||||
elif preset == 'RV':
|
||||
player_path = 'rv'
|
||||
|
||||
|
||||
|
||||
|
||||
return player_path
|
||||
|
||||
|
||||
@ -100,15 +100,15 @@ class PlayRenderedAnim(bpy.types.Operator):
|
||||
sce = context.scene
|
||||
rd = sce.render_data
|
||||
prefs = context.user_preferences
|
||||
|
||||
|
||||
preset = prefs.filepaths.animation_player_preset
|
||||
player_path = prefs.filepaths.animation_player
|
||||
file_path = bpy.utils.expandpath(rd.output_path)
|
||||
|
||||
|
||||
# try and guess a command line if it doesn't exist
|
||||
if player_path == '':
|
||||
player_path = guess_player_path(preset)
|
||||
|
||||
|
||||
# doesn't support ### frame notation yet
|
||||
if rd.file_format in movie_formats:
|
||||
file = "%s%04d_%04d" % (file_path, sce.start_frame, sce.end_frame)
|
||||
@ -116,10 +116,10 @@ class PlayRenderedAnim(bpy.types.Operator):
|
||||
file = "%s%04d" % (file_path, sce.start_frame)
|
||||
elif preset in ('FRAMECYCLER', 'RV'):
|
||||
file = "%s#" % file_path
|
||||
|
||||
|
||||
if rd.file_extensions:
|
||||
file += '.' + img_format_exts[rd.file_format]
|
||||
|
||||
|
||||
cmd = [player_path]
|
||||
# extra options, fps controls etc.
|
||||
if preset == 'BLENDER24':
|
||||
@ -146,4 +146,4 @@ class PlayRenderedAnim(bpy.types.Operator):
|
||||
|
||||
return('FINISHED',)
|
||||
|
||||
bpy.ops.add(PlayRenderedAnim)
|
||||
bpy.ops.add(PlayRenderedAnim)
|
||||
|
@ -23,229 +23,241 @@
|
||||
|
||||
import bpy
|
||||
|
||||
|
||||
def extend(obj, operator, EXTEND_MODE):
|
||||
me = obj.data
|
||||
me_verts = me.verts
|
||||
# script will fail without UVs
|
||||
if not me.active_uv_texture:
|
||||
me.add_uv_texture()
|
||||
|
||||
|
||||
# Toggle Edit mode
|
||||
is_editmode = (obj.mode == 'EDIT')
|
||||
if is_editmode:
|
||||
bpy.ops.object.mode_set(mode='OBJECT')
|
||||
|
||||
#t = sys.time()
|
||||
edge_average_lengths = {}
|
||||
|
||||
OTHER_INDEX = 2,3,0,1
|
||||
FAST_INDICIES = 0,2,1,3 # order is faster
|
||||
def extend_uvs(face_source, face_target, edge_key):
|
||||
'''
|
||||
Takes 2 faces,
|
||||
Projects its extends its UV coords onto the face next to it.
|
||||
Both faces must share an edge.
|
||||
'''
|
||||
|
||||
def face_edge_vs(vi):
|
||||
# assume a quad
|
||||
return [(vi[0], vi[1]), (vi[1], vi[2]), (vi[2], vi[3]), (vi[3], vi[0])]
|
||||
|
||||
vidx_source = face_source.verts
|
||||
vidx_target = face_target.verts
|
||||
|
||||
faceUVsource = me.active_uv_texture.data[face_source.index]
|
||||
uvs_source = [faceUVsource.uv1,faceUVsource.uv2,faceUVsource.uv3,faceUVsource.uv4]
|
||||
|
||||
faceUVtarget = me.active_uv_texture.data[face_target.index]
|
||||
uvs_target = [faceUVtarget.uv1,faceUVtarget.uv2,faceUVtarget.uv3,faceUVtarget.uv4]
|
||||
|
||||
# vertex index is the key, uv is the value
|
||||
|
||||
uvs_vhash_source = dict( [ (vindex, uvs_source[i]) for i, vindex in enumerate(vidx_source)] )
|
||||
|
||||
uvs_vhash_target = dict( [ (vindex, uvs_target[i]) for i, vindex in enumerate(vidx_target)] )
|
||||
|
||||
edge_idxs_source = face_edge_vs(vidx_source)
|
||||
edge_idxs_target = face_edge_vs(vidx_target)
|
||||
|
||||
source_matching_edge = -1
|
||||
target_matching_edge = -1
|
||||
|
||||
edge_key_swap = edge_key[1], edge_key[0]
|
||||
|
||||
try: source_matching_edge = edge_idxs_source.index(edge_key)
|
||||
except: source_matching_edge = edge_idxs_source.index(edge_key_swap)
|
||||
try: target_matching_edge = edge_idxs_target.index(edge_key)
|
||||
except: target_matching_edge = edge_idxs_target.index(edge_key_swap)
|
||||
|
||||
|
||||
|
||||
edgepair_inner_source = edge_idxs_source[source_matching_edge]
|
||||
edgepair_inner_target = edge_idxs_target[target_matching_edge]
|
||||
edgepair_outer_source = edge_idxs_source[OTHER_INDEX[source_matching_edge]]
|
||||
edgepair_outer_target = edge_idxs_target[OTHER_INDEX[target_matching_edge]]
|
||||
|
||||
if edge_idxs_source[source_matching_edge] == edge_idxs_target[target_matching_edge]:
|
||||
iA= 0; iB= 1 # Flipped, most common
|
||||
else: # The normals of these faces must be different
|
||||
iA= 1; iB= 0
|
||||
|
||||
|
||||
# Set the target UV's touching source face, no tricky calc needed,
|
||||
uvs_vhash_target[edgepair_inner_target[0]][:] = uvs_vhash_source[edgepair_inner_source[iA]]
|
||||
uvs_vhash_target[edgepair_inner_target[1]][:] = uvs_vhash_source[edgepair_inner_source[iB]]
|
||||
me = obj.data
|
||||
me_verts = me.verts
|
||||
# script will fail without UVs
|
||||
if not me.active_uv_texture:
|
||||
me.add_uv_texture()
|
||||
|
||||
|
||||
# Set the 2 UV's on the target face that are not touching
|
||||
# for this we need to do basic expaning on the source faces UV's
|
||||
if EXTEND_MODE == 'LENGTH':
|
||||
|
||||
try: # divide by zero is possible
|
||||
'''
|
||||
measure the length of each face from the middle of each edge to the opposite
|
||||
allong the axis we are copying, use this
|
||||
'''
|
||||
i1a= edgepair_outer_target[iB]
|
||||
i2a= edgepair_inner_target[iA]
|
||||
if i1a>i2a: i1a, i2a = i2a, i1a
|
||||
|
||||
i1b= edgepair_outer_source[iB]
|
||||
i2b= edgepair_inner_source[iA]
|
||||
if i1b>i2b: i1b, i2b = i2b, i1b
|
||||
# print edge_average_lengths
|
||||
factor = edge_average_lengths[i1a, i2a][0] / edge_average_lengths[i1b, i2b][0]
|
||||
except:
|
||||
# Div By Zero?
|
||||
factor = 1.0
|
||||
|
||||
uvs_vhash_target[edgepair_outer_target[iB]][:] = uvs_vhash_source[edgepair_inner_source[0]] +factor * (uvs_vhash_source[edgepair_inner_source[0]] - uvs_vhash_source[edgepair_outer_source[1]])
|
||||
uvs_vhash_target[edgepair_outer_target[iA]][:] = uvs_vhash_source[edgepair_inner_source[1]] +factor * (uvs_vhash_source[edgepair_inner_source[1]] - uvs_vhash_source[edgepair_outer_source[0]])
|
||||
|
||||
else:
|
||||
# same as above but with no factor
|
||||
uvs_vhash_target[edgepair_outer_target[iB]][:] = uvs_vhash_source[edgepair_inner_source[0]] + (uvs_vhash_source[edgepair_inner_source[0]] - uvs_vhash_source[edgepair_outer_source[1]])
|
||||
uvs_vhash_target[edgepair_outer_target[iA]][:] = uvs_vhash_source[edgepair_inner_source[1]] + (uvs_vhash_source[edgepair_inner_source[1]] - uvs_vhash_source[edgepair_outer_source[0]])
|
||||
# Toggle Edit mode
|
||||
is_editmode = (obj.mode == 'EDIT')
|
||||
if is_editmode:
|
||||
bpy.ops.object.mode_set(mode='OBJECT')
|
||||
|
||||
#t = sys.time()
|
||||
edge_average_lengths = {}
|
||||
|
||||
OTHER_INDEX = 2, 3, 0, 1
|
||||
FAST_INDICIES = 0, 2, 1, 3 # order is faster
|
||||
|
||||
def extend_uvs(face_source, face_target, edge_key):
|
||||
'''
|
||||
Takes 2 faces,
|
||||
Projects its extends its UV coords onto the face next to it.
|
||||
Both faces must share an edge.
|
||||
'''
|
||||
|
||||
def face_edge_vs(vi):
|
||||
# assume a quad
|
||||
return [(vi[0], vi[1]), (vi[1], vi[2]), (vi[2], vi[3]), (vi[3], vi[0])]
|
||||
|
||||
vidx_source = face_source.verts
|
||||
vidx_target = face_target.verts
|
||||
|
||||
faceUVsource = me.active_uv_texture.data[face_source.index]
|
||||
uvs_source = [faceUVsource.uv1, faceUVsource.uv2, faceUVsource.uv3, faceUVsource.uv4]
|
||||
|
||||
faceUVtarget = me.active_uv_texture.data[face_target.index]
|
||||
uvs_target = [faceUVtarget.uv1, faceUVtarget.uv2, faceUVtarget.uv3, faceUVtarget.uv4]
|
||||
|
||||
# vertex index is the key, uv is the value
|
||||
|
||||
uvs_vhash_source = dict([(vindex, uvs_source[i]) for i, vindex in enumerate(vidx_source)])
|
||||
|
||||
uvs_vhash_target = dict([(vindex, uvs_target[i]) for i, vindex in enumerate(vidx_target)])
|
||||
|
||||
edge_idxs_source = face_edge_vs(vidx_source)
|
||||
edge_idxs_target = face_edge_vs(vidx_target)
|
||||
|
||||
source_matching_edge = -1
|
||||
target_matching_edge = -1
|
||||
|
||||
edge_key_swap = edge_key[1], edge_key[0]
|
||||
|
||||
try:
|
||||
source_matching_edge = edge_idxs_source.index(edge_key)
|
||||
except:
|
||||
source_matching_edge = edge_idxs_source.index(edge_key_swap)
|
||||
try:
|
||||
target_matching_edge = edge_idxs_target.index(edge_key)
|
||||
except:
|
||||
target_matching_edge = edge_idxs_target.index(edge_key_swap)
|
||||
|
||||
|
||||
if me.active_uv_texture == None:
|
||||
me.add_uv_texture
|
||||
|
||||
face_act = me.faces.active
|
||||
if face_act == -1:
|
||||
operator.report({'ERROR'}, "No active face.")
|
||||
return
|
||||
|
||||
face_sel= [f for f in me.faces if len(f.verts) == 4 and f.selected]
|
||||
|
||||
face_act_local_index = -1
|
||||
for i, f in enumerate(face_sel):
|
||||
if f.index == face_act:
|
||||
face_act_local_index = i
|
||||
break
|
||||
|
||||
if face_act_local_index == -1:
|
||||
operator.report({'ERROR'}, "Active face not selected.")
|
||||
return
|
||||
|
||||
|
||||
|
||||
# Modes
|
||||
# 0 unsearched
|
||||
# 1:mapped, use search from this face. - removed!!
|
||||
# 2:all siblings have been searched. dont search again.
|
||||
face_modes = [0] * len(face_sel)
|
||||
face_modes[face_act_local_index] = 1 # extend UV's from this face.
|
||||
|
||||
|
||||
# Edge connectivty
|
||||
edge_faces = {}
|
||||
for i, f in enumerate(face_sel):
|
||||
for edkey in f.edge_keys:
|
||||
try: edge_faces[edkey].append(i)
|
||||
except: edge_faces[edkey] = [i]
|
||||
|
||||
#SEAM = me.edges.seam
|
||||
|
||||
if EXTEND_MODE == 'LENGTH':
|
||||
edge_loops = me.edge_loops(face_sel, [ed.key for ed in me.edges if ed.seam] )
|
||||
me_verts = me.verts
|
||||
for loop in edge_loops:
|
||||
looplen = [0.0]
|
||||
for ed in loop:
|
||||
edge_average_lengths[ed] = looplen
|
||||
looplen[0] += (me_verts[ed[0]].co - me_verts[ed[1]].co).length
|
||||
looplen[0] = looplen[0] / len(loop)
|
||||
|
||||
|
||||
|
||||
# remove seams, so we dont map accross seams.
|
||||
for ed in me.edges:
|
||||
if ed.seam:
|
||||
# remove the edge pair if we can
|
||||
try: del edge_faces[ed.key]
|
||||
except: pass
|
||||
# Done finding seams
|
||||
|
||||
|
||||
# face connectivity - faces around each face
|
||||
# only store a list of indicies for each face.
|
||||
face_faces = [[] for i in range(len(face_sel))]
|
||||
|
||||
for edge_key, faces in edge_faces.items():
|
||||
if len(faces) == 2: # Only do edges with 2 face users for now
|
||||
face_faces[faces[0]].append((faces[1], edge_key))
|
||||
face_faces[faces[1]].append((faces[0], edge_key))
|
||||
|
||||
|
||||
# Now we know what face is connected to what other face, map them by connectivity
|
||||
ok = True
|
||||
while ok:
|
||||
ok = False
|
||||
for i in range(len(face_sel)):
|
||||
if face_modes[i] == 1: # searchable
|
||||
for f_sibling, edge_key in face_faces[i]:
|
||||
if face_modes[f_sibling] == 0:
|
||||
face_modes[f_sibling] = 1 # mapped and search from.
|
||||
extend_uvs(face_sel[i], face_sel[f_sibling], edge_key)
|
||||
face_modes[i] = 1 # we can map from this one now.
|
||||
ok= True # keep searching
|
||||
|
||||
face_modes[i] = 2 # dont search again
|
||||
|
||||
if is_editmode:
|
||||
bpy.ops.object.mode_set(mode='EDIT')
|
||||
else:
|
||||
me.update()
|
||||
|
||||
edgepair_inner_source = edge_idxs_source[source_matching_edge]
|
||||
edgepair_inner_target = edge_idxs_target[target_matching_edge]
|
||||
edgepair_outer_source = edge_idxs_source[OTHER_INDEX[source_matching_edge]]
|
||||
edgepair_outer_target = edge_idxs_target[OTHER_INDEX[target_matching_edge]]
|
||||
|
||||
if edge_idxs_source[source_matching_edge] == edge_idxs_target[target_matching_edge]:
|
||||
iA = 0 # Flipped, most common
|
||||
iB = 1
|
||||
else: # The normals of these faces must be different
|
||||
iA = 1
|
||||
iB = 0
|
||||
|
||||
|
||||
# Set the target UV's touching source face, no tricky calc needed,
|
||||
uvs_vhash_target[edgepair_inner_target[0]][:] = uvs_vhash_source[edgepair_inner_source[iA]]
|
||||
uvs_vhash_target[edgepair_inner_target[1]][:] = uvs_vhash_source[edgepair_inner_source[iB]]
|
||||
|
||||
|
||||
# Set the 2 UV's on the target face that are not touching
|
||||
# for this we need to do basic expaning on the source faces UV's
|
||||
if EXTEND_MODE == 'LENGTH':
|
||||
|
||||
try: # divide by zero is possible
|
||||
'''
|
||||
measure the length of each face from the middle of each edge to the opposite
|
||||
allong the axis we are copying, use this
|
||||
'''
|
||||
i1a = edgepair_outer_target[iB]
|
||||
i2a = edgepair_inner_target[iA]
|
||||
if i1a > i2a:
|
||||
i1a, i2a = i2a, i1a
|
||||
|
||||
i1b = edgepair_outer_source[iB]
|
||||
i2b = edgepair_inner_source[iA]
|
||||
if i1b > i2b:
|
||||
i1b, i2b = i2b, i1b
|
||||
# print edge_average_lengths
|
||||
factor = edge_average_lengths[i1a, i2a][0] / edge_average_lengths[i1b, i2b][0]
|
||||
except:
|
||||
# Div By Zero?
|
||||
factor = 1.0
|
||||
|
||||
uvs_vhash_target[edgepair_outer_target[iB]][:] = uvs_vhash_source[edgepair_inner_source[0]] + factor * (uvs_vhash_source[edgepair_inner_source[0]] - uvs_vhash_source[edgepair_outer_source[1]])
|
||||
uvs_vhash_target[edgepair_outer_target[iA]][:] = uvs_vhash_source[edgepair_inner_source[1]] + factor * (uvs_vhash_source[edgepair_inner_source[1]] - uvs_vhash_source[edgepair_outer_source[0]])
|
||||
|
||||
else:
|
||||
# same as above but with no factors
|
||||
uvs_vhash_target[edgepair_outer_target[iB]][:] = uvs_vhash_source[edgepair_inner_source[0]] + (uvs_vhash_source[edgepair_inner_source[0]] - uvs_vhash_source[edgepair_outer_source[1]])
|
||||
uvs_vhash_target[edgepair_outer_target[iA]][:] = uvs_vhash_source[edgepair_inner_source[1]] + (uvs_vhash_source[edgepair_inner_source[1]] - uvs_vhash_source[edgepair_outer_source[0]])
|
||||
|
||||
|
||||
if me.active_uv_texture == None:
|
||||
me.add_uv_texture
|
||||
|
||||
face_act = me.faces.active
|
||||
if face_act == -1:
|
||||
operator.report({'ERROR'}, "No active face.")
|
||||
return
|
||||
|
||||
face_sel = [f for f in me.faces if len(f.verts) == 4 and f.selected]
|
||||
|
||||
face_act_local_index = -1
|
||||
for i, f in enumerate(face_sel):
|
||||
if f.index == face_act:
|
||||
face_act_local_index = i
|
||||
break
|
||||
|
||||
if face_act_local_index == -1:
|
||||
operator.report({'ERROR'}, "Active face not selected.")
|
||||
return
|
||||
|
||||
|
||||
|
||||
# Modes
|
||||
# 0 unsearched
|
||||
# 1:mapped, use search from this face. - removed!!
|
||||
# 2:all siblings have been searched. dont search again.
|
||||
face_modes = [0] * len(face_sel)
|
||||
face_modes[face_act_local_index] = 1 # extend UV's from this face.
|
||||
|
||||
|
||||
# Edge connectivty
|
||||
edge_faces = {}
|
||||
for i, f in enumerate(face_sel):
|
||||
for edkey in f.edge_keys:
|
||||
try:
|
||||
edge_faces[edkey].append(i)
|
||||
except:
|
||||
edge_faces[edkey] = [i]
|
||||
|
||||
#SEAM = me.edges.seam
|
||||
|
||||
if EXTEND_MODE == 'LENGTH':
|
||||
edge_loops = me.edge_loops(face_sel, [ed.key for ed in me.edges if ed.seam])
|
||||
me_verts = me.verts
|
||||
for loop in edge_loops:
|
||||
looplen = [0.0]
|
||||
for ed in loop:
|
||||
edge_average_lengths[ed] = looplen
|
||||
looplen[0] += (me_verts[ed[0]].co - me_verts[ed[1]].co).length
|
||||
looplen[0] = looplen[0] / len(loop)
|
||||
|
||||
|
||||
# remove seams, so we dont map accross seams.
|
||||
for ed in me.edges:
|
||||
if ed.seam:
|
||||
# remove the edge pair if we can
|
||||
try:
|
||||
del edge_faces[ed.key]
|
||||
except:
|
||||
pass
|
||||
# Done finding seams
|
||||
|
||||
|
||||
# face connectivity - faces around each face
|
||||
# only store a list of indicies for each face.
|
||||
face_faces = [[] for i in range(len(face_sel))]
|
||||
|
||||
for edge_key, faces in edge_faces.items():
|
||||
if len(faces) == 2: # Only do edges with 2 face users for now
|
||||
face_faces[faces[0]].append((faces[1], edge_key))
|
||||
face_faces[faces[1]].append((faces[0], edge_key))
|
||||
|
||||
|
||||
# Now we know what face is connected to what other face, map them by connectivity
|
||||
ok = True
|
||||
while ok:
|
||||
ok = False
|
||||
for i in range(len(face_sel)):
|
||||
if face_modes[i] == 1: # searchable
|
||||
for f_sibling, edge_key in face_faces[i]:
|
||||
if face_modes[f_sibling] == 0:
|
||||
face_modes[f_sibling] = 1 # mapped and search from.
|
||||
extend_uvs(face_sel[i], face_sel[f_sibling], edge_key)
|
||||
face_modes[i] = 1 # we can map from this one now.
|
||||
ok = True # keep searching
|
||||
|
||||
face_modes[i] = 2 # dont search again
|
||||
|
||||
if is_editmode:
|
||||
bpy.ops.object.mode_set(mode='EDIT')
|
||||
else:
|
||||
me.update()
|
||||
|
||||
|
||||
def main(context, operator):
|
||||
obj = context.active_object
|
||||
obj = context.active_object
|
||||
|
||||
extend(obj, operator, operator.properties.mode)
|
||||
|
||||
extend(obj, operator, operator.properties.mode)
|
||||
|
||||
class FollowActiveQuads(bpy.types.Operator):
|
||||
'''Follow UVs from active quads along continuous face loops.'''
|
||||
bl_idname = "uv.follow_active_quads"
|
||||
bl_label = "Follow Active Quads"
|
||||
'''Follow UVs from active quads along continuous face loops.'''
|
||||
bl_idname = "uv.follow_active_quads"
|
||||
bl_label = "Follow Active Quads"
|
||||
|
||||
bl_register = True
|
||||
bl_undo = True
|
||||
bl_register = True
|
||||
bl_undo = True
|
||||
|
||||
mode = bpy.props.EnumProperty(items=(("EVEN", "Client", "Space all UVs evently"), ("LENGTH", "Length", "Average space UVs edge length of each loop.")),
|
||||
name="Edge Length Mode",
|
||||
description="Method to space UV edge loops",
|
||||
default="LENGTH")
|
||||
mode = bpy.props.EnumProperty(items=(("EVEN", "Client", "Space all UVs evently"), ("LENGTH", "Length", "Average space UVs edge length of each loop.")),
|
||||
name="Edge Length Mode",
|
||||
description="Method to space UV edge loops",
|
||||
default="LENGTH")
|
||||
|
||||
def poll(self, context):
|
||||
obj = context.active_object
|
||||
return (obj is not None and obj.type == 'MESH')
|
||||
def poll(self, context):
|
||||
obj = context.active_object
|
||||
return (obj is not None and obj.type == 'MESH')
|
||||
|
||||
def execute(self, context):
|
||||
main(context, self)
|
||||
return ('FINISHED',)
|
||||
def execute(self, context):
|
||||
main(context, self)
|
||||
return ('FINISHED',)
|
||||
|
||||
bpy.ops.add(FollowActiveQuads)
|
||||
|
||||
@ -257,5 +269,4 @@ menu_func = (lambda self, context: self.layout.operator(FollowActiveQuads.bl_idn
|
||||
menu_item = dynamic_menu.add(bpy.types.VIEW3D_MT_uv_map, menu_func)
|
||||
|
||||
if __name__ == '__main__':
|
||||
bpy.ops.uv.follow_active_quads()
|
||||
|
||||
bpy.ops.uv.follow_active_quads()
|
||||
|
@ -30,14 +30,14 @@ KM_HIERARCHY = [
|
||||
('Markers', 'EMPTY', 'WINDOW', []), # markers (per region)
|
||||
('Animation', 'EMPTY', 'WINDOW', []), # frame change on click, preview range (per region)
|
||||
('Grease Pencil', 'EMPTY', 'WINDOW', []), # grease pencil stuff (per region)
|
||||
|
||||
|
||||
('View2D Buttons List', 'EMPTY', 'WINDOW', []), # view 2d with buttons navigation
|
||||
('Animation_Channels', 'EMPTY', 'WINDOW', []),
|
||||
|
||||
|
||||
('Buttons Generic', 'PROPERTIES', 'WINDOW', []), # align context menu
|
||||
('TimeLine', 'TIMELINE', 'WINDOW', []),
|
||||
('Outliner', 'OUTLINER', 'WINDOW', []),
|
||||
|
||||
|
||||
('View3D', 'VIEW_3D', 'WINDOW', [ # view 3d navigation and generic stuff (select, transform)
|
||||
('Pose', 'EMPTY', 'WINDOW', []),
|
||||
('Object Mode', 'EMPTY', 'WINDOW', []),
|
||||
@ -60,13 +60,13 @@ KM_HIERARCHY = [
|
||||
('GraphEdit Keys', 'GRAPH_EDITOR', 'WINDOW', [
|
||||
('GraphEdit Generic', 'GRAPH_EDITOR', 'WINDOW', [])
|
||||
]),
|
||||
|
||||
|
||||
('Image', 'IMAGE_EDITOR', 'WINDOW', [
|
||||
('UVEdit', 'EMPTY', 'WINDOW', []), # image (reverse order, UVEdit before Image
|
||||
('Image Paint', 'EMPTY', 'WINDOW', []), # image and view3d
|
||||
('Image Generic', 'IMAGE_EDITOR', 'WINDOW', [])
|
||||
]),
|
||||
|
||||
|
||||
('Node Generic', 'NODE_EDITOR', 'WINDOW', [
|
||||
('Node', 'NODE_EDITOR', 'WINDOW', [])
|
||||
]),
|
||||
@ -84,8 +84,8 @@ KM_HIERARCHY = [
|
||||
('Sequencer', 'SEQUENCE_EDITOR', 'WINDOW', []),
|
||||
('Logic Generic', 'LOGIC_EDITOR', 'WINDOW', []),
|
||||
('Console', 'CONSOLE', 'WINDOW', []),
|
||||
|
||||
|
||||
|
||||
|
||||
('View3D Gesture Circle', 'EMPTY', 'WINDOW', []),
|
||||
('Gesture Border', 'EMPTY', 'WINDOW', []),
|
||||
('Standard Modal Map', 'EMPTY', 'WINDOW', []),
|
||||
@ -143,9 +143,9 @@ class USERPREF_PT_interface(bpy.types.Panel):
|
||||
|
||||
userpref = context.user_preferences
|
||||
view = userpref.view
|
||||
|
||||
|
||||
row = layout.row()
|
||||
|
||||
|
||||
|
||||
col = row.column()
|
||||
col.label(text="Display:")
|
||||
@ -171,7 +171,7 @@ class USERPREF_PT_interface(bpy.types.Panel):
|
||||
|
||||
row.separator()
|
||||
row.separator()
|
||||
|
||||
|
||||
col = row.column()
|
||||
col.label(text="View Manipulation:")
|
||||
col.prop(view, "auto_depth")
|
||||
@ -187,7 +187,7 @@ class USERPREF_PT_interface(bpy.types.Panel):
|
||||
|
||||
row.separator()
|
||||
row.separator()
|
||||
|
||||
|
||||
col = row.column()
|
||||
#Toolbox doesn't exist yet
|
||||
#col.label(text="Toolbox:")
|
||||
@ -379,7 +379,7 @@ class USERPREF_PT_system(bpy.types.Panel):
|
||||
col.separator()
|
||||
col.separator()
|
||||
|
||||
|
||||
|
||||
|
||||
#column = split.column()
|
||||
#colsplit = column.split(percentage=0.85)
|
||||
@ -394,7 +394,7 @@ class USERPREF_PT_system(bpy.types.Panel):
|
||||
#col.separator()
|
||||
|
||||
#col.prop(system, "use_textured_fonts")
|
||||
|
||||
|
||||
column = split.column()
|
||||
colsplit = column.split(percentage=0.85)
|
||||
|
||||
@ -426,15 +426,15 @@ class USERPREF_PT_system(bpy.types.Panel):
|
||||
split.label()
|
||||
split.label(text="Colors:")
|
||||
split.label(text="Direction:")
|
||||
|
||||
|
||||
|
||||
|
||||
split = column.split(percentage=0.1)
|
||||
|
||||
|
||||
if lamp0.enabled == True:
|
||||
split.prop(lamp0, "enabled", text="", icon='OUTLINER_OB_LAMP')
|
||||
else:
|
||||
split.prop(lamp0, "enabled", text="", icon='LAMP_DATA')
|
||||
|
||||
|
||||
col = split.column()
|
||||
col.active = lamp0.enabled
|
||||
row = col.row()
|
||||
@ -443,19 +443,19 @@ class USERPREF_PT_system(bpy.types.Panel):
|
||||
row = col.row()
|
||||
row.label(text="Specular:")
|
||||
row.prop(lamp0, "specular_color", text="")
|
||||
|
||||
|
||||
col = split.column()
|
||||
col.active = lamp0.enabled
|
||||
col.prop(lamp0, "direction", text="")
|
||||
|
||||
|
||||
|
||||
|
||||
split = column.split(percentage=0.1)
|
||||
|
||||
|
||||
if lamp1.enabled == True:
|
||||
split.prop(lamp1, "enabled", text="", icon='OUTLINER_OB_LAMP')
|
||||
else:
|
||||
split.prop(lamp1, "enabled", text="", icon='LAMP_DATA')
|
||||
|
||||
|
||||
col = split.column()
|
||||
col.active = lamp1.enabled
|
||||
row = col.row()
|
||||
@ -464,19 +464,19 @@ class USERPREF_PT_system(bpy.types.Panel):
|
||||
row = col.row()
|
||||
row.label(text="Specular:")
|
||||
row.prop(lamp1, "specular_color", text="")
|
||||
|
||||
|
||||
col = split.column()
|
||||
col.active = lamp1.enabled
|
||||
col.prop(lamp1, "direction", text="")
|
||||
|
||||
|
||||
|
||||
|
||||
split = column.split(percentage=0.1)
|
||||
|
||||
|
||||
if lamp2.enabled == True:
|
||||
split.prop(lamp2, "enabled", text="", icon='OUTLINER_OB_LAMP')
|
||||
else:
|
||||
split.prop(lamp2, "enabled", text="", icon='LAMP_DATA')
|
||||
|
||||
|
||||
col = split.column()
|
||||
col.active = lamp2.enabled
|
||||
row = col.row()
|
||||
@ -485,16 +485,16 @@ class USERPREF_PT_system(bpy.types.Panel):
|
||||
row = col.row()
|
||||
row.label(text="Specular:")
|
||||
row.prop(lamp2, "specular_color", text="")
|
||||
|
||||
|
||||
col = split.column()
|
||||
col.active = lamp2.enabled
|
||||
col.prop(lamp2, "direction", text="")
|
||||
|
||||
|
||||
|
||||
column.separator()
|
||||
column.separator()
|
||||
column.separator()
|
||||
|
||||
|
||||
col = column.column()
|
||||
|
||||
col.prop(system, "use_weight_color_range", text="Custom Weight Paint Range")
|
||||
@ -502,7 +502,7 @@ class USERPREF_PT_system(bpy.types.Panel):
|
||||
sub.active = system.use_weight_color_range
|
||||
sub.template_color_ramp(system, "weight_color_range", expand=True)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
class USERPREF_PT_theme(bpy.types.Panel):
|
||||
@ -1253,12 +1253,12 @@ class USERPREF_PT_input(bpy.types.Panel):
|
||||
def poll(self, context):
|
||||
userpref = context.user_preferences
|
||||
return (userpref.active_section == 'INPUT')
|
||||
|
||||
|
||||
def draw_entry(self, kc, entry, col, level = 0):
|
||||
idname, spaceid, regionid, children = entry
|
||||
|
||||
|
||||
km = kc.find_keymap(idname, space_type = spaceid, region_type = regionid)
|
||||
|
||||
|
||||
if km:
|
||||
self.draw_km(kc, km, children, col, level)
|
||||
|
||||
@ -1267,89 +1267,89 @@ class USERPREF_PT_input(bpy.types.Panel):
|
||||
if level == 0:
|
||||
level = 0.0001 # Tweak so that a percentage of 0 won't split by half
|
||||
indent = level*indentpx / bpy.context.region.width
|
||||
|
||||
|
||||
split=layout.split(percentage=indent)
|
||||
col = split.column()
|
||||
col = split.column()
|
||||
return col
|
||||
|
||||
|
||||
def draw_km(self, kc, km, children, layout, level):
|
||||
km = km.active()
|
||||
|
||||
|
||||
layout.set_context_pointer("keymap", km)
|
||||
|
||||
|
||||
col = self.indented_layout(layout, level)
|
||||
|
||||
|
||||
row = col.row()
|
||||
row.prop(km, "children_expanded", text="", no_bg=True)
|
||||
row.label(text=km.name)
|
||||
|
||||
|
||||
row.label()
|
||||
row.label()
|
||||
|
||||
|
||||
if km.user_defined:
|
||||
row.operator("WM_OT_keymap_restore", text="Restore")
|
||||
row.operator("wm.keymap_restore", text="Restore")
|
||||
else:
|
||||
row.operator("WM_OT_keymap_edit", text="Edit")
|
||||
|
||||
row.operator("wm.keymap_edit", text="Edit")
|
||||
|
||||
if km.children_expanded:
|
||||
if children:
|
||||
# Put the Parent key map's entries in a 'global' sub-category
|
||||
# equal in hierarchy to the other children categories
|
||||
subcol = self.indented_layout(col, level + 1)
|
||||
subrow = subcol.row()
|
||||
subrow.prop(km, "items_expanded", text="", no_bg=True)
|
||||
subrow.prop(km, "items_expanded", text="", no_bg=True)
|
||||
subrow.label(text="%s (Global)" % km.name)
|
||||
else:
|
||||
km.items_expanded = True
|
||||
|
||||
|
||||
# Key Map items
|
||||
if km.items_expanded:
|
||||
for kmi in km.items:
|
||||
self.draw_kmi(kc, km, kmi, col, level + 1)
|
||||
|
||||
|
||||
# "Add New" at end of keymap item list
|
||||
col = self.indented_layout(col, level+1)
|
||||
subcol = col.split(percentage=0.2).column()
|
||||
subcol.active = km.user_defined
|
||||
subcol.operator("wm.keyitem_add", text="Add New", icon='ZOOMIN')
|
||||
|
||||
|
||||
col.separator()
|
||||
|
||||
|
||||
# Child key maps
|
||||
if children:
|
||||
subcol = col.column()
|
||||
row = subcol.row()
|
||||
|
||||
|
||||
for entry in children:
|
||||
self.draw_entry(kc, entry, col, level + 1)
|
||||
|
||||
|
||||
|
||||
|
||||
def draw_kmi(self, kc, km, kmi, layout, level):
|
||||
layout.set_context_pointer("keyitem", kmi)
|
||||
|
||||
|
||||
col = self.indented_layout(layout, level)
|
||||
|
||||
col.enabled = km.user_defined
|
||||
|
||||
|
||||
if km.user_defined:
|
||||
col = col.column(align=True)
|
||||
box = col.box()
|
||||
else:
|
||||
box = col.column()
|
||||
|
||||
|
||||
split = box.split(percentage=0.4)
|
||||
|
||||
|
||||
# header bar
|
||||
row = split.row()
|
||||
row.prop(kmi, "expanded", text="", no_bg=True)
|
||||
row.prop(kmi, "active", text="", no_bg=True)
|
||||
|
||||
|
||||
if km.modal:
|
||||
row.prop(kmi, "propvalue", text="")
|
||||
else:
|
||||
row.label(text=kmi.name)
|
||||
|
||||
|
||||
row = split.row()
|
||||
row.prop(kmi, "map_type", text="")
|
||||
if kmi.map_type == 'KEYBOARD':
|
||||
@ -1364,22 +1364,22 @@ class USERPREF_PT_input(bpy.types.Panel):
|
||||
row.prop(kmi, "type", text="")
|
||||
else:
|
||||
row.label()
|
||||
|
||||
|
||||
row.operator("wm.keyitem_remove", text="", icon='X')
|
||||
|
||||
|
||||
# Expanded, additional event settings
|
||||
if kmi.expanded:
|
||||
box = col.box()
|
||||
|
||||
|
||||
if kmi.map_type not in ('TEXTINPUT', 'TIMER'):
|
||||
split = box.split(percentage=0.4)
|
||||
sub = split.row()
|
||||
|
||||
|
||||
if km.modal:
|
||||
sub.prop(kmi, "propvalue", text="")
|
||||
else:
|
||||
sub.prop(kmi, "idname", text="")
|
||||
|
||||
|
||||
sub = split.column()
|
||||
subrow = sub.row(align=True)
|
||||
|
||||
@ -1407,13 +1407,13 @@ class USERPREF_PT_input(bpy.types.Panel):
|
||||
for pname in dir(props):
|
||||
if not props.is_property_hidden(pname):
|
||||
flow.prop(props, pname)
|
||||
|
||||
# Modal key maps attached to this operator
|
||||
|
||||
# Modal key maps attached to this operator
|
||||
if not km.modal:
|
||||
kmm = kc.find_keymap_modal(kmi.idname)
|
||||
if kmm:
|
||||
self.draw_km(kc, kmm, None, layout, level + 1)
|
||||
|
||||
|
||||
def draw_input_prefs(self, inputs, layout):
|
||||
# General settings
|
||||
row = layout.row()
|
||||
@ -1428,7 +1428,7 @@ class USERPREF_PT_input(bpy.types.Panel):
|
||||
|
||||
sub.label(text="Select With:")
|
||||
sub.row().prop(inputs, "select_mouse", expand=True)
|
||||
|
||||
|
||||
sub = col.column()
|
||||
sub.label(text="Double Click:")
|
||||
sub.prop(inputs, "double_click_time", text="Speed")
|
||||
@ -1464,31 +1464,31 @@ class USERPREF_PT_input(bpy.types.Panel):
|
||||
sub.prop(inputs, "ndof_rotate_speed", text="Orbit Speed")
|
||||
|
||||
row.separator()
|
||||
|
||||
|
||||
def draw_filtered(self, kc, layout):
|
||||
|
||||
|
||||
for km in kc.keymaps:
|
||||
filtered_items = [kmi for kmi in km.items if kmi.name.lower().find(kc.filter.lower()) != -1]
|
||||
|
||||
|
||||
if len(filtered_items) != 0:
|
||||
km = km.active()
|
||||
|
||||
|
||||
col = layout.column()
|
||||
col.set_context_pointer("keymap", km)
|
||||
row = col.row()
|
||||
row.label(text=km.name, icon="DOT")
|
||||
|
||||
|
||||
row.label()
|
||||
row.label()
|
||||
|
||||
|
||||
if km.user_defined:
|
||||
row.operator("WM_OT_keymap_restore", text="Restore")
|
||||
row.operator("wm.keymap_restore", text="Restore")
|
||||
else:
|
||||
row.operator("WM_OT_keymap_edit", text="Edit")
|
||||
|
||||
row.operator("wm.keymap_edit", text="Edit")
|
||||
|
||||
for kmi in filtered_items:
|
||||
self.draw_kmi(kc, km, kmi, col, 1)
|
||||
|
||||
|
||||
def draw_hierarchy(self, defkc, layout):
|
||||
for entry in KM_HIERARCHY:
|
||||
self.draw_entry(defkc, entry, layout)
|
||||
@ -1502,26 +1502,26 @@ class USERPREF_PT_input(bpy.types.Panel):
|
||||
inputs = userpref.inputs
|
||||
|
||||
split = layout.split(percentage=0.25)
|
||||
|
||||
|
||||
# Input settings
|
||||
self.draw_input_prefs(inputs, split)
|
||||
|
||||
|
||||
# Keymap Settings
|
||||
col = split.column()
|
||||
# kc = wm.active_keyconfig
|
||||
kc = wm.default_keyconfig
|
||||
|
||||
|
||||
sub = col.column()
|
||||
|
||||
|
||||
subsplit = sub.split()
|
||||
subcol = subsplit.column()
|
||||
subcol.prop_object(wm, "active_keyconfig", wm, "keyconfigs", text="Configuration:")
|
||||
|
||||
|
||||
subcol = subsplit.column()
|
||||
subcol.prop(kc, "filter", icon="VIEWZOOM")
|
||||
|
||||
|
||||
col.separator()
|
||||
|
||||
|
||||
if kc.filter != "":
|
||||
self.draw_filtered(kc, col)
|
||||
else:
|
||||
@ -1699,3 +1699,4 @@ bpy.ops.add(WM_OT_keymap_edit)
|
||||
bpy.ops.add(WM_OT_keymap_restore)
|
||||
bpy.ops.add(WM_OT_keyitem_add)
|
||||
bpy.ops.add(WM_OT_keyitem_remove)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user