Last active
April 21, 2017 08:48
-
-
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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