本文整理汇总了Python中BPyMesh.meshWeight2Dict方法的典型用法代码示例。如果您正苦于以下问题:Python BPyMesh.meshWeight2Dict方法的具体用法?Python BPyMesh.meshWeight2Dict怎么用?Python BPyMesh.meshWeight2Dict使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类BPyMesh
的用法示例。
在下文中一共展示了BPyMesh.meshWeight2Dict方法的7个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。
示例1: copy_act_vgroup
# 需要导入模块: import BPyMesh [as 别名]
# 或者: from BPyMesh import meshWeight2Dict [as 别名]
def copy_act_vgroup(me, PREF_NAME, PREF_SEL_ONLY):
Window.WaitCursor(1)
groupNames, vWeightDict= BPyMesh.meshWeight2Dict(me)
act_group= me.activeGroup
if not PREF_SEL_ONLY:
for wd in vWeightDict:
try: wd[PREF_NAME] = wd[act_group]
except: pass
else:
# Selected faces only
verts = {} # should use set
for f in me.faces:
if f.sel:
for v in f:
verts[v.index] = None
for i in verts.iterkeys():
wd = vWeightDict[i]
try: wd[PREF_NAME] = wd[act_group]
except: pass
groupNames.append(PREF_NAME)
# Copy weights back to the mesh.
BPyMesh.dict2MeshWeight(me, groupNames, vWeightDict)
Window.WaitCursor(0)
示例2: actWeightNormalize
# 需要导入模块: import BPyMesh [as 别名]
# 或者: from BPyMesh import meshWeight2Dict [as 别名]
def actWeightNormalize(me, PREF_MODE, PREF_MAX_DIST, PREF_STRENGTH, PREF_ITERATIONS):
Window.WaitCursor(1)
groupNames, vWeightDict= BPyMesh.meshWeight2Dict(me)
act_group= me.activeGroup
# Start with assumed zero weights
orig_vert_weights= [0.0] * len(vWeightDict) # Will be directly assigned to orig_vert_weights
# fill in the zeros with real weights.
for i, wd in enumerate(vWeightDict):
try:
orig_vert_weights[i]= wd[act_group]
except:
pass
new_vert_weights= list(orig_vert_weights)
for dummy in xrange(PREF_ITERATIONS):
# Minimize or maximize the weights. connection based.
if PREF_MODE==0: # Grow
op= max
else: # Shrink
op= min
for ed in me.edges:
if not PREF_MAX_DIST or ed.length < PREF_MAX_DIST:
i1= ed.v1.index
i2= ed.v2.index
new_weight= op(orig_vert_weights[i1], orig_vert_weights[i2])
if PREF_STRENGTH==1.0: # do a full copy
new_vert_weights[i1]= op(new_weight, new_vert_weights[i1])
new_vert_weights[i2]= op(new_weight, new_vert_weights[i2])
else: # Do a faded copy
new_vert_weights[i1]= op(new_weight, new_vert_weights[i1])
new_vert_weights[i2]= op(new_weight, new_vert_weights[i2])
# Face the copy with the original (orig is updated per iteration)
new_vert_weights[i1]= (new_vert_weights[i1]*PREF_STRENGTH) + (orig_vert_weights[i1]*(1-PREF_STRENGTH))
new_vert_weights[i2]= (new_vert_weights[i2]*PREF_STRENGTH) + (orig_vert_weights[i2]*(1-PREF_STRENGTH))
for i, wd in enumerate(vWeightDict):
new_weight= new_vert_weights[i]
if new_weight != orig_vert_weights[i]:
wd[act_group]= new_weight
if dummy+1 != PREF_ITERATIONS: # dont copy the list on the last round.
orig_vert_weights= list(new_vert_weights)
# Copy weights back to the mesh.
BPyMesh.dict2MeshWeight(me, groupNames, vWeightDict)
Window.WaitCursor(0)
示例3: selSameWeights
# 需要导入模块: import BPyMesh [as 别名]
# 或者: from BPyMesh import meshWeight2Dict [as 别名]
def selSameWeights(me, PREF_TOLERENCE):
# Check for missing data
if not me.faceUV: return
act_group= me.activeGroup
if not act_group: return
act_face = me.faces[me.activeFace]
if act_face == None: return
groupNames, vWeightDict= BPyMesh.meshWeight2Dict(me)
def get_face_weight(f):
'''
Return the faces median weight and weight range.
'''
wmin = 1.0
wmax = 0.0
w = 0.0
for v in f:
try:
new_weight = vWeightDict[v.index][act_group]
if wmin > new_weight: wmin = new_weight
if wmax < new_weight: wmax = new_weight
w += new_weight
except:
pass
return w, wmax-wmin # weight, range
weight_from, weight_range_from = get_face_weight(act_face)
for f in me.faces:
if (not f.sel) and f != act_face:
weight, weight_range = get_face_weight(f)
# Compare the 2 faces weight difference and difference in their contrast.
if\
abs(weight - weight_from) <= PREF_TOLERENCE and\
abs(weight_range - weight_range_from) <= PREF_TOLERENCE:
f.sel = True
示例4: weightClean
# 需要导入模块: import BPyMesh [as 别名]
# 或者: from BPyMesh import meshWeight2Dict [as 别名]
def weightClean(me, PREF_THRESH, PREF_KEEP_SINGLE, PREF_OTHER_GROUPS):
groupNames, vWeightDict= BPyMesh.meshWeight2Dict(me)
act_group= me.activeGroup
rem_count = 0
if PREF_OTHER_GROUPS:
for wd in vWeightDict:
l = len(wd)
if not PREF_KEEP_SINGLE or l > 1:
# cant use iteritems because the dict is having items removed
for group in wd.keys():
w= wd[group]
if w <= PREF_THRESH:
# small weight, remove.
del wd[group]
rem_count +=1
l-=1
if PREF_KEEP_SINGLE and l == 1:
break
else:
for wd in vWeightDict:
if not PREF_KEEP_SINGLE or len(wd) > 1:
try:
w= wd[act_group]
if w <= PREF_THRESH:
# small weight, remove.
del wd[act_group]
rem_count +=1
except:
pass
# Copy weights back to the mesh.
BPyMesh.dict2MeshWeight(me, groupNames, vWeightDict)
return rem_count
示例5: mesh_mirror
# 需要导入模块: import BPyMesh [as 别名]
# 或者: from BPyMesh import meshWeight2Dict [as 别名]
#.........这里部分代码省略.........
# Record the pairs for sorting to see who will get joined
mirror_pairs.append((l, nv, pv))
# Update every 20 loops
if i1 % 10 == 0:
Window.DrawProgressBar(0.8 * (i1/len_neg_vts), 'Mirror verts %i of %i' % (i1, len_neg_vts))
Window.DrawProgressBar(0.9, 'Mirror verts: Updating locations')
# Now we have a list of the pairs we might use, lets find the best and do them first.
# de-selecting as we go. so we can makke sure not to mess it up.
try: mirror_pairs.sort(key = lambda a: a[0])
except: mirror_pairs.sort(lambda a,b: cmp(a[0], b[0]))
for dist, v1,v2 in mirror_pairs: # dist, neg, pos
if v1.sel and v2.sel:
if PREF_MODE==0: # Middle
flipvec[:]= v2.co # positive
flipvec.x= -flipvec.x # negatve
v2.co= v1.co= (flipvec+v1.co)*0.5 # midway
v2.co.x= -v2.co.x
elif PREF_MODE==2: # Left
v2.co= v1.co
v2.co.x= -v2.co.x
elif PREF_MODE==1: # Right
v1.co= v2.co
v1.co.x= -v1.co.x
v1.sel= v2.sel= 0
#*Mirror Weights**********************************************************#
if PREF_MIRROR_WEIGHTS:
groupNames, vWeightDict= BPyMesh.meshWeight2Dict(me)
mirror_pairs_l2r= [] # Stor a list of matches for these verts.
mirror_pairs_r2l= [] # Stor a list of matches for these verts.
# allign the negative with the positive.
flipvec= Mathutils.Vector()
len_neg_vts= float(len(neg_vts))
# Here we make a tuple to look through, if were middle well need to look through both.
if PREF_MODE==0: # Middle
find_set= ((neg_vts, pos_vts, mirror_pairs_l2r), (pos_vts, neg_vts, mirror_pairs_r2l))
elif PREF_MODE==1: # Left
find_set= ((neg_vts, pos_vts, mirror_pairs_l2r), )
elif PREF_MODE==2: # Right
find_set= ((pos_vts, neg_vts, mirror_pairs_r2l), )
# Do a locational lookup again :/ - This isnt that good form but if we havnt mirrored weights well need to do it anyway.
# The Difference with this is that we dont need to have 1:1 match for each vert- just get each vert to find another mirrored vert
# and use its weight.
# Use "find_set" so we can do a flipped search L>R and R>L without duplicate code.
for vtls_A, vtls_B, pair_ls in find_set:
for i1, vA in enumerate(vtls_A):
best_len=1<<30 # BIGNUM
best_idx=-1
# Find the BEST match
vA_co= vA.co
for i2, vB in enumerate(vtls_B):
# Enforce edge users.
if not PREF_EDGE_USERS or edge_users[i1]==edge_users[i2]:
flipvec[:]= vB.co
flipvec.x= -flipvec.x
示例6: vertexGradientPick
# 需要导入模块: import BPyMesh [as 别名]
# 或者: from BPyMesh import meshWeight2Dict [as 别名]
def vertexGradientPick(ob, MODE):
#MODE 0 == VWEIGHT, 1 == VCOL
me= ob.getData(mesh=1)
if not me.faceUV: me.faceUV= True
Window.DrawProgressBar (0.0, '')
mousedown_wait()
if MODE==0:
act_group= me.activeGroup
if act_group == None:
mousedown_wait()
Draw.PupMenu('Error, mesh has no active group.')
return
# Loop until click
Window.DrawProgressBar (0.25, 'Click to set gradient start')
mouseup()
obmat= ob.matrixWorld
screen_x, screen_y = Window.GetMouseCoords()
mouseInView, OriginA, DirectionA = mouseViewRay(screen_x, screen_y, obmat)
if not mouseInView or not OriginA:
return
# get the mouse weight
if MODE==0:
pickValA= BPyMesh.pickMeshGroupWeight(me, act_group, OriginA, DirectionA)
if MODE==1:
pickValA= BPyMesh.pickMeshGroupVCol(me, OriginA, DirectionA)
Window.DrawProgressBar (0.75, 'Click to set gradient end')
mouseup()
TOALPHA= Window.GetKeyQualifiers() & Window.Qual.SHIFT
screen_x, screen_y = Window.GetMouseCoords()
mouseInView, OriginB, DirectionB = mouseViewRay(screen_x, screen_y, obmat)
if not mouseInView or not OriginB:
return
if not TOALPHA: # Only get a second opaque value if we are not blending to alpha
if MODE==0: pickValB= BPyMesh.pickMeshGroupWeight(me, act_group, OriginB, DirectionB)
else:
pickValB= BPyMesh.pickMeshGroupVCol(me, OriginB, DirectionB)
else:
if MODE==0: pickValB= 0.0
else: pickValB= [0.0, 0.0, 0.0] # Dummy value
# Neither points touched a face
if pickValA == pickValB == None:
return
# clicking on 1 non face is fine. just set the weight to 0.0
if pickValA==None:
pickValA= 0.0
# swap A/B
OriginA, OriginB= OriginB, OriginA
DirectionA, DirectionB= DirectionB, DirectionA
pickValA, pickValB= pickValA, pickValB
TOALPHA= True
if pickValB==None:
pickValB= 0.0
TOALPHA= True
# set up 2 lines so we can measure their distances and calc the gradient
# make a line 90d to the grad in screenspace.
if (OriginA-OriginB).length <= eps: # Persp view. same origin different direction
cross_grad= DirectionA.cross(DirectionB)
ORTHO= False
else: # Ortho - Same direction, different origin
cross_grad= DirectionA.cross(OriginA-OriginB)
ORTHO= True
cross_grad.normalize()
cross_grad= cross_grad * 100
lineA= (OriginA, OriginA+(DirectionA*100))
lineB= (OriginB, OriginB+(DirectionB*100))
if not ORTHO:
line_angle= AngleBetweenVecs(lineA[1], lineB[1])/2
line_mid= (lineA[1]+lineB[1])*0.5
VSEL= [False] * (len(me.verts))
# Get the selected faces and apply the selection to the verts.
for f in me.faces:
if f.sel:
for v in f.v:
VSEL[v.index]= True
groupNames, vWeightDict= BPyMesh.meshWeight2Dict(me)
#.........这里部分代码省略.........
示例7: actWeightNormalize
# 需要导入模块: import BPyMesh [as 别名]
# 或者: from BPyMesh import meshWeight2Dict [as 别名]
def actWeightNormalize(me, ob, PREF_PEAKWEIGHT, PREF_ACTIVE_ONLY, PREF_ARMATURE_ONLY, PREF_KEEP_PROPORTION):
groupNames, vWeightDict= BPyMesh.meshWeight2Dict(me)
new_weight= max_weight= -1.0
act_group= me.activeGroup
if PREF_ACTIVE_ONLY:
normalizeGroups = [act_group]
else:
normalizeGroups = groupNames[:]
if PREF_ARMATURE_ONLY:
armature_groups = getArmatureGroups(ob, me)
i = len(normalizeGroups)
while i:
i-=1
if not normalizeGroups[i] in armature_groups:
del normalizeGroups[i]
for act_group in normalizeGroups:
vWeightDictUsed=[False] * len(vWeightDict)
for i, wd in enumerate(vWeightDict):
try:
new_weight= wd[act_group]
if new_weight > max_weight:
max_weight= new_weight
vWeightDictUsed[i]=wd
except:
pass
# These can be skipped for now, they complicate things when using multiple vgroups,
'''
if max_weight < SMALL_NUM or new_weight == -1:
Draw.PupMenu('No verts to normalize. exiting.')
#return
if abs(max_weight-PREF_PEAKWEIGHT) < SMALL_NUM:
Draw.PupMenu('Vert Weights are alredy normalized.')
#return
'''
max_weight= max_weight/PREF_PEAKWEIGHT
if PREF_KEEP_PROPORTION:
# TODO, PROPORTIONAL WEIGHT SCALING.
for wd in vWeightDictUsed:
if wd: # not false.
if len(wd) == 1:
# Only 1 group for thsi vert. Simple
wd[act_group] /= max_weight
else:
# More then 1 group. will need to scale all users evenly.
if PREF_ARMATURE_ONLY:
local_maxweight= max([v for k, v in wd.iteritems() if k in armature_groups]) / PREF_PEAKWEIGHT
if local_maxweight > 0.0:
# So groups that are not used in any bones are ignored.
for weight in wd.iterkeys():
if weight in armature_groups:
wd[weight] /= local_maxweight
else:
local_maxweight= max(wd.itervalues()) / PREF_PEAKWEIGHT
for weight in wd.iterkeys():
wd[weight] /= local_maxweight
else: # Simple, just scale the weights up. we alredy know this is in an armature group (if needed)
for wd in vWeightDictUsed:
if wd: # not false.
wd[act_group] /= max_weight
# Copy weights back to the mesh.
BPyMesh.dict2MeshWeight(me, groupNames, vWeightDict)