Skip to content

Instantly share code, notes, and snippets.

@TMPxyz
Last active April 21, 2017 08:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save TMPxyz/57b633297a7b6442ac470dd61e40e394 to your computer and use it in GitHub Desktop.
Save TMPxyz/57b633297a7b6442ac470dd61e40e394 to your computer and use it in GitHub Desktop.
Automatically replace the selected layers with original png files based on the layer names
#target photoshop
// debug level: 0-2 (0:disable, 1:break on error, 2:break at beginning)
// $.level = 0;
// debugger; // launch debugger on next line
app.activeDocument.suspendHistory("AutoUpdateSelectedLayers", "main()");
///////////////////////////////////////////////////////////////////////////////
// Functions
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
// Function: main
// Usage: the core routine for this script
// Input: <none>
// Return: <none>
///////////////////////////////////////////////////////////////////////////////
function main() {
if (app.documents.length <= 0) {
if (DialogModes.NO != app.playbackDisplayDialogs) {
alert('no document is opened!');
}
return 'cancel'; // quit, returning 'cancel' (dont localize) makes the actions palette not record our script
}
try {
var docRef = app.activeDocument;
var selectedLayers = getSelectedLayers();
if (selectedLayers.length <= 0) {
if (DialogModes.NO != app.playbackDisplayDialogs) {
alert("no selected layers");
return 'cancel'; // quit, returning 'cancel' (dont localize) makes the actions palette not record our script
}
} else {
var basename = docRef.name.slice(0, docRef.name.lastIndexOf('.'));
var basepath = docRef.path + '/export_' + basename;
var folder = Folder(basepath);
if (!folder.exists) {
alert("path not exists: " + folder.fsName);
} else {
for (var i in selectedLayers) {
var layer = selectedLayers[i];
if (isLayer(layer)) {
updateLayer(layer, basepath);
}
}
}
}
} catch (e) {
alert(e);
}
}
///////////////////////////////////////////////////////////////////////////////
// Function: updateLayer
// Usage: update specified layer
// Input: layer reference
// Return: none
///////////////////////////////////////////////////////////////////////////////
function updateLayer(layer, basepath) {
var docRef = app.activeDocument;
var srcPath = basepath + "/" + layer.name + ".png";
var file = new File(srcPath);
if (!file.exists) {
alert('file not exists: ' + srcPath);
return;
}
app.activeDocument.activeLayer = layer;
createSmartObject();
replaceContents(srcPath);
rasterizeSmartObject();
}
function createSmartObject() {
//alert('a');
var c = new RGBColor;
c.hexValue = 'FFFFFF';
var sel = app.activeDocument.selection;
sel.selectAll();
sel.fill(c);
//alert('a1');
var idnewPlacedLayer = stringIDToTypeID('newPlacedLayer');
executeAction(idnewPlacedLayer, undefined, DialogModes.NO);
}
function replaceContents(newFilePath) {
//alert('b');
var idplacedLayerReplaceContents = stringIDToTypeID("placedLayerReplaceContents");
var desc3 = new ActionDescriptor();
var idnull = charIDToTypeID("null");
desc3.putPath(idnull, new File(newFilePath));
var idPgNm = charIDToTypeID("PgNm");
desc3.putInteger(idPgNm, 1);
executeAction(idplacedLayerReplaceContents, desc3, DialogModes.NO);
//alert('b1');
};
function rasterizeSmartObject() {
var layer = app.activeDocument.activeLayer;
//alert('c');
if (layer.typename == "ArtLayer") {
if (layer.kind == LayerKind.SMARTOBJECT) {
//alert('d');
layer.rasterize(RasterizeType.ENTIRELAYER);
}
}
//alert('e');
}
function getSelectedLayers() {
var selectedLayers = new Array;
var layerIndices = getSelectedLayersIdx();
for (var i in layerIndices) {
var layer = selectByIndex(layerIndices[i]);
selectedLayers.push(layer);
}
return selectedLayers;
}
function getSelectedLayersIdx() {
var selectedLayers = new Array;
var ref = new ActionReference();
ref.putEnumerated(charIDToTypeID("Dcmn"), charIDToTypeID("Ordn"), charIDToTypeID("Trgt"));
var desc = executeActionGet(ref);
if (desc.hasKey(stringIDToTypeID('targetLayers'))) {
desc = desc.getList(stringIDToTypeID('targetLayers'));
var c = desc.count
var selectedLayers = new Array();
for (var i = 0; i < c; i++) {
try {
activeDocument.backgroundLayer;
selectedLayers.push(desc.getReference(i).getIndex());
} catch (e) {
selectedLayers.push(desc.getReference(i).getIndex() + 1);
}
}
} else {
var ref = new ActionReference();
ref.putProperty(charIDToTypeID("Prpr"), charIDToTypeID("ItmI"));
ref.putEnumerated(charIDToTypeID("Lyr "), charIDToTypeID("Ordn"), charIDToTypeID("Trgt"));
try {
activeDocument.backgroundLayer;
selectedLayers.push(executeActionGet(ref).getInteger(charIDToTypeID("ItmI")) - 1);
} catch (e) {
selectedLayers.push(executeActionGet(ref).getInteger(charIDToTypeID("ItmI")));
}
var vis = app.activeDocument.activeLayer.visible;
if (vis == true) app.activeDocument.activeLayer.visible = false;
var desc9 = new ActionDescriptor();
var list9 = new ActionList();
var ref9 = new ActionReference();
ref9.putEnumerated(charIDToTypeID('Lyr '), charIDToTypeID('Ordn'), charIDToTypeID('Trgt'));
list9.putReference(ref9);
desc9.putList(charIDToTypeID('null'), list9);
executeAction(charIDToTypeID('Shw '), desc9, DialogModes.NO);
if (app.activeDocument.activeLayer.visible == false) selectedLayers.shift();
app.activeDocument.activeLayer.visible = vis;
}
return selectedLayers;
}
///////////////////////////////////////////////////////////////////////////////
// Function: selectByIndex
// Description: Sets the activeLayer by AM itemIndex and returns DOM active layer
// Usage: var idx = makeActiveByIndex( 7 );
// Input: Number (single idx)
// Return: activeLayer
///////////////////////////////////////////////////////////////////////////////
function selectByIndex(idx) {
// avoid error when background layer idx is passed
if (idx == 0) return;
// if an array is passed use only the first element
if (idx.length != undefined) {
idx = idx[0];
}
// execute selection
var desc = new ActionDescriptor();
var ref = new ActionReference();
ref.putIndex(charIDToTypeID('Lyr '), idx);
desc.putReference(charIDToTypeID('null'), ref);
executeAction(charIDToTypeID('slct'), desc, DialogModes.NO);
return app.activeDocument.activeLayer;
}
function setVisibleAll(obj, flag) {
for (var i = 0; i < obj.artLayers.length; i++) {
obj.artLayers[i].allLocked = false;
obj.artLayers[i].visible = flag;
}
for (var i = 0; i < obj.layerSets.length; i++) {
var s = obj.layerSets[i];
s.allLocked = false;
s.visible = flag;
setVisibleAll(obj.layerSets[i], flag);
}
}
///////////////////////////////////////////////////////////////////////////////
// Function: setInvisibleAllArtLayers
// Usage: unlock and make invisible all art layers, recursively
// Input: document or layerset
// Return: all art layers are unlocked and invisible
///////////////////////////////////////////////////////////////////////////////
function setInvisibleAllArtLayers(obj) {
for (var i = 0; i < obj.artLayers.length; i++) {
obj.artLayers[i].allLocked = false;
obj.artLayers[i].visible = false;
}
for (var i = 0; i < obj.layerSets.length; i++) {
setInvisibleAllArtLayers(obj.layerSets[i]);
}
}
function isLayer(obj) {
return obj.typename == "ArtLayer";
}
function isLayerSet(obj) {
return obj.typename == "LayerSet";
}
function getSelectedLayersNames() {
var s = "";
var sLayers = getSelectedLayersIdx();
var Names = new Array();
for (var a in sLayers) {
//Names.push(app.activeDocument.layers[Number(sLayers[a])].name);
var idx = Number(sLayers[a]);
var name = getLayerNameByIndex(idx);
Names.push(name);
s += name + " : ";
s += idx + "\n";
}
alert(Names.join('\n'));
alert(s);
return Names;
}
function getLayerNameByIndex(idx) {
var ref = new ActionReference();
ref.putIndex(charIDToTypeID("Lyr "), idx);
return executeActionGet(ref).getString(charIDToTypeID("Nm "));
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment