Advertisement
Guest User

Mesh Face Random Material Assigner (Blender)

a guest
Jan 30th, 2013
447
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. # ##### BEGIN GPL LICENSE BLOCK #####
  2. #
  3. #  This program is free software; you can redistribute it and/or
  4. #  modify it under the terms of the GNU General Public License
  5. #  as published by the Free Software Foundation; either version 2
  6. #  of the License, or (at your option) any later version.
  7. #
  8. #  This program is distributed in the hope that it will be useful,
  9. #  but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11. #  GNU General Public License for more details.
  12. #
  13. #  You should have received a copy of the GNU General Public License
  14. #  along with this program; if not, write to the Free Software Foundation,
  15. #  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  16. #
  17. # ##### END GPL LICENSE BLOCK #####
  18.  
  19. #
  20. #
  21. #  Author            : Tamir Lousky (tlousky@gmail.com)
  22. #
  23. #  Homepage(Wiki)    : http://biological3d.wordpress.com/
  24. #
  25. #  Start of project              : 2013-01-25 by Clemens Barth
  26. #  Last modified                 : 2013-01-30
  27. #
  28. #  Acknowledgements
  29. #  ================
  30. #
  31. #  Blender: Patrick Boelens (helpful tuts!), CoDEmanX (useful bmesh info on BA forums!)
  32.  
  33. bl_info = {    
  34.     "name"        : "Random Face Material Assigner",
  35.     "author"      : "Tamir Lousky",
  36.     "version"     : (1, 0, 0),
  37.     "blender"     : (2, 65, 0),
  38.     "category"    : "Materials",
  39.     "location"    : "3D View >> Tools",
  40.     "wiki_url"    : "http://bioblog3d.wordpress.com/2013/01/30/random-meshface-material-assigner",
  41.     "download_url": "http://pastebin.com/download.php?i=TAntxkmR",
  42.     "description" : "Assign random materials to mesh object faces."}
  43.  
  44. import bpy
  45. import random
  46. import bmesh
  47.  
  48. class random_mat_panel(bpy.types.Panel):
  49.     bl_idname      = "randomFaceMatPanel"
  50.     bl_label       = "Random Face Material Assigner"
  51.     bl_space_type  = 'VIEW_3D'
  52.     bl_region_type = 'TOOLS'
  53.     bl_context     = 'objectmode'
  54.  
  55.     def draw( self, context):                # Draw panel UI elements #
  56.         layout = self.layout                 # Reference to panel layout object
  57.        
  58.         props = context.scene.face_assigner  # Create reference material assigner property group
  59.  
  60.         col1 = layout.column()               # Create a column
  61.         col1.label(text="Randomly assign materials to each face on the object")
  62.        
  63.         box = layout.box()                   # Draw a box
  64.         col2 = box.column(align=True)        # Create a column
  65.         col2.prop( props, "rand_seed"  )     # Create randomization seed property on column
  66.         col2.label(text="use this field to filter materials by name")
  67.         col2.prop( props, "mat_prefix" )     # And the material prefix property too
  68.  
  69. class rand_mat_assigner(bpy.types.PropertyGroup):
  70.    
  71.     def randomize( self, context ):
  72.         """ function name: randomize
  73.            description:   This function assigns a random material to each face on the selected
  74.                           object's mesh, from its list of materials (filtered by the mat_prefix)
  75.        """
  76.         random.seed(self.rand_seed)   # Set the randomization seed
  77.    
  78.         all_materials = bpy.context.object.data.materials
  79.         filtered_materials = []
  80.  
  81.         if self.mat_prefix != "":                       # IF the user entered a prefix
  82.             for material in all_materials:              # Iterate over all the object's materials
  83.                 if self.mat_prefix in material.name:    # Look for materials with the prefix
  84.                     filtered_materials.append(material) # And filter them in
  85.         else:
  86.             filtered_materials = all_materials          # If there's no prefix, use all materials
  87.        
  88.         no_of_materials = len(filtered_materials)       # Count all/filtered materials on object
  89.  
  90.         bpy.ops.object.mode_set(mode = 'EDIT')          # Go to edit mode to create bmesh
  91.         ob = bpy.context.object
  92.  
  93.         bm = bmesh.from_edit_mesh(ob.data)              # Create bmesh object from object mesh
  94.  
  95.         for face in bm.faces:    # Iterate over all of the object's faces
  96.             face.material_index = random.randint(0, no_of_materials - 1)  # Assign random material to face
  97.            
  98.         ob.data.update()                            # Update the mesh from the bmesh data
  99.         bpy.ops.object.mode_set(mode = 'OBJECT')    # Return to object mode
  100.  
  101.         return {'FINISHED'}
  102.  
  103.     rand_seed = bpy.props.IntProperty(     # Randomization seed
  104.         name="rand_seed",
  105.         description="Randomization seed",
  106.         update=randomize)  
  107.     mat_prefix = bpy.props.StringProperty( # Prefix to filter materials by
  108.         name="mat_prefix",
  109.         description="Material name filter",
  110.         default="",
  111.         update=randomize)
  112.  
  113. def register():
  114.     bpy.utils.register_module(__name__)
  115.     bpy.types.Scene.face_assigner = bpy.props.PointerProperty(type=rand_mat_assigner)
  116.    
  117. def unregister():
  118.     bpy.utils.unregister_module(__name__)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement