Reputation: 1
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
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