Skip to main content
Participant
May 5, 2023
Answered

Photoshop scripting documentation

  • May 5, 2023
  • 2 replies
  • 1899 views

Hello devs,

 

I am planning to write some scripts for photoshop for a friend of mine. As of my knowlege the latest documentation for scripting dates back to 2020. Is there an active guide anywhere? I am looking to manipulate layers. I would like to distribute two uneven layers horizontally and center them vertically to be persice.

 

Any help is much appreciated. 

This topic has been closed for replies.
Correct answer y.antypas

Hello @Stephen Marsh , thank you for your reply.

Scripting Listener dowsnt work on Apple MacBookPro 13-inch, M2, 2022.
I was able to write the script with help from the documentation above. 

 

var doc = app.activeDocument;

var selectedLayers = getSelectedLayers();

if (selectedLayers.length == 2) {
    
    var result = idLayers(selectedLayers);

    var object = result.object
    var scale = result.scale

    var layersToDistribute = [object, scale];
    h0Vcenter(object)
    h0Vcenter(scale)
    distributeRow(object, scale);
} else {
    alert("Please select 2 players");
}
function h0Vcenter(layer) {
    var currentX = layer.bounds[0].value;
    var currentY = layer.bounds[1].value;
    var deltaX = -currentX;

    var centerY = doc.height.value / 2;
    var layerHeight = layer.bounds[3].value - layer.bounds[1].value;
    var targetY = centerY - layerHeight / 2;
    var deltaY = targetY - currentY;

    layer.translate(deltaX, deltaY);
}
function idLayers(layers) {
    var objectLayer = layers[0];
    var scaleLayer = layers[1];
    var objectWidth = objectLayer.bounds[2].value - objectLayer.bounds[0].value;
    var objectHeight = objectLayer.bounds[3].value - objectLayer.bounds[1].value;
    var scaleWidth = scaleLayer.bounds[2].value - scaleLayer.bounds[0].value;
    var scaleHeight = scaleLayer.bounds[3].value - scaleLayer.bounds[1].value;

    if (objectWidth * objectHeight < scaleWidth * scaleHeight) {
        var tempLayer = objectLayer;
        objectLayer = scaleLayer;
        scaleLayer = tempLayer;
    }

    return { object: objectLayer, scale: scaleLayer };
}
function getSelectedLayers() {
    var ActLay = app.activeDocument.activeLayer;
    ActLay.allLocked = true;
    var L = app.activeDocument.layers.length;
    var selLayers = new Array();
    for(var i = 0; i < L; i++) {
        var LayerType = app.activeDocument.layers[i].typename;
        var layerRef = app.activeDocument.layers[i];
        if (LayerType == "LayerSet" ) {
            var refLength = layerRef.layers.length;
            for(var j = 0; j < refLength; j++) {
                var refLay = layerRef.layers[j];
                if (refLay.allLocked == true){selLayers.push(refLay)}
            }
            continue;
        }
        if (layerRef.allLocked == true) {selLayers.push(layerRef)}
    }
    ActLay.allLocked = false;
    return selLayers;
}
function distributeRow(layer2, layer1) {
   
    var layer1Left = layer1.bounds[0].value;
    var layer1Right = layer1.bounds[2].value;
    var layer2Left = layer2.bounds[0].value;
    var layer2Right = layer2.bounds[2].value;

    var totalWidth = (layer1Right - layer1Left) + (layer2Right - layer2Left);
    var remainingWidth = doc.width.value - totalWidth;
    var spaceBetween = Math.round(remainingWidth / 3);

    var layer1Delta = spaceBetween - layer1Left;
    var layer2Delta = (spaceBetween * 2) + (layer1Right - layer1Left) - layer2Left;

    layer1.translate(layer1Delta, 0);
    layer2.translate(layer2Delta, 0);   
}

 so is UXP the new way of writing scripts or what?

2 replies

Stephen Marsh
Community Expert
Community Expert
May 6, 2023

There are many features which aren't covered in the Scripting DOM, which is where AM or Action Manager code and the ScriptingListener plugin comes in handy.

