Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 23.12.2017, 11:54
Интересующийся
Отправить личное сообщение для vospa Посмотреть профиль Найти все сообщения от vospa
 
Регистрация: 09.12.2017
Сообщений: 16

Запуск скрипта строго после полного завершения предыдущего.
Доброго времени суток, дамы и господа!
Столкнулся с проблемой. 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

Последний раз редактировалось vospa, 23.12.2017 в 12:02.
Ответить с цитированием
  #2 (permalink)  
Старый 23.12.2017, 17:26
Аватар для Белый шум
Профессор
Отправить личное сообщение для Белый шум Посмотреть профиль Найти все сообщения от Белый шум
 
Регистрация: 19.01.2012
Сообщений: 505

Synchronous vs. Asynchronous:
https://www.davidebarranca.com/2014/...us-evalscript/
Ответить с цитированием
  #3 (permalink)  
Старый 23.12.2017, 21:21
Интересующийся
Отправить личное сообщение для vospa Посмотреть профиль Найти все сообщения от vospa
 
Регистрация: 09.12.2017
Сообщений: 16

Сообщение от Белый шум Посмотреть сообщение
Synchronous vs. Asynchronous:
https://www.davidebarranca.com/2014/...us-evalscript/
Спасибо. Кажется, заработало.
Но это очень странно. Я знаю блог Барранки. Больше того, даже эту статью видел. Но не стал поначалу читать. Потому что она 2014 года. То есть, тогда, когда панели с флэша переехали на html. Тогда, это было проблемой, наверное. Но, как я понял, потом адобы что-то поменяли и вроде все работало. Яркое подтверждение тому, в 2015 и 2017 ФШ у меня же этот код работал безукоризненно. А вот в 2018 облом вышел. Странно все это...
Еще раз, большое спасибо! Пока 5 скриптов так обернул, нормально заработало. Пойду остальные упаковывать.
Ответить с цитированием
  #4 (permalink)  
Старый 23.12.2017, 22:29
Интересующийся
Отправить личное сообщение для vospa Посмотреть профиль Найти все сообщения от vospa
 
Регистрация: 09.12.2017
Сообщений: 16

Мда... заработать то заработало. Теперь следующий скрипт включается строго по окончании предыдущего. Но теперь другая проблема.
Если у меня все чекбокса отмечены, все летит на ура. Проблема, если не все отмечены.
Поначалу, на радостях, я записал вот так:

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 чекбоксов. Это же безумное ветвление получится на все варианты.
Голова кругом идет. Понимаю, что проблема решаема скорее всего, но ввиду моей непроходимой нубости в скриптинге, мне не по зубам. Подскажите, плиииз, как можно избежать такого ветвления?
Ответить с цитированием
  #5 (permalink)  
Старый 24.12.2017, 02:31
Аватар для Белый шум
Профессор
Отправить личное сообщение для Белый шум Посмотреть профиль Найти все сообщения от Белый шум
 
Регистрация: 19.01.2012
Сообщений: 505

Наверное как-то так:
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); });

Последний раз редактировалось Белый шум, 24.12.2017 в 02:34.
Ответить с цитированием
  #6 (permalink)  
Старый 24.12.2017, 12:21
Интересующийся
Отправить личное сообщение для vospa Посмотреть профиль Найти все сообщения от vospa
 
Регистрация: 09.12.2017
Сообщений: 16

Сообщение от Белый шум Посмотреть сообщение
Наверное как-то так:
Спасибо!
Правда, с перепугу я ночью сам вот такое изобразил и заработало:


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)
            })
        })
});


Но Ваш вариант красивее. Спасибо
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запуск функции после ресайзинга странички dummer232 jQuery 2 30.09.2010 16:23
Как обнулить переменные после завершения скрипта QRS jQuery 3 07.07.2010 03:08
Запуск скрипта после загрузки страницы vital8 Элементы интерфейса 2 24.09.2009 18:06
Как запустить скрипт после отработки другого скрипта? roman2 Общие вопросы Javascript 2 10.08.2009 01:23
добавить к после отработки скрипта показ модалпопапа roman2 Работа 0 09.08.2009 22:48