- bpy.path.abspath(), added optional library argument since any paths from linked...
authorCampbell Barton <ideasman42@gmail.com>
Tue, 11 Oct 2011 04:09:11 +0000 (04:09 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Tue, 11 Oct 2011 04:09:11 +0000 (04:09 +0000)
- Image "Edit Externally" operator can now edit relative library images.

also minor edits to navmesh.

release/scripts/modules/bpy/path.py
release/scripts/startup/bl_operators/image.py
source/blender/blenkernel/intern/DerivedMesh.c
source/blender/editors/mesh/mesh_navmesh.c

index 284fef977955b4a7f2ea7878ba4d17983abc920d..c8a78d521d5b1479f513bd1ca1c3ffe8f8ed8244 100644 (file)
@@ -40,7 +40,7 @@ import bpy as _bpy
 import os as _os
 
 
-def abspath(path, start=None):
+def abspath(path, start=None, library=None):
     """
     Returns the absolute path relative to the current blend file
     using the "//" prefix.
@@ -48,8 +48,13 @@ def abspath(path, start=None):
     :arg start: Relative to this path,
        when not set the current filename is used.
     :type start: string
+    :arg library: The library this path is from. This is only included for
+       convenience, when the library is not None its path replaces *start*.
+    :type library: :class:`bpy.types.Library`
     """
     if path.startswith("//"):
+        if library:
+            start = abspath(_os.path.dirname(library.filepath))
         return _os.path.join(_os.path.dirname(_bpy.data.filepath)
                              if start is None else start,
                              path[2:],
index 2b190e1aee177d6ef0d0efb8321d83ce9e2f6ad5..d0778ddafb2eed67f89085461fdf568b3bd33612 100644 (file)
@@ -69,8 +69,6 @@ class EditExternally(Operator):
             self.report({'ERROR'}, "Image path not set")
             return {'CANCELLED'}
 
-        filepath = os.path.normpath(bpy.path.abspath(filepath))
-
         if not os.path.exists(filepath):
             self.report({'ERROR'},
                         "Image path %r not found, image may be packed or "
@@ -93,15 +91,16 @@ class EditExternally(Operator):
         return {'FINISHED'}
 
     def invoke(self, context, event):
+        import os
         try:
-            filepath = context.space_data.image.filepath
-        except:
-            import traceback
-            traceback.print_exc()
-            self.report({'ERROR'}, "Image not found on disk")
+            image = context.space_data.image
+        except AttributeError:
+            self.report({'ERROR'}, "Context incorrect, image not found")
             return {'CANCELLED'}
 
-        self.filepath = filepath
+        filepath = bpy.path.abspath(image.filepath, library=image.library)
+
+        self.filepath = os.path.normpath(filepath)
         self.execute(context)
 
         return {'FINISHED'}
index bc6492f92aeb906a932d49252bad24f962d572ee..c379111ccfd13d0d465bb212821d12a8964050bd 100644 (file)
@@ -64,6 +64,7 @@
 
 #ifdef WITH_GAMEENGINE
 #include "BKE_navmesh_conversion.h"
+static DerivedMesh *navmesh_dm_createNavMeshForVisualization(DerivedMesh *dm);
 #endif
 
 #include "BLO_sys_types.h" // for intptr_t support
@@ -77,8 +78,6 @@
 
 extern GLubyte stipple_quarttone[128]; /* glutil.c, bad level data */
 
-static DerivedMesh *navmesh_dm_createNavMeshForVisualization(DerivedMesh *dm);
-
 ///////////////////////////////////
 ///////////////////////////////////
 
index bd5f4b5fe68ba186b386b082f86c0fae0c13c17c..b8ace26991ed13d7c8ef8e0b89f4aa4da5f3968c 100644 (file)
@@ -459,12 +459,14 @@ static int create_navmesh_exec(bContext *C, wmOperator *op)
 
                MEM_freeN(verts);
                MEM_freeN(tris);
+
+               return OPERATOR_FINISHED;
        }
        else {
                BKE_report(op->reports, RPT_ERROR, "No mesh objects found");
-       }
 
-       return OPERATOR_FINISHED;
+               return OPERATOR_CANCELLED;
+       }
 }
 
 void MESH_OT_navmesh_make(wmOperatorType *ot)