Zikk
Zikk

Reputation: 1

How to dynamically set layer name based on variable data in Photoshop script?

I'm not good at programming, but I'm a good graphic designer :) I created a work automation using javascript (I also assisted with codelam). I have a big problem in achieving the goal which is:

Downloading data from the "Orange" and "Velutto" fields. This data changes in the script (I control the main script with another). Sometimes the data is, for example, "Green" etc. I need this data to set the layer name. It is with this section that I have the biggest problem. I will upload the whole code for better clarity.

var idPly = charIDToTypeID( "Ply " );
var desc = new ActionDescriptor();
var ref = new ActionReference();
ref.putName( charIDToTypeID( "Actn" ), "Orange" );
ref.putName( charIDToTypeID( "ASet" ), "Velutto" );
desc.putReference( charIDToTypeID( "null" ), ref );
executeAction( idPly, desc, DialogModes.NO );

Here is all the code:

// Zapisanie stanu aktywnej historii
var savedState = app.activeDocument.activeHistoryState


// Ustawia aktywną warstwę na pierwszą warstwę dokumentu
var doc = app.activeDocument;
app.activeDocument.activeLayer = app.activeDocument.layers[doc.layers.length - 4];

// Akcja 1

var idPly = charIDToTypeID( "Ply " );
var desc = new ActionDescriptor();
var ref = new ActionReference();
ref.putName( charIDToTypeID( "Actn" ), "Orange" );
ref.putName( charIDToTypeID( "ASet" ), "Velutto" );
desc.putReference( charIDToTypeID( "null" ), ref );
executeAction( idPly, desc, DialogModes.NO );


// Ustawia aktywną warstwę na ostatnią warstwę dokumentu
var doc = app.activeDocument;
app.activeDocument.activeLayer = app.activeDocument.layers[doc.layers.length - 1];

// Pokazuje wszystkie warstwy w dokumencie
var idShw = charIDToTypeID("Shw ");
var desc440 = new ActionDescriptor();
var idnull = charIDToTypeID("null");
var list49 = new ActionList();
var ref122 = new ActionReference();
var idLyr = charIDToTypeID("Lyr ");
var idOrdn = charIDToTypeID("Ordn");
var idTrgt = charIDToTypeID("Trgt");
ref122.putEnumerated(idLyr, idOrdn, idTrgt);
list49.putReference(ref122);
desc440.putList(idnull, list49);
var idTglO = charIDToTypeID("TglO");
desc440.putBoolean(idTglO, true);
executeAction(idShw, desc440, DialogModes.NO);

// Ustawia aktywny kanał na drugi kanał w dokumencie
app.activeDocument.activeChannels = [app.activeDocument.channels[1]];

// Ustawia zaznaczenie na bieżący kanał
var r1 = new ActionReference();
r1.putProperty(charIDToTypeID("Chnl"), charIDToTypeID("fsel"));
var d = new ActionDescriptor();
d.putReference(charIDToTypeID("null"), r1);
var r2 = new ActionReference();
r2.putEnumerated(charIDToTypeID("Chnl"), charIDToTypeID("Ordn"), charIDToTypeID("Trgt"));
d.putReference(charIDToTypeID("T   "), r2);
executeAction(charIDToTypeID("setd"), d, DialogModes.NO);

// Wybiera kanał RGB
var idslct = charIDToTypeID("slct");
var desc476 = new ActionDescriptor();
var idnull = charIDToTypeID("null");
var ref140 = new ActionReference();
var idChnl = charIDToTypeID("Chnl");
var idRGB = charIDToTypeID("RGB ");
ref140.putEnumerated(idChnl, idChnl, idRGB);
desc476.putReference(idnull, ref140);
executeAction(idslct, desc476, DialogModes.NO);

// Ponownie pokazuje wszystkie warstwy w dokumencie
var idShw = charIDToTypeID("Shw ");
var desc629 = new ActionDescriptor();
var idnull = charIDToTypeID("null");
var list83 = new ActionList();
var ref179 = new ActionReference();
var idLyr = charIDToTypeID("Lyr ");
var idOrdn = charIDToTypeID("Ordn");
var idTrgt = charIDToTypeID("Trgt");
ref179.putEnumerated(idLyr, idOrdn, idTrgt);
list83.putReference(ref179);
desc629.putList(idnull, list83);
var idTglO = charIDToTypeID("TglO");
desc629.putBoolean(idTglO, true);
executeAction(idShw, desc629, DialogModes.NO);

