[#20046] 2.5 "bridge faces" tool doesn't delete original selection
[blender-staging.git] / release / scripts / op / object.py
index e093460ab3166a00b5c5f5d5bb5a0c5c45154a7f..c3961093c1f540360754a869fdb43cb89a0a995d 100644 (file)
@@ -102,20 +102,24 @@ class SubdivisionSet(bpy.types.Operator):
         def set_object_subd(obj):
             for mod in obj.modifiers:
                 if mod.type == 'MULTIRES':
-                    if level <= mod.total_levels:
-                        if obj.mode == 'SCULPT':
-                            if relative:
-                                mod.sculpt_levels += level
-                            else:
+                    if not relative:
+                        if level <= mod.total_levels:
+                            if obj.mode == 'SCULPT':
                                 if mod.sculpt_levels != level:
                                     mod.sculpt_levels = level
+                            elif obj.mode == 'OBJECT':
+                                if mod.levels != level:
+                                    mod.levels = level                          
+                        return
+                    else:
+                        if obj.mode == 'SCULPT':
+                            if mod.sculpt_levels+level <= mod.total_levels:
+                                mod.sculpt_levels += level
                         elif obj.mode == 'OBJECT':
-                            if relative:
+                            if mod.levels+level <= mod.total_levels:
                                 mod.levels += level
-                            else:
-                                if mod.levels != level:
-                                    mod.levels = level
-                    return
+                        return
+                
                 elif mod.type == 'SUBSURF':
                     if relative:
                         mod.levels += level
@@ -135,20 +139,6 @@ class SubdivisionSet(bpy.types.Operator):
         return {'FINISHED'}
 
 
-class Retopo(bpy.types.Operator):
-    '''TODO - doc'''
-
-    bl_idname = "object.retopology"
-    bl_label = "Retopology from Grease Pencil"
-    bl_register = True
-    bl_undo = True
-
-    def execute(self, context):
-        import retopo
-        retopo.main()
-        return {'FINISHED'}
-
-
 class ShapeTransfer(bpy.types.Operator):
     '''Copy the active objects current shape to other selected objects with the same number of verts'''
 
@@ -170,19 +160,18 @@ class ShapeTransfer(bpy.types.Operator):
                 default=False)
 
     def _main(self, ob_act, objects, mode='OFFSET', use_clamp=False):
-
         def me_nos(verts):
             return [v.normal.copy() for v in verts]
 
         def me_cos(verts):
             return [v.co.copy() for v in verts]
 
-        def ob_add_shape(ob):
-            C_tmp = {"object": ob}
+        def ob_add_shape(ob, name):
             me = ob.data
-            if me.shape_keys is None: # add basis
-                bpy.ops.object.shape_key_add(C_tmp)
-            bpy.ops.object.shape_key_add(C_tmp)
+            key = ob.add_shape_key(from_mix=False)
+            if len(me.shape_keys.keys) == 1:
+                key = ob.add_shape_key(from_mix=False) # we need a rest
+            key.name = name
             ob.active_shape_key_index = len(me.shape_keys.keys) - 1
             ob.shape_key_lock = True
 
@@ -193,6 +182,7 @@ class ShapeTransfer(bpy.types.Operator):
             use_clamp = False
 
         me = ob_act.data
+        orig_key_name = ob_act.active_shape_key.name
 
         orig_shape_coords = me_cos(ob_act.active_shape_key.data)
 
@@ -208,7 +198,7 @@ class ShapeTransfer(bpy.types.Operator):
             target_normals = me_nos(me_other.verts)
             target_coords = me_cos(me_other.verts)
 
-            ob_add_shape(ob_other)
+            ob_add_shape(ob_other, orig_key_name)
 
             # editing the final coords, only list that stores wrapped coords
             target_shape_coords = [v.co for v in ob_other.active_shape_key.data]
@@ -312,11 +302,72 @@ class ShapeTransfer(bpy.types.Operator):
     def execute(self, context):
         C = bpy.context
         ob_act = C.active_object
+        if ob_act.active_shape_key is None:
+            self.report({'ERROR'}, "Active object has no shape key")
+            return {'CANCELLED'}
         objects = [ob for ob in C.selected_editable_objects if ob != ob_act]
         return self._main(ob_act, objects, self.properties.mode, self.properties.use_clamp)
 
 
+class JoinUVs(bpy.types.Operator):
+    '''Copy UV Layout to objects with matching geometry'''
+    bl_idname = "object.join_uvs"
+    bl_label = "Join as UVs"
+
+    def poll(self, context):
+        obj = context.active_object
+        return (obj and obj.type == 'MESH')
+
+    def _main(self, context):
+        import array
+        obj = context.active_object
+        mesh = obj.data
+
+        is_editmode = (obj.mode == 'EDIT')
+        if is_editmode:
+            bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
+
+        len_faces = len(mesh.faces)
+        
+        uv_array = array.array('f', [0.0] * 8) * len_faces # seems to be the fastest way to create an array
+        mesh.active_uv_texture.data.foreach_get("uv_raw", uv_array)
+
+        objects = context.selected_editable_objects[:]
+        
+        for obj_other in objects:
+            if obj_other.type == 'MESH':
+                obj_other.data.tag = False
+
+        for obj_other in objects:
+            if obj_other != obj and obj_other.type == 'MESH':
+                mesh_other = obj_other.data
+                if mesh_other != mesh:
+                    if mesh_other.tag == False:
+                        mesh_other.tag = True
+                        
+                        if len(mesh_other.faces) != len_faces:
+                            self.report({'WARNING'}, "Object: %s, Mesh: '%s' has %d faces, expected %d\n" % (obj_other.name, mesh_other.name, len(mesh_other.faces), len_faces))
+                        else:
+                            uv_other = mesh_other.active_uv_texture
+                            if not uv_other:
+                                mesh_other.uv_texture_add() # should return the texture it adds
+                                uv_other = mesh_other.active_uv_texture
+                            
+                            # finally do the copy
+                            uv_other.data.foreach_set("uv_raw", uv_array)
+
+        if is_editmode:
+            bpy.ops.object.mode_set(mode='EDIT', toggle=False)
+
+    def execute(self, context):
+        self._main(context)
+        return {'FINISHED'}
+
+if __name__ == "__main__":
+    bpy.ops.uv.simple_operator()
+
+
 bpy.types.register(SelectPattern)
 bpy.types.register(SubdivisionSet)
-bpy.types.register(Retopo)
 bpy.types.register(ShapeTransfer)
+bpy.types.register(JoinUVs)