скрипт 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); } |
raaaatata,
что на входе, что на выходе? |
не знаю как тут изображение вставить), ссылкой только вставляется
https://community.adobe.com/t5/image...rue?v=v2&px=-1 |
raaaatata,
а объектом или массивом, никак? var layers - это что? если смотреть на картинку, достаточно одного цикла reduce, зачем нужны сортировки непонятно. |
я же уточнил, что не знаю js), пришел за советом, пытаю chatGPT, но без человеческого совета тут никак))
|
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> |
Вложений: 1
ваш скрипт не работает
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) }; |
Цитата:
Цитата:
на данный момент добавить нечего, всё что мог выше. |
ок, а можешь помочь исправить в скрипте выполнение не всего документа, а только выделенных слоев?
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) }; |
raaaatata,
я не знаю методов и устройства chatgpt, помочь не могу. |
Часовой пояс GMT +3, время: 01:29. |