y.antypasAuthorCorrect answer
Participant
May 13, 2023

Hello @Stephen Marsh , thank you for your reply.

Scripting Listener dowsnt work on Apple MacBookPro 13-inch, M2, 2022.
I was able to write the script with help from the documentation above. 

 

var doc = app.activeDocument;

var selectedLayers = getSelectedLayers();

if (selectedLayers.length == 2) {
    
    var result = idLayers(selectedLayers);

    var object = result.object
    var scale = result.scale

    var layersToDistribute = [object, scale];
    h0Vcenter(object)
    h0Vcenter(scale)
    distributeRow(object, scale);
} else {
    alert("Please select 2 players");
}
function h0Vcenter(layer) {
    var currentX = layer.bounds[0].value;
    var currentY = layer.bounds[1].value;
    var deltaX = -currentX;

    var centerY = doc.height.value / 2;
    var layerHeight = layer.bounds[3].value - layer.bounds[1].value;
    var targetY = centerY - layerHeight / 2;
    var deltaY = targetY - currentY;

    layer.translate(deltaX, deltaY);
}
function idLayers(layers) {
    var objectLayer = layers[0];
    var scaleLayer = layers[1];
    var objectWidth = objectLayer.bounds[2].value - objectLayer.bounds[0].value;
    var objectHeight = objectLayer.bounds[3].value - objectLayer.bounds[1].value;
    var scaleWidth = scaleLayer.bounds[2].value - scaleLayer.bounds[0].value;
    var scaleHeight = scaleLayer.bounds[3].value - scaleLayer.bounds[1].value;

    if (objectWidth * objectHeight < scaleWidth * scaleHeight) {
        var tempLayer = objectLayer;
        objectLayer = scaleLayer;
        scaleLayer = tempLayer;
    }

    return { object: objectLayer, scale: scaleLayer };
}
function getSelectedLayers() {
    var ActLay = app.activeDocument.activeLayer;
    ActLay.allLocked = true;
    var L = app.activeDocument.layers.length;
    var selLayers = new Array();
    for(var i = 0; i < L; i++) {
        var LayerType = app.activeDocument.layers[i].typename;
        var layerRef = app.activeDocument.layers[i];
        if (LayerType == "LayerSet" ) {
            var refLength = layerRef.layers.length;
            for(var j = 0; j < refLength; j++) {
                var refLay = layerRef.layers[j];
                if (refLay.allLocked == true){selLayers.push(refLay)}
            }
            continue;
        }
        if (layerRef.allLocked == true) {selLayers.push(layerRef)}
    }
    ActLay.allLocked = false;
    return selLayers;
}
function distributeRow(layer2, layer1) {
   
    var layer1Left = layer1.bounds[0].value;
    var layer1Right = layer1.bounds[2].value;
    var layer2Left = layer2.bounds[0].value;
    var layer2Right = layer2.bounds[2].value;

    var totalWidth = (layer1Right - layer1Left) + (layer2Right - layer2Left);
    var remainingWidth = doc.width.value - totalWidth;
    var spaceBetween = Math.round(remainingWidth / 3);

    var layer1Delta = spaceBetween - layer1Left;
    var layer2Delta = (spaceBetween * 2) + (layer1Right - layer1Left) - layer2Left;

    layer1.translate(layer1Delta, 0);
    layer2.translate(layer2Delta, 0);   
}

 so is UXP the new way of writing scripts or what?

c.pfaffenbichler
Community Expert
Community Expert
May 14, 2023
quote

Scripting Listener dowsnt work on Apple MacBookPro 13-inch, M2, 2022.

Did you disable »Allow Tool Recording« in the Actions Panel? 

c.pfaffenbichler
Community Expert
Community Expert
May 6, 2023

I am aware of no newer version available as pdf. 

 

If you are new to Photoshop Scripting, I wonder if you might not be better off going with UXP right away instead of ESTK. 

 

Please post screenshots to illustrate the exact and complete layer structure of the image/s in question and th eintended operation.