[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [27298] trunk/blender: re-project + gimp integration, now its easy to edit the view in the gimp and apply the projection back without manually opening and saving files .

Campbell Barton ideasman42 at gmail.com
Sat Mar 6 22:47:17 CET 2010


Revision: 27298
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=27298
Author:   campbellbarton
Date:     2010-03-06 22:47:16 +0100 (Sat, 06 Mar 2010)

Log Message:
-----------
re-project + gimp integration, now its easy to edit the view in the gimp and apply the projection back without manually opening and saving files.

Modified Paths:
--------------
    trunk/blender/release/scripts/op/image.py
    trunk/blender/release/scripts/ui/space_view3d_toolbar.py
    trunk/blender/source/blender/makesrna/intern/rna_image.c
    trunk/blender/source/blender/makesrna/intern/rna_image_api.c

Modified: trunk/blender/release/scripts/op/image.py
===================================================================
--- trunk/blender/release/scripts/op/image.py	2010-03-06 21:45:46 UTC (rev 27297)
+++ trunk/blender/release/scripts/op/image.py	2010-03-06 21:47:16 UTC (rev 27298)
@@ -42,12 +42,103 @@
         return {'FINISHED'}
 
 
+_proj_hack = [""]
+class ProjectEdit(bpy.types.Operator):
+    '''Select object matching a naming pattern'''
+    bl_idname = "image.project_edit"
+    bl_label = "Project Edit"
+    bl_options = {'REGISTER'}
+
+    def execute(self, context):
+        import os
+        import subprocess
+
+        EXT = "tga" # until we have a way to save as another format!
+        EDITOR = "gimp" # until we have a way to set a default image edior
+        
+        for image in bpy.data.images:
+            image.tag = True
+
+        bpy.ops.paint.image_from_view()
+        
+        image_new = None
+        for image in bpy.data.images:
+            if not image.tag:
+                image_new = image
+                break
+        
+        if not image_new:
+            self.report({'ERROR'}, "Could not make new image")
+            return {'CANCELLED'}
+        
+        filename = os.path.basename(bpy.data.filename)
+        filename = os.path.splitext(filename)[0]
+
+        if filename.startswith("."): # TODO, have a way to check if the file is saved, assuem .B25.blend
+            filename = os.path.join(os.path.dirname(bpy.data.filename), filename)
+        else:
+            filename = "//" + filename
+        
+        obj = context.object
+
+        if obj:
+            filename += "_" + bpy.utils.clean_name(obj.name)
+        
+        filename_final = filename + "." + EXT
+        i = 0
+
+        while os.path.exists(bpy.utils.expandpath(filename_final)):
+            filename_final = filename + ("%.3d.%s" % (i, EXT))
+            i += 1
+        
+        image_new.name = os.path.basename(filename_final)
+        _proj_hack[0] = image_new.name
+        
+        image_new.filename_raw = filename_final # TODO, filename raw is crummy
+        image_new.save()
+        
+        subprocess.Popen([EDITOR, bpy.utils.expandpath(filename_final)])
+        
+        return {'FINISHED'}
+
+
+class ProjectApply(bpy.types.Operator):
+    '''Select object matching a naming pattern'''
+    bl_idname = "image.project_apply"
+    bl_label = "Project Apply"
+    bl_options = {'REGISTER'}
+
+    def execute(self, context):
+        image_name = _proj_hack[0] # TODO, deal with this nicer
+
+        try:
+            image = bpy.data.images[_proj_hack[0]]
+        except KeyError:
+            self.report({'ERROR'}, "Could not find image '%s'" % image_name)
+            return {'CANCELLED'}
+
+        image.reload()
+        bpy.ops.paint.project_image(image=image_name)
+
+        return {'FINISHED'}
+
+
+classes = [
+    SaveDirty,
+    ProjectEdit,
+    ProjectApply]
+
+
 def register():
-    bpy.types.register(SaveDirty)
+    register = bpy.types.register
+    for cls in classes:
+        register(cls)
 
 
 def unregister():
-    bpy.types.unregister(SaveDirty)
+    unregister = bpy.types.unregister
+    for cls in classes:
+        unregister(cls)
 
 if __name__ == "__main__":
     register()

Modified: trunk/blender/release/scripts/ui/space_view3d_toolbar.py
===================================================================
--- trunk/blender/release/scripts/ui/space_view3d_toolbar.py	2010-03-06 21:45:46 UTC (rev 27297)
+++ trunk/blender/release/scripts/ui/space_view3d_toolbar.py	2010-03-06 21:47:16 UTC (rev 27298)
@@ -906,10 +906,15 @@
 
         sub = col.column()
         sub.prop(ipaint, "seam_bleed")
-
+        
+        row = col.row(align=True)
+        row.operator("image.project_edit", text="View Edit")
+        row.operator("image.project_apply", text="Apply")
+        
         sub = col.column()
-        col.operator("image.save_dirty", text="Save Edited")
-        col.operator("paint.project_image")
+        sub.operator("paint.project_image")
+        
+        sub.operator("image.save_dirty", text="Save Edited")
 
 
 class VIEW3D_MT_tools_projectpaint_clone(bpy.types.Menu):

Modified: trunk/blender/source/blender/makesrna/intern/rna_image.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_image.c	2010-03-06 21:45:46 UTC (rev 27297)
+++ trunk/blender/source/blender/makesrna/intern/rna_image.c	2010-03-06 21:47:16 UTC (rev 27298)
@@ -280,6 +280,11 @@
 	RNA_def_property_ui_text(prop, "Filename", "Image/Movie file name");
 	RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, "rna_Image_reload_update");
 
