06.04.2023, 17:55
|
Новичок на форуме
|
|
Регистрация: 06.04.2023
Сообщений: 6
|
|
скрипт ps, поиск совпадающих имен с объединением их в группу
Привет, я пытаюсь написать скрипт для поиска и объединения слоев и групп по сопоставлению порядковых номеров, затем объединяю группы и задаю имя группы.
игрался с chatgpt, но так как в javascript я мало разбираюсь, ничего не работает =((
данный:
слои и группы с именами:
"step_n_n"
"mask_n_n"
"back_n_n"
п = порядковый номер
задача:
сгруппировать слои и группы с одинаковыми порядковыми номерами и назвать группы "[slot] step-n-n"
вот какой код получился... но чую что то в нем не так))
// Создаем функцию для сравнения порядковых номеров
function compareNumbers(a, b) {
// Извлекаем порядковые номера из имен слоев
var aNum = parseInt(a.name.match(/_(\d+)_(\d+)/)[2]);
var bNum = parseInt(b.name.match(/_(\d+)_(\d+)/)[2]);
// Сравниваем номера и возвращаем результат
return aNum - bNum;
}
// Создаем массив из всех слоев в документе
var doc = app.activeDocument;
var layers = doc.layers;
// Фильтруем слои по заданным шаблонам и создаем новые массивы
var steplayers = layers.filter(function(layer) {
});
var steplayers = layers.filter(function(layer) {
return layer.name.match(/^step_\d+_\d+$/);
});
var masklayers = layers.filter(function(layer) {
return layer.name.match(/^mask_\d+_\d+$/);
});
var backlayers = layers.filter(function(layer) {
return layer.name.match(/^back_\d+_\d+$/);
});
// Сортируем массивы по порядковым номерам
steplayers.sort(compareNumbers);
masklayers.sort(compareNumbers);
backlayers.sort(compareNumbers);
// Создаем группы для слоев
var stepGroup = doc.layerSets.add();
stepGroup.name = "[slot] step-" + stepLayers[0].name.match(/-(\d+)-(\d+)/)[1];
// Перемещаем слои в соответствующие группы
for (var i = 0; i < steplayers.length; i++) {
steplayers[i].move(stepGroup, ElementPlacement.PLACEATEND);
}
for (var i = 0; i < masklayers.length; i++) {
masklayers[i].move(stepGroup, ElementPlacement.PLACEATEND);
}
for (var i = 0; i < backlayers.length; i++) {
backlayers[i].move(stepGroup, ElementPlacement.PLACEATEND);
}
|
|
06.04.2023, 18:18
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,105
|
|
raaaatata,
что на входе, что на выходе?
|
|
06.04.2023, 20:25
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,105
|
|
raaaatata,
а объектом или массивом, никак? var layers - это что?
если смотреть на картинку, достаточно одного цикла reduce, зачем нужны сортировки непонятно.
|
|
06.04.2023, 22:18
|
Новичок на форуме
|
|
Регистрация: 06.04.2023
Сообщений: 6
|
|
я же уточнил, что не знаю js), пришел за советом, пытаю chatGPT, но без человеческого совета тут никак))
|
|
07.04.2023, 01:20
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,105
|
|
raaaatata,
испорченный телефон получается, данные только у вас, и что это известно только вам.
условно всё будет типа такого
<pre>
<script>
let layers = [{
name: '[merge]step_0_0'
}, {
name: '[merge]mask_0_0'
}, {
name: '[merge]back_0_0'
}, {
name: 'step_1_0'
}, {
name: 'mask_1_0'
}, {
name: 'back_4_0'
}]
let obj = layers.reduce((obj, el) => {
let name = el.name;
let [a, b] = name.split(/(?<!\d)_/);
let key = `[slot]step-${b}`;
if (key in obj) obj[key].push(el);
else obj[key] = [el];
return obj
}, {});
document.write(JSON.stringify(obj,null,1))
</script>
</pre>
|
|
07.04.2023, 08:26
|
Новичок на форуме
|
|
Регистрация: 06.04.2023
Сообщений: 6
|
|
ваш скрипт не работает
error 60
Line 16
вот что получилось у меня, но сейчас скрипт работает не до конца правильно, подкрепил скрин
// select layers the name of which ends in "_xx_xx";
if (app.documents.length > 0) {
// search layers with regexp;
var theLayers = collectLayersByNames([/(mask|back|step)_\d{1,2}_\d{1,2}$/], 2);
// process layers;
if (theLayers.length > 0) {
for (var d = 0; d < theLayers.length; d++) {
selectLayerByID(theLayers[d][0][2], false);
for (var e = 1; e < theLayers[d].length; e++) {
selectLayerByID(theLayers[d][e][2], true)
};
// group the active layer;
groupSelectedLayers("[slot] step" + String(theLayers[d][0][0].match(/_\d{1,2}_\d{1,2}$/)).replace(/_/g, "-"));
};
} else {alert ("no such layer")}
};
////////////////////////////////////
////// collect layers and/or groups with certain name, 0 layers, 1 groups, 2 both //////
function collectLayersByNames (theNames, layersOrGroups) {
// get number of layers;
var ref = new ActionReference();
ref.putProperty(stringIDToTypeID('property'), stringIDToTypeID('numberOfLayers'));
ref.putEnumerated( charIDToTypeID("Dcmn"), charIDToTypeID("Ordn"), charIDToTypeID("Trgt") );
var applicationDesc = executeActionGet(ref);
var theNumber = applicationDesc.getInteger(stringIDToTypeID("numberOfLayers"));
// process the layers;
var theLayers = new Array;
for (var m = 0; m <= theNumber; m++) {
try {
var ref = new ActionReference();
ref.putIndex( charIDToTypeID( "Lyr " ), m);
var layerDesc = executeActionGet(ref);
var layerSet = typeIDToStringID(layerDesc.getEnumerationValue(stringIDToTypeID("layerSection")));
var isBackground = layerDesc.getBoolean(stringIDToTypeID("background"));
// if group collect values;
var theCheck = false;
switch (Number(layersOrGroups)) {
case 0:
if (layerSet != "layerSectionEnd" && layerSet != "layerSectionStart") {theCheck = true}
break;
case 1:
if (layerSet == "layerSectionStart") {theCheck = true}
break;
default:
if (layerSet != "layerSectionEnd") {theCheck = true}
break;
};
if (theCheck == true && isBackground != true) {
var theName = layerDesc.getString(stringIDToTypeID('name'));
var theID = layerDesc.getInteger(stringIDToTypeID('layerID'));
var theIndex = layerDesc.getInteger(stringIDToTypeID('itemIndex'));
// check name;
for (var x = 0; x < theNames.length; x++) {
var theNumbers = theName.match(theNames[x]);
if (theNumbers != null) {
var theCheck = false;
for (var y = 0; y < theLayers.length; y++) {
if (theNumbers == String(theLayers[y][0][0].match(theNames[x]))) {
theLayers[y].push([theName, theIndex, theID]);
theCheck = true;
};
};
if (theCheck == false) {
theLayers.push([[theName, theIndex, theID]])
}
}
}
};
}
catch (e) {};
};
return theLayers
};
////// based on code by mike hale and paul riggott //////
function selectLayerByID(theID,add){
add = undefined ? add = false:add
var ref = new ActionReference();
ref.putIdentifier(charIDToTypeID("Lyr "), theID);
var desc = new ActionDescriptor();
desc.putReference(charIDToTypeID("null"), ref );
if(add) desc.putEnumerated( stringIDToTypeID( "selectionModifier" ), stringIDToTypeID( "selectionModifierType" ), stringIDToTypeID( "addToSelection" ) );
desc.putBoolean( charIDToTypeID( "MkVs" ), false );
try{
executeAction(charIDToTypeID("slct"), desc, DialogModes.NO );
}catch(e){
alert(e.message);
}
};
////// group //////
function groupSelectedLayers (theName) {
var desc159 = new ActionDescriptor();
var ref114 = new ActionReference();
var idlayer = stringIDToTypeID( "layer" );
var idordinal = stringIDToTypeID( "ordinal" );
var idtargetEnum = stringIDToTypeID( "targetEnum" );
var idnull = stringIDToTypeID( "null" );
var idname = stringIDToTypeID( "name" );
ref114.putEnumerated(idlayer, idordinal, idtargetEnum);
desc159.putReference(idnull, ref114 );
desc159.putString(idname, "aaa" );
executeAction( stringIDToTypeID( "groupLayersEvent" ), desc159, DialogModes.NO );
var desc63 = new ActionDescriptor();
var ref37 = new ActionReference();
ref37.putEnumerated( idlayer, idordinal, idtargetEnum );
desc63.putReference( idnull, ref37 );
var desc64 = new ActionDescriptor();
desc64.putString(idname, theName);
desc63.putObject(stringIDToTypeID( "to" ), idlayer, desc64);
executeAction(stringIDToTypeID( "set" ), desc63, DialogModes.NO)
};
|
|
07.04.2023, 08:38
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,105
|
|
Сообщение от raaaatata
|
ваш скрипт не работает
|
Сообщение от рони
|
испорченный телефон получается, данные только у вас, и что это известно только вам.
условно всё будет типа такого
|
условно!!!
на данный момент добавить нечего, всё что мог выше.
|
|
07.04.2023, 12:19
|
Новичок на форуме
|
|
Регистрация: 06.04.2023
Сообщений: 6
|
|
ок, а можешь помочь исправить в скрипте выполнение не всего документа, а только выделенных слоев?
if (app.documents.length > 0) {
// search layers with regexp;
var theLayers = collectLayersByNames([/_\d{1,2}_\d{1,2}$/], 2);
// process layers;
if (theLayers.length > 0) {
for (var d = 0; d < theLayers.length; d++) {
selectLayerByID(theLayers[d][0][2], false);
for (var e = 1; e < theLayers[d].length; e++) {
selectLayerByID(theLayers[d][e][2], true)
};
// group the active layer;
groupSelectedLayers("[slot] step" + String(theLayers[d][0][0].match(/_\d{1,2}_\d{1,2}$/)).replace(/_/g, "-"));
};
} else {alert ("no such layer")}
};
////////////////////////////////////
////// collect layers and/or groups with certain name, 0 layers, 1 groups, 2 both //////
function collectLayersByNames (theNames, layersOrGroups) {
// get number of layers;
var ref = new ActionReference();
ref.putProperty(stringIDToTypeID('property'), stringIDToTypeID('numberOfLayers'));
ref.putEnumerated( charIDToTypeID("Dcmn"), charIDToTypeID("Ordn"), charIDToTypeID("Trgt") );
var applicationDesc = executeActionGet(ref);
var theNumber = applicationDesc.getInteger(stringIDToTypeID("numberOfLayers"));
// process the layers;
var theLayers = new Array;
for (var m = 0; m <= theNumber; m++) {
try {
var ref = new ActionReference();
ref.putIndex( charIDToTypeID( "Lyr " ), m);
var layerDesc = executeActionGet(ref);
var layerSet = typeIDToStringID(layerDesc.getEnumerationValue(stringIDToTypeID("layerSection")));
var isBackground = layerDesc.getBoolean(stringIDToTypeID("background"));
// if group collect values;
var theCheck = false;
switch (Number(layersOrGroups)) {
case 0:
if (layerSet != "layerSectionEnd" && layerSet != "layerSectionStart") {theCheck = true}
break;
case 1:
if (layerSet == "layerSectionStart") {theCheck = true}
break;
default:
if (layerSet != "layerSectionEnd") {theCheck = true}
break;
};
if (theCheck == true && isBackground != true) {
var theName = layerDesc.getString(stringIDToTypeID('name'));
var theID = layerDesc.getInteger(stringIDToTypeID('layerID'));
var theIndex = layerDesc.getInteger(stringIDToTypeID('itemIndex'));
// check name;
for (var x = 0; x < theNames.length; x++) {
var theNumbers = theName.match(theNames[x]);
if (theNumbers != null) {
var theCheck = false;
for (var y = 0; y < theLayers.length; y++) {
if (theNumbers == String(theLayers[y][0][0].match(theNames[x]))) {
theLayers[y].push([theName, theIndex, theID]);
theCheck = true;
};
};
if (theCheck == false) {
theLayers.push([[theName, theIndex, theID]])
}
}
}
};
}
catch (e) {};
};
return theLayers
};
////// based on code by mike hale and paul riggott //////
function selectLayerByID(theID,add){
add = undefined ? add = false:add
var ref = new ActionReference();
ref.putIdentifier(charIDToTypeID("Lyr "), theID);
var desc = new ActionDescriptor();
desc.putReference(charIDToTypeID("null"), ref );
if(add) desc.putEnumerated( stringIDToTypeID( "selectionModifier" ), stringIDToTypeID( "selectionModifierType" ), stringIDToTypeID( "addToSelection" ) );
desc.putBoolean( charIDToTypeID( "MkVs" ), false );
try{
executeAction(charIDToTypeID("slct"), desc, DialogModes.NO );
}catch(e){
alert(e.message);
}
};
////// group //////
function groupSelectedLayers (theName) {
var desc159 = new ActionDescriptor();
var ref114 = new ActionReference();
var idlayer = stringIDToTypeID( "layer" );
var idordinal = stringIDToTypeID( "ordinal" );
var idtargetEnum = stringIDToTypeID( "targetEnum" );
var idnull = stringIDToTypeID( "null" );
var idname = stringIDToTypeID( "name" );
ref114.putEnumerated(idlayer, idordinal, idtargetEnum);
desc159.putReference(idnull, ref114 );
desc159.putString(idname, "aaa" );
executeAction( stringIDToTypeID( "groupLayersEvent" ), desc159, DialogModes.NO );
var desc63 = new ActionDescriptor();
var ref37 = new ActionReference();
ref37.putEnumerated( idlayer, idordinal, idtargetEnum );
desc63.putReference( idnull, ref37 );
var desc64 = new ActionDescriptor();
desc64.putString(idname, theName);
desc63.putObject(stringIDToTypeID( "to" ), idlayer, desc64);
executeAction(stringIDToTypeID( "set" ), desc63, DialogModes.NO)
};
|
|
07.04.2023, 14:49
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,105
|
|
raaaatata,
я не знаю методов и устройства chatgpt, помочь не могу.
|
|
|
|