[Bf-extensions-cvs] SVN commit: /data/svn/bf-extensions [546] contrib/py/scripts/addons/ image_to_planes.py: contrib/py/scripts/addons/image_to_planes.py
Brendon Murphy
meta.androcto1 at gmail.com
Sun Apr 4 08:39:34 CEST 2010
Revision: 546
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-extensions&revision=546
Author: meta-androcto
Date: 2010-04-04 08:39:33 +0200 (Sun, 04 Apr 2010)
Log Message:
-----------
contrib/py/scripts/addons/image_to_planes.py
added to contrib as it's maturing well.
renamed from planesFromImages.py
Added Paths:
-----------
contrib/py/scripts/addons/image_to_planes.py
Added: contrib/py/scripts/addons/image_to_planes.py
===================================================================
--- contrib/py/scripts/addons/image_to_planes.py (rev 0)
+++ contrib/py/scripts/addons/image_to_planes.py 2010-04-04 06:39:33 UTC (rev 546)
@@ -0,0 +1,454 @@
+# ##### 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+"""
+This script imports images and creates Planes with them as textures.
+At the moment the naming for objects, materials, textures and meshes
+is derived from the imagename.
+
+One can either import a single image, or all images in one directory.
+When imporing a directory one can either check the checkbox or leave
+the filename empty.
+
+As a bonus one can choose to import images of only one type.
+Atm this is the list of possible extensions:
+extList =
+ ('jpeg', 'jpg', 'png', 'tga', 'tiff', 'tif', 'exr',
+ 'hdr', 'avi', 'mov', 'mp4', 'ogg', 'bmp', 'cin', 'dpx', 'psd')
+
+If someone knows a better way of telling if a file is an image which
+Blender can read, please tell so ;)
+
+when importing images that are allready referenced they are not
+reimported but the old ones reused as not to clutter the materials,
+textures and image lists.
+Instead the plane gets linked against an existing material.
+
+If one reimports images but chooses different material/texture mapping
+new materials are created.
+So one doesn't has to go through everything if one decides differently
+after importing 236 images.
+
+"""
+
+##############################################################################
+##############################################################################
+##############################################################################
+
+bl_addon_info = {
+ 'name': 'Planes from Images',
+ 'author': 'Florian Meyer (testscreenings)',
+ 'version': '0.6',
+ 'blender': (2, 5, 2),
+ 'location': 'View3D > Import Images as Planes',
+ 'url': '',
+ 'description': 'Imports images and creates planes \
+with the appropiate aspect ratio',
+ 'category': 'Object'}
+
+##############################################################################
+##############################################################################
+##############################################################################
+
+import bpy
+from bpy.props import *
+from os import listdir
+from Mathutils import Vector
+
+# Apply view rotation to objects if "Align To" for new objects
+# was set to "VIEW" in the User Preference.
+def apply_view_rotation(ob):
+ context = bpy.context
+ align = bpy.context.user_preferences.edit.object_align
+
+ if (context.space_data.type == 'VIEW_3D'
+ and align == 'VIEW'):
+ view3d = context.space_data
+ region = view3d.region_3d
+ viewMatrix = region.view_matrix
+ rot = viewMatrix.rotation_part()
+ ob.rotation_euler = rot.invert().to_euler()
+
+
+
+######################
+#### Create plane ####
+######################
+
+
+#### gets called from createPlane ####
+def createMesh(x):
+ #### x is x-aspectRatio ####
+ verts = []
+ faces = []
+ v1 = (-x, -1, 0)
+ v2 = (x, -1, 0)
+ v3 = (x, 1, 0)
+ v4 = (-x, 1, 0)
+ verts.append(v1)
+ verts.append(v2)
+ verts.append(v3)
+ verts.append(v4)
+ faces.append([0, 1, 2, 3])
+
+ return verts, faces
+
+
+def createPlane(name, aspect):
+ scene = bpy.context.scene
+ me = bpy.data.meshes.new(name)
+ verts, faces = createMesh(aspect)
+ me.from_pydata(verts, [], faces)
+ plane = bpy.data.objects.new(name, me)
+ plane.data.add_uv_texture()
+ scene.objects.link(plane)
+ plane.location = scene.cursor_location
+ apply_view_rotation(plane)
+
+ return plane
+
+
+#######################################
+#### get imagepaths from directory ####
+#######################################
+
+def getImageFilesInDirectory(directory, extension):
+ import os
+
+ extList = [
+ 'jpeg', 'jpg', 'png', 'tga', 'tiff',
+ 'tif', 'exr', 'hdr', 'avi', 'mov', 'mp4',
+ 'ogg', 'bmp', 'cin', 'dpx', 'psd']
+
+ #### get all Files in the directory ####
+ allFiles = listdir(directory)
+ allImages = []
+
+ # Convert to lower case
+ e = extension.lower()
+
+ if e in extList:
+ extList = extension
+
+ #### Put all ImageFiles in List and return ####
+ for file in allFiles:
+ # Get the file extension (includes the ".")
+ e = os.path.splitext(file)[1]
+
+ # Separate by "." and get the last list-entry.
+ e = e.rpartition(".")[-1]
+
+ # Convert to lower case
+ e = e.lower()
+
+ if e in extList:
+ allImages.append(file)
+
+ return allImages
+
+
+##########################################
+#### get ImageDataBlock from Filepath ####
+##########################################
+
+def getImage(path):
+ img = []
+
+ #### Check every Image if it is allready there ####
+ for image in bpy.data.images:
+ #### If image with same path exists take that one ####
+ if image.filename == path:
+ img = image
+
+ #### Else create new Image and load from path ####
+ if not img:
+ name = path.rpartition('\\')[2].rpartition('.')[0]
+ img = bpy.data.images.new(name)
+ img.source = 'FILE'
+ img.filename = path
+
+ return img
+
+
+#############################
+#### Create/get Material ####
+#############################
+def getMaterial(tex, mapping):
+ mat = []
+ #### Check all existing Materials ####
+ for material in bpy.data.materials:
+ #### if Material with name and mapping ####
+ #### and texture with image ####
+ #### exists take that one ####
+ if (material.name == tex.image.name
+ and tex.name in material.texture_slots
+ and material.mapping == mapping):
+ mat = material
+
+ #### Else Create new one and apply mapping ####
+ if not mat:
+ mat = bpy.data.materials.new(name=tex.name)
+ mat.add_texture(tex, texture_coordinates='UV', map_to='COLOR')
+ mat.mapping = mapping
+ mat.name = tex.name
+
+ return mat
+
+
+############################
+#### Create/get Texture ####
+############################
+
+def getTexture(path, img):
+ tex = []
+
+ #### Check all existing Textures ####
+ for texture in bpy.data.textures:
+ #### if (image)texture with image exists take that one ####
+ if (texture.type == 'IMAGE'
+ and texture.image
+ and texture.image.filename == path):
+ tex = texture
+
+ #### Else Create new one and apply mapping ####
+ if not tex:
+ name = path.rpartition('\\')[2].rpartition('.')[0]
+ tex = bpy.data.textures.new(name=name)
+ tex.type = 'IMAGE'
+ tex = tex.recast_type()
+ tex.image = img
+
+ return tex
+
+
+#########################################
+#### Create custom Material Property ####
+#########################################
+
+def mapget(self):
+ """custom property of the planesFromImages addon"""
+ mapping = []
+ mapping.append(self.shadeless)
+ mapping.append(self.transparency)
+ mapping.append(self.alpha)
+ mapping.append(self.specular_alpha)
+ mapping.append(self.transparency_method)
+ if (self.texture_slots[0]
+ and self.texture_slots[0].texture.type == 'IMAGE'
+ and self.texture_slots[0].texture.image):
+ mapping.append(self.texture_slots[0].texture.image.premultiply)
+ else:
+ mapping.append("no image")
+ return mapping
+
+
+def mapset(self, value):
+ self.shadeless = value[0]
+ self.transparency = value[1]
+ self.alpha = float(value[2])
+ self.specular_alpha = float(value[3])
+ self.transparency_method = value[4]
+ if (self.texture_slots[0]
+ and self.texture_slots[0].texture.type == 'IMAGE'
+ and self.texture_slots[0].texture.image):
+ self.texture_slots[0].texture.image.premultiply = value[5]
+
+
+bpy.types.Material.mapping = property(mapget, mapset)
+
+#######################
+#### MAIN FUNCTION ####
+#######################
+
+
+def main(filePath, options, mapping):
+ #### Lists ####
+ images = []
+ scene = bpy.context.scene
+
+ #### if Create from Directory (no filename or checkbox) ####
+ if options[0] or not filePath[1]:
+ imageFiles = getImageFilesInDirectory(filePath[2], options[1])
+ #### Check if images are loaded and put in List ####
+ for imageFile in imageFiles:
+ img = getImage(str(filePath[2]) + "\\" + str(imageFile))
+ images.append(img)
+
+ # Deselect all objects.
+ bpy.ops.object.select_all(action='DESELECT')
+
+ #### Assign/get all things ####
+ for img in images:
+ aspect = img.size[0] / img.size[1]
+
+ #### Create/get Texture ####
+ tex = getTexture(img.filename, img)
+
+ #### Create/get Material ####
+ mat = getMaterial(tex, mapping)
+
+ #### Create Plane ####
+ plane = createPlane(img.name, aspect)
+
+ #### Assign Material ####
+ plane.data.add_material(mat)
+
+ scene.objects.active = plane
+
+ #### put Image into UVTextureLayer ####
+ plane.data.uv_textures[0].data[0].image = img
+ plane.data.uv_textures[0].data[0].tex = True
+ plane.data.uv_textures[0].data[0].transp = 'ALPHA'
+ plane.data.uv_textures[0].data[0].twoside = True
+
+ plane.selected = True
+
+ #### if Create Single Plane (filename and is image)####
+ else:
+
+ # Deselect all objects.
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-extensions-cvs
mailing list