[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [15202] branches/soc-2008-jaguarandi/ release/scripts/CreatePlane.py: Added sample "CreatePlane" ..

André Pinto andresusanopinto at gmail.com
Thu Jun 12 00:35:28 CEST 2008


Revision: 15202
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15202
Author:   jaguarandi
Date:     2008-06-12 00:35:27 +0200 (Thu, 12 Jun 2008)

Log Message:
-----------
Added sample "CreatePlane" .. it simple projects a grid over the selected image and determines which squares are to be used.

Added Paths:
-----------
    branches/soc-2008-jaguarandi/release/scripts/CreatePlane.py

Added: branches/soc-2008-jaguarandi/release/scripts/CreatePlane.py
===================================================================
--- branches/soc-2008-jaguarandi/release/scripts/CreatePlane.py	                        (rev 0)
+++ branches/soc-2008-jaguarandi/release/scripts/CreatePlane.py	2008-06-11 22:35:27 UTC (rev 15202)
@@ -0,0 +1,154 @@
+#!BPY
+
+"""
+Name: 'Import Plane from Image'
+Blender: 245
+Group: 'Add'
+Tooltip: 'Import a plane topology from a 2d Image'
+"""
+
+__author__ = "André Pinto"
+__url__ = ["www.blender.org"]
+__version__ = "2008-06-06"
+
+__bpydoc__ = """\
+This script extracts a plane from an image.
+"""
+
+# ***** 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.
+#
+# The Original Code is Copyright (C) Blender Foundation.
+# All rights reserved.
+#
+# The Original Code is: all of this file.
+#
+# Contributor(s): André Pinto
+#
+# ***** END GPL LICENSE BLOCK *****
+
+import Blender, bpy
+
+def matrix(dima, dimb):
+	return [[0 for b in range(dimb)] for a in range(dima)]
+
+def makelist(a):
+	res = []
+	for i in a:
+		res.append(i)
+	return res
+
+def dotProduct(a):
+	sum = 0.0
+	for i in a:
+		sum += i*i
+	return sum
+
+# For now simply decompose in a triangle fan
+def DecomposePolygon(poly):
+	for i in range(2, len(poly), 1):
+		yield [ poly[0], poly[i-1], poly[i] ]
+
+
+def Expand3dCoordsFrom2d(coords):
+	for c in coords:
+		yield ( c[0] , c[1], 0 )
+
+
+# For now return the full image
+def ExtractSections(image):
+	x_samples = 250
+	y_samples = 250
+
+	mdim = max( image.size )
+	dx = float(image.size[0]) / x_samples
+	dy = float(image.size[1]) / y_samples
+	ox = -float(x_samples)*0.5
+	oy = -float(y_samples)*0.5
+
+	def scale(a):
+		return ( (a[0] + ox)*dx , (a[1] + oy)*dy )
+			
+	used = matrix(x_samples, y_samples)
+	for a in range(x_samples):
+		for b in range(y_samples):
+			if dotProduct(image.getPixelHDR( (int)(a*dx), (int)(b*dy))) <= 1:
+				used[a][b] = 1
+
+	for a in range(x_samples-1):
+		for b in range(y_samples-1):
+			sum = used[a][b] + used[a+1][b] + used[a][b+1] + used[a+1][b+1]
+			
+			if sum == 4:
+				yield map( scale, [ (a,b) , (a+1,b), (a+1,b+1), (a,b+1) ] )
+			elif sum == 3:
+				if not used[a][b]:
+					yield map( scale, [ (a+1,b), (a+1,b+1) , (a,b+1) ] )
+				if not used[a+1][b]:
+					yield map( scale, [ (a,b), (a+1,b+1) , (a,b+1) ] )
+				if not used[a][b+1]:
+					yield map( scale, [ (a,b), (a+1,b) , (a+1,b+1) ] )
+				if not used[a+1][b+1]:
+					yield map( scale, [ (a,b), (a+1,b) , (a,b+1) ] )
+					
+
+def ImportPlaneFromImage(image, mesh):
+
+	new_verts = []
+	new_faces = []
+
+	vert_dict = {}
+
+	def getVertex(vert):
+		if vert not in vert_dict:
+			new_verts.append( (vert[0], vert[1], 0) )
+			vert_dict[ vert ] = len( new_verts )-1
+
+		return vert_dict[ vert ]
+
+	for poly in ExtractSections(image):
+		offset = len(new_verts)
+
+		poly = map( getVertex, poly )
+		if len(poly) == 4:
+			new_faces.append( [poly[0], poly[1], poly[2],poly[3]] )
+		if len(poly) == 3:
+			new_faces.append( [ poly[0], poly[1], poly[2] ] )
+
+	# perform a single extend, extend is O( N )
+	mesh.verts.extend( new_verts )
+	mesh.faces.extend( new_faces )
+
+
+
+#use the current image on the image editor? or ask the user what image to load
+#image = Blender.Image.GetCurrent()
+
+def load_image(filename):
+	print "Loading ",filename
+	#for now create a new mesh
+	mesh = bpy.data.meshes.new('Plane')
+	Blender.Scene.GetCurrent().objects.new(mesh)
+
+	image = Blender.Image.Load(filename)
+	print image
+	ImportPlaneFromImage(image, mesh)
+	Blender.Redraw()
+	
+
+image = Blender.Window.FileSelector(load_image, "Load Image")
+
+





More information about the Bf-blender-cvs mailing list