[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [23797] trunk/blender/release/scripts/io/ mesh_skin.py: updated to work with 2.5x, currently no UI options.

Campbell Barton ideasman42 at gmail.com
Mon Oct 12 23:12:30 CEST 2009


Revision: 23797
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=23797
Author:   campbellbarton
Date:     2009-10-12 23:12:30 +0200 (Mon, 12 Oct 2009)

Log Message:
-----------
updated to work with 2.5x, currently no UI options.

Modified Paths:
--------------
    trunk/blender/release/scripts/io/mesh_skin.py

Modified: trunk/blender/release/scripts/io/mesh_skin.py
===================================================================
--- trunk/blender/release/scripts/io/mesh_skin.py	2009-10-12 21:11:31 UTC (rev 23796)
+++ trunk/blender/release/scripts/io/mesh_skin.py	2009-10-12 21:12:30 UTC (rev 23797)
@@ -1,71 +1,22 @@
-#!BPY
-
-"""
-Name: 'Skin Faces/Edge-Loops'
-Blender: 243
-Group: 'MeshFaceKey'
-Tooltip: 'Select 2 vert loops, then run this script.'
-"""
-
-__author__ = "Campbell Barton AKA Ideasman"
-__url__ = ["blenderartists.org", "www.blender.org"]
-__version__ = "1.1 2006/12/26"
-
-__bpydoc__ = """\
-With this script vertex loops can be skinned: faces are created to connect the
-selected loops of vertices.
-
-Usage:
-
-In mesh Edit mode select the vertices of the loops (closed paths / curves of
-vertices: circles, for example) that should be skinned, then run this script.
-A pop-up will provide further options, if the results of a method are not adequate try one of the others.
-"""
-
-
-# $Id$
-#
-# -------------------------------------------------------------------------- 
-# Skin Selected edges 1.0 By Campbell Barton (AKA Ideasman)
-# -------------------------------------------------------------------------- 
-# ***** 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 ***** 
-# -------------------------------------------------------------------------- 
-
-# Made by Ideasman/Campbell 2005/06/15 - cbarton at metavr.com
-
-import Blender
+# import Blender
+import time, functools
 import bpy
-from Blender import Window
-from Blender.Mathutils import MidpointVecs, Vector
-from Blender.Mathutils import AngleBetweenVecs as _AngleBetweenVecs_
-import BPyMessages
+# from Blender import Window
+from Mathutils import MidpointVecs, Vector
+from Mathutils import AngleBetweenVecs as _AngleBetweenVecs_
+# import BPyMessages
 
-from Blender.Draw import PupMenu
+# from Blender.Draw import PupMenu
 
 BIG_NUM = 1<<30
 
 global CULL_METHOD
-CULL_METHOD = 0
+CULL_METHOD = 0 
 
 def AngleBetweenVecs(a1,a2):
+	import math
 	try:
-		return _AngleBetweenVecs_(a1,a2)
+		return math.degrees(_AngleBetweenVecs_(a1,a2))
 	except:
 		return 180.0
 
@@ -95,10 +46,10 @@
 		# Get Loops centre.
 		fac= len(loop)
 		verts = me.verts
-		self.centre= reduce(lambda a,b: a+verts[b].co/fac, loop, Vector())
+		self.centre= functools.reduce(lambda a,b: a+verts[b].co/fac, loop, Vector())
 		
 		# Convert Vert loop to Edges.
-		self.edges = [edge(verts[loop[vIdx-1]], verts[loop[vIdx]]) for vIdx in xrange(len(loop))]
+		self.edges = [edge(verts[loop[vIdx-1]], verts[loop[vIdx]]) for vIdx in range(len(loop))]
 		
 		if not closed:
 			self.edges[0].fake = True # fake edge option
@@ -107,7 +58,7 @@
 			
 		
 		# Assign linked list
-		for eIdx in xrange(len(self.edges)-1):
+		for eIdx in range(len(self.edges)-1):
 			self.edges[eIdx].next = self.edges[eIdx+1]
 			self.edges[eIdx].prev = self.edges[eIdx-1]
 		# Now last
@@ -254,34 +205,61 @@
 # Returns face edges.
 # face must have edge data.
 
-def getSelectedEdges(me, ob):	
-	MESH_MODE= Blender.Mesh.Mode()
+# Utility funcs for 2.5, make into a module??
+def ord_ind(i1,i2):
+	if i1<i2: return i1,i2
+	return i2,i1
 	
-	if MESH_MODE & Blender.Mesh.SelectModes.EDGE or MESH_MODE & Blender.Mesh.SelectModes.VERTEX:
-		Blender.Mesh.Mode(Blender.Mesh.SelectModes.EDGE)
-		edges= [ ed for ed in me.edges if ed.sel ]
+def edge_key(ed):
+	v1,v2 = tuple(ed.verts)
+	return ord_ind(v1, v2)
+
+def face_edge_keys(f):
+	verts  = tuple(f.verts)
+	if len(verts)==3:
+		return ord_ind(verts[0], verts[1]),  ord_ind(verts[1], verts[2]),  ord_ind(verts[2], verts[0])
+	
+	return ord_ind(verts[0], verts[1]),  ord_ind(verts[1], verts[2]),  ord_ind(verts[2], verts[3]),  ord_ind(verts[3], verts[0])
+	
+def mesh_faces_extend(me, faces):
+	orig_facetot = len(me.faces)
+	new_facetot = len(faces)
+	me.add_geometry(0, 0, new_facetot)
+	tot = orig_facetot+new_facetot
+	me_faces = me.faces
+	i= orig_facetot
+	while i < tot:
+		
+		f = [v.index for v in faces[i]]
+		if len(f)==4 and f[3]==0:
+			f = f[1], f[2], f[3], f[0]
+			
+		me_faces[orig_facetot+i].verts_raw =  f
+		i+=1
+# end utils
+
+
+def getSelectedEdges(context, me, ob):
+	MESH_MODE= context.scene.tool_settings.mesh_selection_mode
+	
+	if MESH_MODE in ('EDGE', 'VERTEX'):
+		context.scene.tool_settings.mesh_selection_mode = 'EDGE'
+		edges= [ ed for ed in me.edges if ed.selected ]
 		# print len(edges), len(me.edges)
-		Blender.Mesh.Mode(MESH_MODE)
+		context.scene.tool_settings.mesh_selection_mode = MESH_MODE
 		return edges
 	
-	elif MESH_MODE & Blender.Mesh.SelectModes.FACE:
-		Blender.Mesh.Mode(Blender.Mesh.SelectModes.EDGE)
-		
+	if MESH_MODE == 'FACE':
+		context.scene.tool_settings.mesh_selection_mode = 'EDGE'
 		# value is [edge, face_sel_user_in]
-		'''
-		try: # Python 2.4 only
-			edge_dict=  dict((ed.key, [ed, 0]) for ed in me.edges)
-		except:
-		'''
-		# Cant try 2.4 syntax because python 2.3 will complain still
-		edge_dict=  dict([(ed.key, [ed, 0]) for ed in me.edges])
+		edge_dict=  dict((edge_key(ed), [ed, 0]) for ed in me.edges)
 		
 		for f in me.faces:
 			if f.sel:
-				for edkey in f.edge_keys:
+				for edkey in face_edge_keys(f):
 					edge_dict[edkey][1] += 1
 		
-		Blender.Mesh.Mode(MESH_MODE)
+		context.scene.tool_settings.mesh_selection_mode = MESH_MODE
 		return [ ed_data[0] for ed_data in edge_dict.itervalues() if ed_data[1] == 1 ]
 	
 	
@@ -294,16 +272,16 @@
 	mainVertLoops = []
 	# second method
 	tot = len(me.verts)
-	vert_siblings = [[] for i in xrange(tot)]
+	vert_siblings = [[] for i in range(tot)]
 	vert_used = [False] * tot
 	
 	for ed in selEdges:
-		i1, i2 = ed.key
+		i1, i2 = edge_key(ed)
 		vert_siblings[i1].append(i2)
 		vert_siblings[i2].append(i1)
 	
 	# find the first used vert and keep looping.
-	for i in xrange(tot):
+	for i in range(tot):
 		if vert_siblings[i] and not vert_used[i]:
 			sbl = vert_siblings[i] # siblings
 			
@@ -398,8 +376,8 @@
 		bestEloopDist = BIG_NUM
 		bestOffset = 0
 		# Loop rotation offset to test.1
-		eLoopIdxs = range(len(eloop1.edges))
-		for offset in xrange(len(eloop1.edges)):
+		eLoopIdxs = list(range(len(eloop1.edges)))
+		for offset in range(len(eloop1.edges)):
 			totEloopDist = 0 # Measure this total distance for thsi loop.
 			
 			offsetIndexLs = eLoopIdxs[offset:] + eLoopIdxs[:offset] # Make offset index list
@@ -477,7 +455,7 @@
 	
 	
 	
-	for loopIdx in xrange(len(eloop2.edges)):
+	for loopIdx in range(len(eloop2.edges)):
 		e1 = eloop1.edges[loopIdx]
 		e2 = eloop2.edges[loopIdx]
 		
@@ -515,28 +493,25 @@
 	
 	return new_faces
 
-def main():
+def main(context):
 	global CULL_METHOD
 	
-	is_editmode = Window.EditMode()
-	if is_editmode: Window.EditMode(0)
-	ob = bpy.data.scenes.active.objects.active
-	if ob == None or ob.type != 'Mesh':
-		BPyMessages.Error_NoMeshActive()
+	ob = context.object
+	
+	is_editmode = (ob.mode=='EDIT')
+	if is_editmode: bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
+	if ob == None or ob.type != 'MESH':
+		raise Exception("BPyMessages.Error_NoMeshActive()")
 		return
 	
-	me = ob.getData(mesh=1)
+	me = ob.data
 	
-	if me.multires:
-		BPyMessages.Error_NoMeshMultiresEdit()
-		return
-	
-	time1 = Blender.sys.time()
-	selEdges = getSelectedEdges(me, ob)
+	time1 = time.time()
+	selEdges = getSelectedEdges(context, me, ob)
 	vertLoops = getVertLoops(selEdges, me) # list of lists of edges.
 	if vertLoops == None:
-		PupMenu('Error%t|Selection includes verts that are a part of more then 1 loop')
-		if is_editmode: Window.EditMode(1)
+		raise Exception('Error%t|Selection includes verts that are a part of more then 1 loop')
+		if is_editmode: bpy.ops.object.mode_set(mode='EDIT', toggle=False)
 		return
 	# print len(vertLoops)
 	
@@ -544,11 +519,12 @@
 	if len(vertLoops) > 2:
 		choice = PupMenu('Loft '+str(len(vertLoops))+' edge loops%t|loop|segment')
 		if choice == -1:
-			if is_editmode: Window.EditMode(1)
+			if is_editmode: bpy.ops.object.mode_set(mode='EDIT', toggle=False)
 			return
+		
 	elif len(vertLoops) < 2:
-		PupMenu('Error%t|No Vertloops found!')
-		if is_editmode: Window.EditMode(1)	
+		raise Exception('Error%t|No Vertloops found!')
+		if is_editmode: bpy.ops.object.mode_set(mode='EDIT', toggle=False)
 		return
 	else:
 		choice = 2
@@ -567,7 +543,7 @@
 			CULL_METHOD = 1 # even
 	
 	
-	time1 = Blender.sys.time()
+	time1 = time.time()
 	# Convert to special edge data.
 	edgeLoops = []
 	for vloop, closed in vertLoops:
@@ -616,24 +592,54 @@
 	
 	faces = []
 	
-	for i in xrange(len(edgeOrderedList)-1):
+	for i in range(len(edgeOrderedList)-1):
 		faces.extend( skin2EdgeLoops(edgeOrderedList[i], edgeOrderedList[i+1], me, ob, 0) )
 	if choice == 1 and len(edgeOrderedList) > 2: # Loop
 		faces.extend( skin2EdgeLoops(edgeOrderedList[0], edgeOrderedList[-1], me, ob, 0) )
 	
 	# REMOVE SELECTED FACES.
-	MESH_MODE= Blender.Mesh.Mode()
-	if MESH_MODE & Blender.Mesh.SelectModes.EDGE or MESH_MODE & Blender.Mesh.SelectModes.VERTEX: pass
-	elif MESH_MODE & Blender.Mesh.SelectModes.FACE:
+	MESH_MODE= ob.mode
+	if MESH_MODE == 'EDGE' or MESH_MODE == 'VERTEX': pass
+	elif MESH_MODE == 'FACE':
 		try: me.faces.delete(1, [ f for f in me.faces if f.sel ])
 		except: pass
 	
-	me.faces.extend(faces, smooth = True)
+	if 1: # 2.5
+		mesh_faces_extend(me, faces)
+		me.update(calc_edges=True)
+	else:
+		me.faces.extend(faces, smooth = True)
 	
-	print '\nSkin done in %.4f sec.' % (Blender.sys.time()-time1)
+	print('\nSkin done in %.4f sec.' % (time.time()-time1))
+		
+	if is_editmode: bpy.ops.object.mode_set(mode='EDIT', toggle=False)
+
+
+class MESH_OT_skin(bpy.types.Operator):
+	'''Bridge face loops.'''
 	
+	__idname__ = "mesh.skin"
+	__label__ = "Add Torus"
+	__register__ = True
+	__undo__ = True
 	
-	if is_editmode: Window.EditMode(1)
+	'''
+	__props__ = [

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list