added Jiri as a contributer to the obj importer
Added a new script - 'Dump All Images to Path' This script copies all the images used by 1 blend to a spesified path and references the new images from Blender Usefull for moving projects between computers or when you reference many images. naming collisions and multiple images using the same image path are delt with properly only creating new image names when needed. Blender images will reference the newly copied files - So be mindfull when you save your blend after running the script. Notes, images with the path "Untitled will be ignored" Image path collisions are managed by enumerating the path names so images will never be overwritten at the target path.
This commit is contained in:
@@ -10,12 +10,27 @@ def Error_NoMeshUvActive():
|
||||
|
||||
# File I/O messages
|
||||
def Error_NoFile(path):
|
||||
'''True if file missing, False if files there'''
|
||||
'''True if file missing, False if files there
|
||||
|
||||
Use simply by doing...
|
||||
if Error_NoFile(path): return
|
||||
'''
|
||||
if not sys.exists(sys.expandpath(path)):
|
||||
Draw.PupMenu("Error%t|Can't open file: " + path)
|
||||
return True
|
||||
return False
|
||||
|
||||
def Error_NoDir(path):
|
||||
'''True if dirs missing, False if dirs there
|
||||
|
||||
Use simply by doing...
|
||||
if Error_NoDir(path): return
|
||||
'''
|
||||
if not sys.exists(sys.expandpath(path)):
|
||||
Draw.PupMenu("Error%t|Path does not exist: " + path)
|
||||
return True
|
||||
return False
|
||||
|
||||
def Warning_SaveOver(path):
|
||||
'''Returns - True to save, False dont save'''
|
||||
if sys.exists(sys.expandpath(path)):
|
||||
|
||||
136
release/scripts/image_dump2path.py
Normal file
136
release/scripts/image_dump2path.py
Normal file
@@ -0,0 +1,136 @@
|
||||
#!BPY
|
||||
"""
|
||||
Name: 'Dump All Images to Path'
|
||||
Blender: 242
|
||||
Group: 'Image'
|
||||
Tooltip: 'Copy and reference all images to a new path.'
|
||||
"""
|
||||
__author__= "Campbell Barton"
|
||||
__url__= ["blender.org", "blenderartists.org"]
|
||||
__version__= "1.0"
|
||||
|
||||
__bpydoc__= """
|
||||
|
||||
This script copies all the images used by 1 blend to a spesified path and references the new images from Blender
|
||||
Usefull for moving projects between computers or when you reference many images. naming collisions and multiple images using the same image path are delt with properly only creating new image names when needed.
|
||||
|
||||
Blender images will reference the newly copied files - So be mindfull when you save your blend after running the script.
|
||||
|
||||
Notes, images with the path "Untitled will be ignored"
|
||||
|
||||
Image path collisions are managed by enumerating the path names so images will never be overwritten at the target path.
|
||||
"""
|
||||
|
||||
from Blender import Image, sys, Draw, Window
|
||||
import BPyMessages
|
||||
|
||||
def copy_file(srcpath, destpath):
|
||||
f=open(srcpath, 'rb')
|
||||
data= f.read()
|
||||
f.close()
|
||||
f= open(destpath, 'wb')
|
||||
f.write(data)
|
||||
f.close()
|
||||
|
||||
# Makes the pathe relative to the blend file path.
|
||||
def makeRelative(path, blendBasePath):
|
||||
if path.startswith(blendBasePath):
|
||||
path = path.replace(blendBasePath, '//')
|
||||
path = path.replace('//\\', '//')
|
||||
return path
|
||||
|
||||
def makeUnique(path):
|
||||
|
||||
if not sys.exists(path):
|
||||
return path
|
||||
|
||||
orig_path = path
|
||||
orig_path_noext, ext= sys.splitext(path)
|
||||
|
||||
i= 1
|
||||
while sys.exists(path):
|
||||
path = '%s_%.3d.%s' % (orig_path_noext, i, ext)
|
||||
i+= 1
|
||||
|
||||
return path
|
||||
|
||||
|
||||
def main():
|
||||
#images= [(img, img.name, sys.expandpath(img.filename)) for img in Image.Get() if img.filename != 'Untitled' and img.name not in ("Render Result", "Compositor")]
|
||||
|
||||
# remove double paths so we dont copy twice
|
||||
image_dict= {}
|
||||
image_missing = []
|
||||
|
||||
|
||||
# Make a dict of images with thir file name as a key
|
||||
for img in Image.Get():
|
||||
name= img.name
|
||||
filename= sys.expandpath(img.filename)
|
||||
|
||||
if filename== 'Untitled' or name == "Render Result" or name == "Compositor":
|
||||
continue
|
||||
|
||||
if not sys.exists(filename):
|
||||
image_missing.append(name)
|
||||
|
||||
|
||||
try: image_dict[filename].append(img)
|
||||
except: image_dict[filename]= [img]
|
||||
|
||||
|
||||
if image_missing:
|
||||
ret= Draw.PupMenu( 'Aborting, Image file(s) missing%t|' + '|'.join(image_missing) )
|
||||
if ret != -1:
|
||||
Image.Get(image_missing[ret-1]).makeCurrent()
|
||||
return
|
||||
|
||||
# Chech done - select a dir
|
||||
def dump_images(dump_path):
|
||||
|
||||
tot = len(image_dict)
|
||||
count = 0
|
||||
|
||||
print 'starting the image dump'
|
||||
|
||||
dump_path = sys.dirname(dump_path)
|
||||
base_blen_path = sys.expandpath('//')
|
||||
|
||||
if BPyMessages.Error_NoDir(dump_path): return
|
||||
|
||||
# ahh now were free to copy the images.
|
||||
for filename, imgs in image_dict.iteritems():
|
||||
count +=1
|
||||
file= filename.split('\\')[-1].split('/')[-1]
|
||||
new_filename= makeUnique( sys.join(dump_path, file) )
|
||||
|
||||
print ' copying image "%s" %d of %d' % (dump_path, count, tot)
|
||||
print ' source path:', filename
|
||||
print ' target path:', new_filename
|
||||
|
||||
copy_fail= False
|
||||
try:
|
||||
copy_file( filename, new_filename)
|
||||
except:
|
||||
copy_fail = True
|
||||
|
||||
if copy_fail or sys.exists(new_filename)==0:
|
||||
print '\tERROR could not copy the file above!'
|
||||
Draw.PupMenu('Error%t|Copy Failed, do not save this Blend file|"' + filename + '", see console for details.')
|
||||
return
|
||||
|
||||
# account for
|
||||
for img in imgs:
|
||||
img.filename = makeRelative(new_filename, base_blen_path)
|
||||
|
||||
msg= 'Relinking %d images done' % len(image_dict)
|
||||
Draw.PupMenu(msg)
|
||||
|
||||
Window.RedrawAll()
|
||||
|
||||
print 'done'
|
||||
|
||||
Window.FileSelector(dump_images, 'IMG DUMP DIR', '')
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
@@ -7,7 +7,7 @@ Group: 'Import'
|
||||
Tooltip: 'Load a Wavefront OBJ File, Shift: batch import all dir.'
|
||||
"""
|
||||
|
||||
__author__= "Campbell Barton"
|
||||
__author__= "Campbell Barton", "Jiri Hnidek"
|
||||
__url__= ["blender.org", "blenderartists.org"]
|
||||
__version__= "2.0"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user