Запуск скрипта строго после полного завершения предыдущего.
Доброго времени суток, дамы и господа!
Столкнулся с проблемой. 3 дня собственных тыканьей почти вслепую, ничего не дали... Есть панель расширения для Photoshop. До недавних пор работала без нареканий, как часы на разных версиях Photoshop. Но вот с выходом последней версии Photoshop 2018 часть функций стала работать совсем не так, как задумывалось. Есть колонка чекбоксов. На каждый из которых повешен свой отдельный скрипт. Инициирующий определенную последовательность действий в Photoshop. И есть кнопка "Старт", которая и запускает все отмеченные скрипты. Точнее, должна запускать последовательно. <div><input type="checkbox" id="shest1"><button class="desin_a" id="mini_set_a">Минимальный набор коррекции</button></div> <div><input type="checkbox" id="shest2"><button class="desin_a" id="dar_bl_a">Затемнение синевы неба</button></div> <div><input type="checkbox" id="shest3"><button class="desin_a" id="con_mid_a">Контраст средних тонов</button></div> <div><input type="checkbox" id="shest4"><button class="desin_a" id="des_r_a">Снижение насыщенного красного</button></div> <div><input type="checkbox" id="shest5"><button class="desin_a" id="clar_a">Четкость</button></div> <div><input type="checkbox" id="shest6"><button class="desin_a" id="abw_a">Авто баланс</button></div> <div><input type="checkbox" id="shest7"><button class="desin_a" id="loc_col_a">Локальный цветовой контраст</button></div> ........ и так далее ........ <a href="#" class="button20" id="start_a">Старт</a> И такая вот функция, выполняющая все это: var ctd1 = document.querySelector('#shest1'); var ctd2 = document.querySelector('#shest2'); var ctd3 = document.querySelector('#shest3'); var ctd4 = document.querySelector('#shest4'); var ctd5 = document.querySelector('#shest5'); var ctd6 = document.querySelector('#shest6'); var ctd7 = document.querySelector('#shest7'); $("#start_a").click(function(a) { csInterface.evalScript('$._ext.evalFile("' + extensionRoot + 'b_cor_a/Start.jsx")'); if (ctd1.checked) { csInterface.evalScript('$._ext.evalFile("' + extensionRoot + 'b_cor_a/Minimum_Settings_A.jsx")'); } else {}; if (ctd2.checked) { csInterface.evalScript('$._ext.evalFile("' + extensionRoot + 'add_cor_a/Skitalets_Darken_Blue_Sky_v1_1_A.jsx")'); } else {}; if (ctd3.checked) { csInterface.evalScript('$._ext.evalFile("' + extensionRoot + 'b_cor_a/Contrast_Midtones_A.jsx")'); } else {}; if (ctd4.checked) { csInterface.evalScript('$._ext.evalFile("' + extensionRoot + 'b_cor_a/Decrease_Red_A.jsx")'); } else {}; if (ctd5.checked) { csInterface.evalScript('$._ext.evalFile("' + extensionRoot + 'b_cor_a/Clarity_A.jsx")'); } else {}; if (ctd6.checked) { csInterface.evalScript('$._ext.evalFile("' + extensionRoot + 'b_cor_a/Auto_Balance_New_A.jsx")'); } else {}; if (ctd7.checked) { csInterface.evalScript('$._ext.evalFile("' + extensionRoot + 'b_cor_a/Local_Color_Contrast_A.jsx")'); } else {}; csInterface.evalScript('$._ext.evalFile("' + extensionRoot + 'b_cor_a/Finish.jsx")'); }); До сих пор все прекрасно работало. Каждый последующий скрипт запускался строго после выполнения всех действий в Photoshop предыдущим скриптом. В последней же версии Photoshop эта конструкция перестала работать. Такое впечатление, что скрипты сами по себе, а действия в Photoshop сами по себе. Если поставить задержку после каждого скрипта sleep, то подобрав время можно заставить работать все это. Но чуть где что затормозило, все идет наперекосяк. Photoshop что-то делает, но кусками из разных скриптов. Нет строгой очереди выполнения. Понимаю, что вопрос специфичный, но, может быть, кто-то подскажет, что тут можно сделать? Вот пример, если это что-то даст, одного из вызываемых скриптов: // // Finish.jsx // // // Generated Tue Dec 05 2017 21:30:56 GMT+0300 // cTID = function(s) { return app.charIDToTypeID(s); }; sTID = function(s) { return app.stringIDToTypeID(s); }; // //==================== Finish ============== // function Finish() { // Âûäåëåíèå function step1(enabled, withDialog) { if (enabled != undefined && !enabled) return; var dialogMode = (withDialog ? DialogModes.ALL : DialogModes.NO); var desc1 = new ActionDescriptor(); var ref1 = new ActionReference(); ref1.putOffset(cTID('Dcmn'), 1); desc1.putReference(cTID('null'), ref1); desc1.putInteger(cTID('DocI'), 1298); executeAction(sTID('select'), desc1, dialogMode); }; // Çàêðûòü function step2(enabled, withDialog) { if (enabled != undefined && !enabled) return; var dialogMode = (withDialog ? DialogModes.ALL : DialogModes.NO); var desc1 = new ActionDescriptor(); desc1.putEnumerated(cTID('Svng'), cTID('YsN '), cTID('N ')); desc1.putInteger(cTID('DocI'), 1298); desc1.putBoolean(sTID("forceNotify"), true); executeAction(sTID('close'), desc1, dialogMode); }; // Óäàëèòü function step3(enabled, withDialog) { if (enabled != undefined && !enabled) return; var dialogMode = (withDialog ? DialogModes.ALL : DialogModes.NO); var desc1 = new ActionDescriptor(); var ref1 = new ActionReference(); ref1.putName(cTID('Chnl'), "Greyscale"); desc1.putReference(cTID('null'), ref1); executeAction(sTID('delete'), desc1, dialogMode); }; // Óäàëèòü function step4(enabled, withDialog) { if (enabled != undefined && !enabled) return; var dialogMode = (withDialog ? DialogModes.ALL : DialogModes.NO); var desc1 = new ActionDescriptor(); var ref1 = new ActionReference(); ref1.putName(cTID('Lyr '), "Original"); desc1.putReference(cTID('null'), ref1); var list1 = new ActionList(); list1.putInteger(47); desc1.putList(cTID('LyrI'), list1); executeAction(sTID('delete'), desc1, dialogMode); }; // Çàäàòü function step5(enabled, withDialog) { if (enabled != undefined && !enabled) return; var dialogMode = (withDialog ? DialogModes.ALL : DialogModes.NO); var desc1 = new ActionDescriptor(); var ref1 = new ActionReference(); ref1.putProperty(cTID('Prpr'), cTID('CchP')); ref1.putEnumerated(cTID('capp'), cTID('Ordn'), cTID('Trgt')); desc1.putReference(cTID('null'), ref1); var desc2 = new ActionDescriptor(); desc2.putInteger(cTID('HsSt'), 50); desc1.putObject(cTID('T '), cTID('CchP'), desc2); executeAction(sTID('set'), desc1, dialogMode); }; step1(); // Âûäåëåíèå step2(); // Çàêðûòü step3(); // Óäàëèòü step4(); // Óäàëèòü step5(); // Çàäàòü }; //========================================= // Finish.main //========================================= // Finish.main = function () { Finish(); }; Finish.main(); // EOF "Finish.jsx" // EOF |
Synchronous vs. Asynchronous:
https://www.davidebarranca.com/2014/...us-evalscript/ |
Цитата:
Но это очень странно. Я знаю блог Барранки. Больше того, даже эту статью видел. Но не стал поначалу читать. Потому что она 2014 года. То есть, тогда, когда панели с флэша переехали на html. Тогда, это было проблемой, наверное. Но, как я понял, потом адобы что-то поменяли и вроде все работало. Яркое подтверждение тому, в 2015 и 2017 ФШ у меня же этот код работал безукоризненно. А вот в 2018 облом вышел. Странно все это... Еще раз, большое спасибо! :thanks: Пока 5 скриптов так обернул, нормально заработало. Пойду остальные упаковывать. |
Мда... заработать то заработало. Теперь следующий скрипт включается строго по окончании предыдущего. Но теперь другая проблема.
Если у меня все чекбокса отмечены, все летит на ура. Проблема, если не все отмечены. Поначалу, на радостях, я записал вот так: var ctd1 = document.querySelector('#shest1'); var ctd2 = document.querySelector('#shest2'); var ctd3 = document.querySelector('#shest3'); $("#start_a").click(function(a) { csInterface.evalScript('$._ext.evalFile("' + extensionRoot + 'b_cor_a/Start.jsx")', function() { if (ctd1.checked) { csInterface.evalScript('$._ext.evalFile("' + extensionRoot + 'b_cor_a/Minimum_Settings_A.jsx")', function() { if (ctd2.checked) { csInterface.evalScript('$._ext.evalFile("' + extensionRoot + 'add_cor_a/Skitalets_Darken_Blue_Sky_v1_1_A.jsx")', function() { if (ctd3.checked) { csInterface.evalScript('$._ext.evalFile("' + extensionRoot + 'b_cor_a/Contrast_Midtones_A.jsx")') } }) } }) } }); }); После НЕ отмеченного чекбокса скрипт останавливается. Ну, так и должно быть, собственно. Если проставить везде else можно заставить его работать, как нужно. Но у меня не 3, а под 30 чекбоксов. Это же безумное ветвление получится на все варианты. Голова кругом идет. Понимаю, что проблема решаема скорее всего, но ввиду моей непроходимой нубости в скриптинге, мне не по зубам. Подскажите, плиииз, как можно избежать такого ветвления? |
Наверное как-то так:
var ctd[1] = document.querySelector('#shest1'); var ctd[2] = document.querySelector('#shest2'); var ctd[3] = document.querySelector('#shest3'); function next(i) { if( i > 3 ) return; if( ctd[i].checked ) { switch(i) { case 1: csInterface.evalScript('$._ext.evalFile("' + extensionRoot + 'b_cor_a/Minimum_Settings_A.jsx")', function() { next(i+1); }); break; case 2: csInterface.evalScript('$._ext.evalFile("' + extensionRoot + 'add_cor_a/Skitalets_Darken_Blue_Sky_v1_1_A.jsx")', function() { next(i+1); }); break; case 3: csInterface.evalScript('$._ext.evalFile("' + extensionRoot + 'b_cor_a/Contrast_Midtones_A.jsx")', function() { next(i+1); }); break; } } else { next(i+1); } } csInterface.evalScript('$._ext.evalFile("' + extensionRoot + 'b_cor_a/Start.jsx")', function() { next(1); }); |
Цитата:
Правда, с перепугу я ночью сам вот такое изобразил и заработало: var ctd1 = document.querySelector('#shest1'); var ctd2 = document.querySelector('#shest2'); var ctd3 = document.querySelector('#shest3'); var jsaktion; $("#start_a").click(function(a) { if (ctd1.checked) {jsaktion = '$._ext.evalFile("' + extensionRoot + 'b_cor_a/Minimum_Settings_A.jsx")'} else {jsaktion = 'null'} csInterface.evalScript(jsaktion, function() { if (ctd2.checked) {jsaktion = '$._ext.evalFile("' + extensionRoot + 'add_cor_a/Skitalets_Darken_Blue_Sky_v1_1_A.jsx")'} else {jsaktion = 'null'} csInterface.evalScript(jsaktion, function() { if (ctd3.checked) {jsaktion = '$._ext.evalFile("' + extensionRoot + 'b_cor_a/Contrast_Midtones_A.jsx")'} else {jsaktion = 'null'} csInterface.evalScript(jsaktion) }) }) }); Но Ваш вариант красивее. Спасибо :thanks: |
Часовой пояс GMT +3, время: 01:16. |