// Ustawia aktywną warstwę na warstwę, która jest czwartą od końca
app.activeDocument.activeLayer = app.activeDocument.layers[doc.layers.length - 5];


// Dodaje maskę warstwy do zaznaczonej grupy
var idMk = charIDToTypeID( "Mk  " );
    var desc562 = new ActionDescriptor();
    var idNw = charIDToTypeID( "Nw  " );
    var idChnl = charIDToTypeID( "Chnl" );
    desc562.putClass( idNw, idChnl );
    var idAt = charIDToTypeID( "At  " );
        var ref148 = new ActionReference();
        var idChnl = charIDToTypeID( "Chnl" );
        var idChnl = charIDToTypeID( "Chnl" );
        var idMsk = charIDToTypeID( "Msk " );
        ref148.putEnumerated( idChnl, idChnl, idMsk );
    desc562.putReference( idAt, ref148 );
    var idUsng = charIDToTypeID( "Usng" );
    var idUsrM = charIDToTypeID( "UsrM" );
    var idRvlS = charIDToTypeID( "RvlS" );
    desc562.putEnumerated( idUsng, idUsrM, idRvlS );
executeAction( idMk, desc562, DialogModes.NO );




// Tworzymy przykładowy kod z danymi
var kod = 'ref.putName( charIDToTypeID( "Actn" ), "Green" ); ref.putName( charIDToTypeID( "ASet" ), "Velutto" );';

// Szukamy wartości po "Actn" za pomocą wyrażenia regularnego
var regexActn = /ref\.putName\( charIDToTypeID\(\s*"Actn"\s*\),\s*"([^"]+)"\s*\)/;
var matchActn = kod.match(regexActn);

// Szukamy wartości po "ASet" za pomocą wyrażenia regularnego
var regexASet = /ref\.putName\( charIDToTypeID\(\s*"ASet"\s*\),\s*"([^"]+)"\s*\)/;
var matchASet = kod.match(regexASet);

// Sprawdzamy, czy znaleziono wartości po "Actn" i "ASet"
if (matchActn && matchActn.length > 1 && matchASet && matchASet.length > 1) {
    // Pobieramy znalezione wartości
    var wartośćActn = matchActn[1];
    var wartośćASet = matchASet[1];
    
    // Tworzymy nową nazwę warstwy na podstawie znalezionych wartości
    var nowaNazwa = wartośćASet + " " + wartośćActn;

    // Utwórz akcję Photoshopa do zmiany nazwy warstwy
    var idsetd = charIDToTypeID("setd");
    var desc776 = new ActionDescriptor();
    var idnull = charIDToTypeID("null");
    var ref255 = new ActionReference();

    // Ustaw referencję do zmiany nazwy warstwy
    var idLyr = charIDToTypeID("Lyr ");
    var idOrdn = charIDToTypeID("Ordn");
    var idTrgt = charIDToTypeID("Trgt");
    ref255.putEnumerated(idLyr, idOrdn, idTrgt);
    desc776.putReference(idnull, ref255);

    // Ustaw nową nazwę warstwy
    var idT = charIDToTypeID("T   ");
    var desc777 = new ActionDescriptor();
    var idNm = charIDToTypeID("Nm  ");
    desc777.putString(idNm, nowaNazwa);
    desc776.putObject(idT, idLyr, desc777);

    // Wykonaj akcję w Photoshopie
    executeAction(idsetd, desc776, DialogModes.NO);
} else {
    alert("Nie znaleziono pasujących wartości.");
}



// Wykonaj akcję w Photoshopie
executeAction(idsetd, desc776, DialogModes.NO);





// Pobiera nazwę aktualnie zaznaczonej warstwy lub grupy
var activeLayer = app.activeDocument.activeLayer;
var layerName = activeLayer.name;

// Ustawia nazwę pliku PSD
var fileName = layerName + ".psd";
var saveFile = File(app.activeDocument.path + '/' + fileName);

// Funkcja zapisująca plik PSD
SavePSD(saveFile);

function SavePSD(saveFile) {
    psdSaveOptions = new PhotoshopSaveOptions();
    psdSaveOptions.embedColorProfile = true;
    psdSaveOptions.alphaChannels = true;
    psdSaveOptions.layers = true;
    psdSaveOptions.annotations = true;
    psdSaveOptions.spotColors = true;
    app.activeDocument.saveAs(saveFile, psdSaveOptions, true, Extension.LOWERCASE);
};

