Hi all.
Hoping one of you gurus out there can help me - and please be gentle I am learning....
Challenge: I have an image template that I have been using the variable data sets to amend images and text layers on quite successfully. Now I want to take it to the next level and automate the changing of a smart object (working code below - credit to the late JJMack) and a specific named text layer in the main image. Both the amended text and the smart object image are unique to the resulting output file. Issue is that if I run Export Data Sets as Files I have unique files with amended text but not image. If I run script, I have unique files with correct image but original text.
In an ideal world, I would run a single script and change both the smart object and the text field before creating the output file.
I'd appreciate any guidance you can give.
Thanks
The script I am currently developing is:
// Replace SmartObjects Content and Save as PSD
// 2017, use it at your own risk - CREDIT TO JJMACK
#target photoshop
if (app.documents.length > 0) {
var myDocument = app.activeDocument;
var theName = myDocument.name.match(/(.*)\.[^\.]+$/)[1];
var thePath = myDocument.path;
var theLayer = myDocument.activeLayer;
psdOpts = new PhotoshopSaveOptions();
psdOpts.embedColorProfile = true;
psdOpts.alphaChannels = true;
psdOpts.layers = true;
psdOpts.spotColors = true;
// Check if layer is SmartObject;
if (theLayer.kind != "LayerKind.SMARTOBJECT") {
alert("selected layer is not a smart object")
} else {
// Select Files;
if ($.os.search(/windows/i) != -1) {
var theFiles = File.openDialog("please select files", "*.psd;*.tif;*.jpg", true)
} else {
//DIALOG var theFiles = File.openDialog("please select files", getFiles, true)
var theFiles = Folder(thePath +"/Discs/").getFiles(/\.(jpg|tif|psd)$/i);
};
};
if (theFiles) {
for (var m = 0; m < theFiles.length; m++) {
// Replace SmartObject
theLayer = replaceContents(theFiles[m], theLayer);
var theNewName = theFiles[m].name.match(/(.*)\.[^\.]+$/)[1];
myDocument.saveAs((new File(thePath + "/_output/" + theName + "." + theNewName + ".psd")), psdOpts, true);
}
}
// }
};
// Get PSDs, TIFs and JPGs from files
function getFiles(theFile) {
if (theFile.name.match(/\.(psd|tif|jpg)$/i) != null || theFile.constructor.name == "Folder") {
return true
};
};
// Replace SmartObject Contents
function replaceContents(newFile, theSO) {
app.activeDocument.activeLayer = theSO;
// =======================================================
var idplacedLayerReplaceContents = stringIDToTypeID("placedLayerReplaceContents");
var desc3 = new ActionDescriptor();
var idnull = charIDToTypeID("null");
desc3.putPath(idnull, new File(newFile));
var idPgNm = charIDToTypeID("PgNm");
desc3.putInteger(idPgNm, 1);
executeAction(idplacedLayerReplaceContents, desc3, DialogModes.NO);
return app.activeDocument.activeLayer
};
SOLVED! Smart Image Replace + Text Layer Amendment
SOLVED! Smart Image Replace + Text Layer Amendment
Last edited by MBE4645 on Wed Aug 10, 2022 1:27 am, edited 1 time in total.
Re: Smart Image Replace + Text Layer Amendment
Attach some of your images & your .csv file you use with a script & DataSets, so I'll see what I can do...
Re: Smart Image Replace + Text Layer Amendment
Thanks. Not allowing me to attach either PSD or CSV files. Am mailing to you directly in zip file.
Re: Smart Image Replace + Text Layer Amendment
Loll, you almost answered yourself. That's the trick, to attach the .zip file
Everyting is almost done. You run the script when the smart object is active, and the .csv file is contained in the same folder as open .psd. Beside extension they both use same name. The names in .csv are same as names of .psd files (to be placed in smart object). So the only thing you need to do (beside keeping same named .csv and .psd files ie. 'Breaking Bad (2008).S01') is to replace:
to:
Everyting is almost done. You run the script when the smart object is active, and the .csv file is contained in the same folder as open .psd. Beside extension they both use same name. The names in .csv are same as names of .psd files (to be placed in smart object). So the only thing you need to do (beside keeping same named .csv and .psd files ie. 'Breaking Bad (2008).S01') is to replace:
Code: Select all
if (theFiles) {
for (var m = 0; m < theFiles.length; m++) {
// Replace SmartObject
theLayer = replaceContents(theFiles[m], theLayer);
var theNewName = theFiles[m].name.match(/(.*)\.[^\.]+$/)[1];
myDocument.saveAs((new File(thePath + "/_output/" + theName + "." + theNewName + ".psd")), psdOpts, true);
}
}
Code: Select all
if (theFiles) {
sTT = stringIDToTypeID; for(m = 0; m < theFiles.length; m++) {
theNewName = decodeURI(theFiles[m].name.match(/(.*)\.[^\.]+$/)[1])
myDocument.activeLayer = myDocument.artLayers.getByName('episode_title');
(ref = new ActionReference()).putName(sTT('dataSetClass'), theNewName);
(dsc = new ActionDescriptor()).putReference(sTT('null'), ref)
executeAction(sTT('apply'), dsc)
// Replace SmartObject
myDocument.activeLayer = theLayer
theLayer = replaceContents(theFiles[m], theLayer)
myDocument.saveAs((File(thePath + '/_output/' +
theName + '.' + theNewName + '.psd')), psdOpts, true)
}
}
Re: Smart Image Replace + Text Layer Amendment
Many, many thanks. Can confirm this is working exactly as required.