Join as UVs.... (copies matching UVs to another object with the same topology)
authorCampbell Barton <ideasman42@gmail.com>
Thu, 14 Jan 2010 14:06:27 +0000 (14:06 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Thu, 14 Jan 2010 14:06:27 +0000 (14:06 +0000)
nice that it uses foreach_get/set for fast array copying from python.

note: this is getting out of hand, we beed some central panel/interface for copying mesh data about - shapes, UVs weights etc. at the moment they are accessed from all different places.

release/scripts/op/object.py
release/scripts/ui/space_view3d.py

index dd95c6f51a6c7c286a9d96a772f682956b8b0dbb..1cf46d514c7f3482fb91233d72507cc5ce5648e8 100644 (file)
@@ -320,7 +320,66 @@ class ShapeTransfer(bpy.types.Operator):
         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)
index e17d068b58691c382686cf9e808dd16b3e3d8897..101fb6f7acc1d7427ad94605296e43295d4cfb91 100644 (file)
@@ -656,6 +656,7 @@ class VIEW3D_MT_object(bpy.types.Menu):
         layout.separator()
 
         layout.operator("object.join_shapes")
+        layout.operator("object.join_uvs")
         layout.operator("object.join")
 
         layout.separator()