// TG PS
#target photoshop;
if (app.documents.length > 0) {
    var thedoc = app.activeDocument;
    // Pobranie nazwy i lokalizacji pliku Photoshop;
    var docPath = app.activeDocument.path;
    // Opcje zapisu JPEG;
    var jpegOptions = new JPEGSaveOptions();
    jpegOptions.quality = 12;
    jpegOptions.embedColorProfile = true;
    jpegOptions.matte = MatteType.NONE;
    jpegOptions.scans = 3;
    // Pobranie nazwy aktualnie zaznaczonej warstwy lub grupy;
    var activeLayer = app.activeDocument.activeLayer;
    var layerName = activeLayer.name;
    // Zapisanie obrazu JPEG z nazwą aktualnie zaznaczonej warstwy lub grupy w tym samym folderze, gdzie jest plik Photoshop;
    thedoc.saveAs((new File(docPath + "/" + layerName + ".jpg")), jpegOptions, true);
};




// Przywrócenie dokumentu do stanu początkowego
app.activeDocument.activeHistoryState = savedState




I tried to adjust the data, enter "rigidly" in the definition but it did not work because the data changes.

I also tried to use:

// Przechwycenie danych zmiennych
var actnName = ref.getName(charIDToTypeID("Actn"));
var aSetName = ref.getName(charIDToTypeID("ASet"));

// Ustawienie nowej nazwy warstwy na podstawie danych zmiennych
var nowaNazwa = aSetName + "_" + actnName;

// Ustawienie nowej nazwy warstwy
var idT = charIDToTypeID("T   ");
var desc777 = new ActionDescriptor();
var idNm = charIDToTypeID("Nm  ");
desc777.putString(idNm, nowaNazwa);
desc.putObject(idT, idLyr, desc777);

Which in a way works, because it sets the layer name to the name contained in Actn, but skips ASet. The result should be ASet + Actn. I get Actn + Actn....

Upvotes: 0

Views: 97

Answers (1)

Ghoul Fool
Ghoul Fool

Reputation: 6967

This make take a bit of back and forth as I don't know what the actions do or how your data data is stored and formatted.

Let's look at the last bit of code: You can change the name of the current selected layer to the current action set

// get current action
var r = new ActionReference();
r.putEnumerated(stringIDToTypeID("action"), stringIDToTypeID("ordinal"), stringIDToTypeID("targetEnum"));
try 
{
    var ret = executeActionGet(r);
    var aSetName = ret.getString(stringIDToTypeID("parentName"));
    var actnName = ret.getString(stringIDToTypeID("name"));
}

catch(eeek)
{ 
    //alert("No action selected"); 
}

// Ustawienie nowej nazwy warstwy na podstawie danych zmiennych
// Set a new layer name based on variable data

var nowaNazwa = aSetName + "_" + actnName;

// Ustawienie nowej nazwy warstwy
// Set a new layer name

var idsetd = charIDToTypeID( "setd" );
var desc44 = new ActionDescriptor();
var idnull = charIDToTypeID( "null" );
var ref27 = new ActionReference();
var idLyr = charIDToTypeID( "Lyr " );
var idOrdn = charIDToTypeID( "Ordn" );
var idTrgt = charIDToTypeID( "Trgt" );
ref27.putEnumerated( idLyr, idOrdn, idTrgt );
desc44.putReference( idnull, ref27 );
var idT = charIDToTypeID( "T   " );
var desc777 = new ActionDescriptor();
var idNm = charIDToTypeID( "Nm  " );
desc777.putString( idNm, nowaNazwa ); // nowaNazwa
var idLyr = charIDToTypeID( "Lyr " );
desc44.putObject( idT, idLyr, desc777 );
executeAction( idsetd, desc44, DialogModes.NO );

If you look closely at the renaming part it was missing a few lines.

To rename a layer it's easier to understand in javasScript:

displayDialogs = DialogModes.ERROR;

// call the source document
var srcDoc = app.activeDocument;
// new name for the layer
var nuName = "Orange";
// is the current slected layer called "Green"
if (srcDoc.activeLayer.name == "Green")
{
   // yes it is, so let's rename it to our new name
   srcDoc.activeLayer.name = nuName;
}

Upvotes: 0

Related Questions