+	/* eek. this is horrible but needed so we can save to a new name without blanking the data :( */
+	prop= RNA_def_property(srna, "filename_raw", PROP_STRING, PROP_FILEPATH);
+	RNA_def_property_string_sdna(prop, NULL, "name");
+	RNA_def_property_ui_text(prop, "Filename", "Image/Movie file name (without data refreshing)");
+
 	prop= RNA_def_property(srna, "source", PROP_ENUM, PROP_NONE);
 	RNA_def_property_enum_items(prop, image_source_items);
 	RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_Image_source_itemf");

Modified: trunk/blender/source/blender/makesrna/intern/rna_image_api.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_image_api.c	2010-03-06 21:45:46 UTC (rev 27297)
+++ trunk/blender/source/blender/makesrna/intern/rna_image_api.c	2010-03-06 21:47:16 UTC (rev 27298)
@@ -40,6 +40,7 @@
 #include "BKE_packedFile.h"
 #include "BKE_main.h"
 #include "BKE_utildefines.h"
+#include "BKE_global.h" /* grr: G.sce */
 
 #include "IMB_imbuf.h"
 
@@ -84,12 +85,21 @@
 {
 	ImBuf *ibuf= BKE_image_get_ibuf(image, NULL);
 	if(ibuf) {
+		char filename[FILE_MAXDIR + FILE_MAXFILE];
+		BLI_strncpy(filename, image->name, sizeof(filename));
+		BLI_convertstringcode(filename, G.sce);
+
 		if(image->packedfile) {
 			if (writePackedFile(reports, image->name, image->packedfile, 0) != RET_OK) {
 				BKE_reportf(reports, RPT_ERROR, "Image \"%s\" could saved packed file to \"%s\"", image->id.name+2, image->name);
 			}
 		}
-		else if (IMB_saveiff(ibuf, image->name, ibuf->flags)) {
+		else if (IMB_saveiff(ibuf, filename, ibuf->flags)) {
+			image->type= IMA_TYPE_IMAGE;
+
+			if(image->source==IMA_SRC_GENERATED)
+				image->source= IMA_SRC_FILE;
+
 			ibuf->userflags &= ~IB_BITMAPDIRTY;
 		}
 		else {





More information about the Bf-blender-cvs mailing list