Expect input coordinates for the mesh projection function to be in world
[blender-addons-contrib.git] / object_mangle_tools.py
index 1ae138972faea7be45778e35a955ecf5ef71d168..eb2965ed511deee6ed58fc98df034419b04fe7b3 100644 (file)
 # ***** END GPL LICENCE BLOCK *****
 
 bl_info = {
-    'name': 'Mangle Tools',
-    'author': 'Phil Cote, cotejrp1, (http://www.blenderaddons.com)',
-    'version': (0, 2),
-    "blender": (2, 6, 3),
-    'location': 'VIEW 3D -> TOOLS',
-    'description': 'Set of tools to mangle curves, meshes, and shape keys',
-    'warning': '',
-    'category': 'Object'}
+    "name": "Mangle Tools",
+    "author": "Phil Cote",
+    "version": (0, 2),
+    "blender": (2, 71, 0),
+    "location": "View3D > Toolshelf > Addons Tab",
+    "description": "Set of tools to mangle curves, meshes, and shape keys",
+    "warning": "", # used for warning icon and text in addons panel
+    "wiki_url": "",
+    "tracker_url": "https://developer.blender.org/T29071",
+    "category": "Object"}
 
 
 import bpy
 import random
 import time
 from math import pi
-from pdb import set_trace
+import bmesh
 
 def move_coordinate(context, co, is_curve=False):
     xyz_const = context.scene.constraint_vector
@@ -46,7 +48,7 @@ def move_coordinate(context, co, is_curve=False):
     if is_curve:
         multiplier = 2 * pi
     random_mag = context.scene.random_magnitude
-    if xyz_const[0]:    
+    if xyz_const[0]:
         co.x += .01 * random.randrange( -random_mag, random_mag ) * multiplier
     if xyz_const[1]:
         co.y += .01 * random.randrange( -random_mag, random_mag )  * multiplier
@@ -55,8 +57,8 @@ def move_coordinate(context, co, is_curve=False):
 
 
 class MeshManglerOperator(bpy.types.Operator):
-    '''push vertices on the selected object around in random directions to 
-    create a crumpled look'''
+    """Push vertices on the selected object around in random """ \
+    """directions to create a crumpled look"""
     bl_idname = "ba.mesh_mangler"
     bl_label = "Mangle Mesh"
     bl_options = { "REGISTER", "UNDO" }
@@ -68,27 +70,32 @@ class MeshManglerOperator(bpy.types.Operator):
 
     def execute(self, context):
         mesh = context.active_object.data
-        verts, faces = mesh.vertices, mesh.polygons
+        bm = bmesh.new()
+        bm.from_mesh(mesh)
+        verts, faces = bm.verts, bm.faces
         randomMag = context.scene.random_magnitude
         random.seed( time.time() )
 
         if mesh.shape_keys != None:
-            self.report( {"INFO"}, "Cannot mangle mesh: Shape keys present" )
+            self.report({'INFO'}, "Cannot mangle mesh: Shape keys present")
             return {'CANCELLED'}
-        
+
         for vert in verts:
             xVal = .01 * random.randrange( -randomMag, randomMag )
             yVal = .01 * random.randrange( -randomMag, randomMag)
             zVal = .01 * random.randrange( -randomMag, randomMag )
             vert.co.x = vert.co.x + xVal
             vert.co.y = vert.co.y + yVal
-            vert.co.z = vert.co.z + zVal    
-            
+            vert.co.z = vert.co.z + zVal
+
+        bm.to_mesh(mesh)
+        mesh.update()
         return {'FINISHED'}
 
 
 class AnimanglerOperator(bpy.types.Operator):
-    '''makes a shape key and pushes the verts around on it to set up for random pulsating animation'''
+    """Make a shape key and pushes the verts around on it """ \
+    """to set up for random pulsating animation"""
     bl_idname = "ba.ani_mangler"
     bl_label = "Mangle Shape Key"
 
@@ -104,15 +111,15 @@ class AnimanglerOperator(bpy.types.Operator):
         ob = context.object
         shapeKey = ob.shape_key_add( name=mangleName )
         verts = shapeKey.data
-        
+
         for vert in verts:
             move_coordinate(context, vert.co, is_curve=ob.type=='CURVE')
-            
+
         return {'FINISHED'}
 
 
 class CurveManglerOp(bpy.types.Operator):
-    '''Mangles a curve to the degree the user specifies'''
+    """Mangle a curve to the degree the user specifies"""
     bl_idname = "ba.curve_mangler"
     bl_label = "Mangle Curve"
     bl_options = { 'REGISTER', 'UNDO' }
@@ -127,14 +134,14 @@ class CurveManglerOp(bpy.types.Operator):
 
         ob = context.active_object
         if ob.data.shape_keys != None:
-            self.report({"INFO"}, "Cannot mangle curve.  Shape keys present")
+            self.report({'INFO'}, "Cannot mangle curve.  Shape keys present")
             return {'CANCELLED'}
         splines = context.object.data.splines
-        
+
         for spline in splines:
             if spline.type == 'BEZIER':
                 points = spline.bezier_points
-            elif spline.type in ('POLY', 'NURBS'):
+            elif spline.type in {'POLY', 'NURBS'}:
                 points = spline.points
 
             for point in points:
@@ -149,6 +156,7 @@ class MangleToolsPanel(bpy.types.Panel):
     bl_region_type="TOOLS"
     bl_context = "objectmode"
     bl_options = {'DEFAULT_CLOSED'}
+    bl_category = "Addons"
 
     def draw(self, context):
         scn = context.scene
@@ -174,17 +182,17 @@ def register():
     bpy.utils.register_class(CurveManglerOp)
     bpy.utils.register_class(MangleToolsPanel)
     scnType = bpy.types.Scene
-    
-                                    
-    scnType.constraint_vector = BoolVectorProperty(name="Mangle Constraint", 
+
+
+    scnType.constraint_vector = BoolVectorProperty(name="Mangle Constraint",
                                 default=(True,True,True),
                                 subtype='XYZ',
                                 description="Constrains Mangle Direction")
-                                
-    scnType.random_magnitude = IntProperty( name = "Mangle Severity", 
-                              default = 10, min = 1, max = 30, 
+
+    scnType.random_magnitude = IntProperty( name = "Mangle Severity",
+                              default = 10, min = 1, max = 30,
                               description = "Severity of mangling")
-    
+
     scnType.mangle_name = StringProperty(name="Shape Key Name",
                              default="mangle",
                              description="Name given for mangled shape keys")