Welcome to mirror list, hosted at ThFree Co, Russian Federation.

weightpaint_invert.py « scripts « release - git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: cdae83a9d509953e20e7512deaa24992360e2182 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#!BPY
"""
Name: 'Invert Active Group'
Blender: 245
Group: 'WeightPaint'
Tooltip: 'Invert the active vertex group'
"""

# -------------------------------------------------------------------------- 
# ***** BEGIN GPL LICENSE BLOCK ***** 
# 
# 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 ***** 
# --------------------------------------------------------------------------
import Blender
from Blender import Scene, Mesh, Window, sys

import BPyMessages
import bpy

def vgroup_invert(ob_orig, me):
	if not me.getVertGroupNames():
		return
	group_act = me.activeGroup
	if group_act == None:
		return
	
	group_data = me.getVertsFromGroup(group_act, 1)
	
	weights= [1.0] * len(me.verts) # 1.0 - initialize inverted
	
	group_data = me.getVertsFromGroup(group_act, 1) # (i,w)  tuples.
	
	me.removeVertGroup(group_act) # messes up the active group.
	for i,w in group_data:
		weights[i] = 1.0-w
	
	me.addVertGroup(group_act)
	
	rep = Blender.Mesh.AssignModes.REPLACE
	vertList= [None]
	for i,weight in enumerate(weights):
		vertList[0] = i
		me.assignVertsToGroup(group_act, vertList, weight, rep)
	
	me.activeGroup = group_act
	me.update()

def main():
	
	# Gets the current scene, there can be many scenes in 1 blend file.
	sce = bpy.data.scenes.active
	
	# Get the active object, there can only ever be 1
	# and the active object is always the editmode object.
	ob_act = sce.objects.active
	
	if not ob_act or ob_act.type != 'Mesh':
		BPyMessages.Error_NoMeshActive()
		return 
	
	# Saves the editmode state and go's out of 
	# editmode if its enabled, we cant make
	# changes to the mesh data while in editmode.
	is_editmode = Window.EditMode()
	Window.EditMode(0)
	
	Window.WaitCursor(1)
	me = ob_act.getData(mesh=1) # old NMesh api is default
	t = sys.time()
	
	# Run the mesh editing function
	vgroup_invert(ob_act, me)
	
	# Timing the script is a good way to be aware on any speed hits when scripting
	print 'Invert VGroup in %.2f seconds' % (sys.time()-t)
	Window.WaitCursor(0)
	if is_editmode: Window.EditMode(1)
	
# This lets you can import the script without running it
if __name__ == '__main__':
	main()