Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 06.04.2023, 17:55
Новичок на форуме
Отправить личное сообщение для raaaatata Посмотреть профиль Найти все сообщения от raaaatata
 
Регистрация: 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);
}
Ответить с цитированием
  #2 (permalink)  
Старый 06.04.2023, 18:18
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,105

raaaatata,
что на входе, что на выходе?
Ответить с цитированием
  #3 (permalink)  
Старый 06.04.2023, 19:45
Новичок на форуме
Отправить личное сообщение для raaaatata Посмотреть профиль Найти все сообщения от raaaatata
 
Регистрация: 06.04.2023
Сообщений: 6

не знаю как тут изображение вставить), ссылкой только вставляется
https://community.adobe.com/t5/image...rue?v=v2&px=-1

Последний раз редактировалось raaaatata, 06.04.2023 в 19:48.
Ответить с цитированием
  #4 (permalink)  
Старый 06.04.2023, 20:25
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,105

raaaatata,
а объектом или массивом, никак? var layers - это что?
если смотреть на картинку, достаточно одного цикла reduce, зачем нужны сортировки непонятно.
Ответить с цитированием
  #5 (permalink)  
Старый 06.04.2023, 22:18
Новичок на форуме
Отправить личное сообщение для raaaatata Посмотреть профиль Найти все сообщения от raaaatata
 
Регистрация: 06.04.2023
Сообщений: 6

я же уточнил, что не знаю js), пришел за советом, пытаю chatGPT, но без человеческого совета тут никак))
Ответить с цитированием
  #6 (permalink)  
Старый 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>
Ответить с цитированием
  #7 (permalink)  
Старый 07.04.2023, 08:26
Новичок на форуме
Отправить личное сообщение для raaaatata Посмотреть профиль Найти все сообщения от raaaatata
 
Регистрация: 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)
};
Изображения:
Тип файла: jpg 2023-04-07_00-04-42.jpg (12.3 Кб, 1 просмотров)
Ответить с цитированием
  #8 (permalink)  
Старый 07.04.2023, 08:38
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,105

Сообщение от raaaatata
ваш скрипт не работает
Сообщение от рони
испорченный телефон получается, данные только у вас, и что это известно только вам.
условно всё будет типа такого
условно!!!

на данный момент добавить нечего, всё что мог выше.
Ответить с цитированием
  #9 (permalink)  
Старый 07.04.2023, 12:19
Новичок на форуме
Отправить личное сообщение для raaaatata Посмотреть профиль Найти все сообщения от raaaatata
 
Регистрация: 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)
};
Ответить с цитированием
  #10 (permalink)  
Старый 07.04.2023, 14:49
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,105

raaaatata,
я не знаю методов и устройства chatgpt, помочь не могу.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужен скрипт в адресную строку для записи в группу в контакте или подачи заявки jpokorp Работа 1 21.12.2015 22:44
PHP/AJAX скрипт "Нaселение мoегo гoрoдa oнлaйн" rustik-yes Работа 2 01.12.2014 22:53
Скрипт вывода имен файлов. ratratrat Общие вопросы Javascript 16 18.12.2012 20:55
Нужен Java скрипт: поиск повторяющихся чисел black8558cat Javascript под браузер 8 26.06.2012 11:47
Помогите найти скрипт поиск по странице beilec Общие вопросы Javascript 11 16.11.2010 15:58