[ID CS4-CS6] Как запустить скрипт из другого файла по кнопке

bossrus

шибка умный, аднака
Топикстартер
12 лет на форуме
Сообщения
447
Реакции
74
да. я сам в шоке с такой темы :)

итак, за годы работы у меня скопилось много скриптов. и пока все работали в офисе — всё было замечательно. каждому скрипту своя горячая кнопка, и нет проблем. но все разъехались на удалёнку, и с хоткеями начались траблы. никакие программы для удалёнки не передают их правильно и в полном объёме. а ещё на работе стоят маки, а дома у всех писюки...
в общем — есть задача сбацать скрипт, который делает графический интерфейс с кнопочками, к которым привязаны всякие разные другие скрипты.
причём переписывать сами скрипты низзя никак, бо не все на удалёнке, и у кого-то таки хоткеи продолжают облегчать работу.

перейдём к практической части задания:
в качестве "старого" скрипта, который я должен прикрутить к кнопкам я сделал такой простенький:

Код:
function gogogo(){
    var origKoord = app.activeDocument.zeroPoint;
    app.activeDocument.zeroPoint = [0, 0];
    alert('ok');
}

в качестве графического интерфейса сделал этот:
Код:
path_to_script = "/путь к скриптам/";
extension_of_script = ".jsx";

test();

function runScript(script_name, script_function){

    $.evalFile(path_to_script+script_name+extension_of_script);
    eval( script_function );
}

function test() {
    var myScriptPanel = new Window("dialog", "Выберите нужный скрипт");
        myScriptPanel.orientation = "column";
        myScriptPanel.alignChildren = "center";
       
            button_my = myScriptPanel.add("button",undefined,'go!');
            button_my.name = 999;

            button_my.onClick = function () {
                myScriptPanel.close();
                runScript('test', 'gogogo()');
            }
    myScriptPanel.show();
}

запускаю скрипт, жмякаю кнопочку.... и — ничего. совсем.

ок. добавляем вызов функции без .onClick:
Код:
...
extension_of_script = ".jsx";

runScript('test', 'gogogo()');

test();

...
}

теперь перед рисованием интерфейса всё работает, но после нажатия кнопки всё также фиг.

ок. меняем вызываемый скрипт:
Код:
function gogogo(){
    try {
        var origKoord = app.activeDocument.zeroPoint;
        app.activeDocument.zeroPoint = [0, 0];
    } catch (err) {
       alert(err)
    }
    alert('ok');
}
во! тут я получаю сообщение, что :
Screen Shot 2021-02-16 at 17.04.56.png


понимаю, что не успевает закрыться интерфейс, и делаю небольшую задержку после закрытия оного:

Код:
...
           button_my.onClick = function () {
                myScriptPanel.close();
                date = Date.now();
                do {
                    currentDate = Date.now();
                  } while (currentDate - date < 2000);
                runScript('test', 'gogogo()');
            }
    myScriptPanel.show();
...

и — то же самое сообщение про незакрытый модальный диалог.

как показали дальнейшие изыскания в данном случае не проходят и
Код:
app.activeDocument.textDefaults.appliedCharacterStyle = app.activeDocument.characterStyles.itemByName("[None]");
app.activeDocument.textDefaults.appliedParagraphStyle = app.activeDocument.paragraphStyles.itemByName("[No Paragraph Style]");
app.activeDocument.layoutWindows[0].transformReferencePoint = AnchorPoint.CENTER_ANCHOR;

и многое, многое другое.

не подскажете что можно придумать, чтобы и функции вызывались, и диалог не особо мешался?
 
Последнее редактирование модератором:

Oleg Butrin

20 лет на форуме
Сообщения
1 989
Реакции
1 213
Поделиться тебе моей старой панелью запуска скриптов?
 

Oleg Butrin

20 лет на форуме
Сообщения
1 989
Реакции
1 213
В смысле, можно расписать то, что запускать скрипты, меняющие документ, следует исключительно из немодального диалогового окна (например, palette), но будет ли тебе от этого счастье?
 
  • Спасибо
Реакции: bossrus

bossrus

шибка умный, аднака
Топикстартер
12 лет на форуме
Сообщения
447
Реакции
74

bossrus

шибка умный, аднака
Топикстартер
12 лет на форуме
Сообщения
447
Реакции
74
Тогда смотри в сторону app.doScript().
посмотрел, но пока непонятно.
даже простейшая конструкция
Код:
app.doScript('var origKoord = app.activeDocument.zeroPoint; app.activeDocument.zeroPoint = [0, 0]; alert(origKoord);', ScriptLanguage.JAVASCRIPT)
так таки не работает.
я уж не говорю о том, что
Код:
app.doScript('$.evalFile(path_to_script+script_name+extension_of_script); eval( script_function );', ScriptLanguage.JAVASCRIPT)
ничем не отличается от тех же строк без апп.ду :(
 

Eugenyus

12 лет на форуме
Сообщения
1 960
Реакции
3 589
Screenshot_3.jpg

где sFold может быть и сетевым путём.
 

bossrus

шибка умный, аднака
Топикстартер
12 лет на форуме
Сообщения
447
Реакции
74
Посмотреть вложение 140967
где sFold может быть и сетевым путём.
да. это я видел. но это приводит к запуску скрипта, если он не обёрнут в function.
а мне нужно загрузить скрипт, и в нём запустить процедуру.... идея.
ща попробую налету слабать скрипт с импортом и запуском процедуры, и уже этот "налётный" скрипт запустить...
 

bossrus

шибка умный, аднака
Топикстартер
12 лет на форуме
Сообщения
447
Реакции
74
Посмотреть вложение 140967
где sFold может быть и сетевым путём.
неа.
создал скрипт
Код:
$.evalFile("/Users/studio/Documents/scripts/test.jsx");
gogogo();
потом в онклике сделал
Код:
var tempTxt = app.activeScript.path + "/zzzz_temp.jsx";
var iniFile = File(tempTxt);
app.doScript(iniFile, ScriptLanguage.JAVASCRIPT);

и фиг. та же "модальная" ошибка :(
 

bossrus

шибка умный, аднака
Топикстартер
12 лет на форуме
Сообщения
447
Реакции
74
следует исключительно из немодального диалогового окна (например, palette)
осталось только сделать таки задержку на ожидание ввода. причём такую, чтобы она не вешала весь скрипт.
вот это:
Код:
while (!stop_script){
  $.sleep(200);
}
вешает весь скрипт, и кнопки не реагируют на нажатие :(
 

bossrus

шибка умный, аднака
Топикстартер
12 лет на форуме
Сообщения
447
Реакции
74
гы! я гений :)

решение — элементарное.

объявляем оооочень глобальную переменную
Код:
script_number

в онклике:
Код:
.onClick = function () {
                            myScriptPanel.close();
                            script_number = this.name;
                        }

после вызова диалога, и его закрытия, соответственно:
Код:
var tempTxt = app.activeScript.path + "/zzzz_temp.jsx";
var iniFile = File(tempTxt);
    iniFile.open("w");
    iniFile.writeln('$.evalFile("'+path_to_script+script_names[script_number]+extension_of_script+'");');
    iniFile.writeln(script_functions[script_number]+';');
    iniFile.close();
app.doScript(iniFile, ScriptLanguage.JAVASCRIPT);
iniFile.remove();

профит. никакой модальности, но очень много запусков совершенно выбранного скрипта :)
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 137
Реакции
10 835
Если уж зашла речь об извращенных решениях, то у меня, вроде как, работало из диалога без закрытия через File.execute
 

bossrus

шибка умный, аднака
Топикстартер
12 лет на форуме
Сообщения
447
Реакции
74
Если уж зашла речь об извращенных решениях, то у меня, вроде как, работало из диалога без закрытия через File.execute
маловероятно.
проблема не в тех скриптах, которые присоединяются.
проблема в том, что сам индизайн не даёт доступа к некоему набору свойств документа, если в это время в индизайне открыто модальное окно
 

Gad

Сообщения
2 970
Реакции
1 402
с хоткеями начались траблы. никакие программы для удалёнки не передают их правильно и в полном объёме. а ещё на работе стоят маки, а дома у всех писюки...
Не судите строго, может глупость сморожу :) Но нельзя скриптом ID вызвать внешний скрипт (если для Win vbs скажем) и уже в нем реализовать окно, кнопки с запуском и т.д.?

Не по теме:
Хотя я бы таки поискал в чем затык с горячими клавишами, почему и какие не правильно работают и попытался это исправить (если "в лоб", то перехват чем - то вроде AHK и отправка "правильного" скан-кода на мак)
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 137
Реакции
10 835
Только что проверил - работает (причем, по идее, во всех адобовских программах, кроме, разумеется, акробата)
Немодальное диалоговое окно panel висит на экране, на нем нажимается кнопка по нажатию которой вызывается ESTK с нужным скриптом, меняющим все что угодно в открытом документе, вплоть до создания нового
Но, повторяю, это извращенное решение, правильнее, наверное, через бридж или через экстеншн
 

bossrus

шибка умный, аднака
Топикстартер
12 лет на форуме
Сообщения
447
Реакции
74
Немодальное диалоговое окно panel висит на экране, на нем нажимается кнопка по нажатию которой вызывается ESTK
вооот. панель.
а как реализовано ожидание нажатия кнопки на немодальном окне?
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 137
Реакции
10 835
Ну естественно панель
запускать скрипты, меняющие документ, следует исключительно из немодального диалогового окна (например, palette),
а как реализовано ожидание нажатия кнопки на немодальном окне?
Так же как и на модальном
JavaScript:
z.startB.onClick = startB_onClick;
 

bossrus

шибка умный, аднака
Топикстартер
12 лет на форуме
Сообщения
447
Реакции
74
Ну естественно панель
дык вот. а у меня не панель, а диалог.

Так же как и на модальном
не. я про то, что запуск немодального окна — асинхронный. скрипт не ждёт нажатия сего бы то ни было, а продолжает работу. ну и, соответственно, заканчивается и панель сразу закрывается вместе с окончанием скрипта.
как реализовано "не окончание" скрипта без его полного повисания?
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 137
Реакции
10 835
дык вот. а у меня не панель, а диалог.
Брр не пойму вам нужен модальный или немодальный диалог? Вроде ж договорились, что из модального параллельная работа с документом не реализуема от слова "совсем", да и зачем вам такое, чтоб окно закрывалось сразу после отработки одного вызванного скрипта?
как реализовано "не окончание" скрипта без его полного повисания?
В случае palette - никак, нажал на соответствующую кнопку, нужный скрипт отработал, окно продолжает висеть. Для закрывания панельки кнопочку специальную надо программировать
 

bossrus

шибка умный, аднака
Топикстартер
12 лет на форуме
Сообщения
447
Реакции
74
Брр не пойму вам нужен модальный или немодальный диалог? Вроде ж договорились, что из модального параллельная работа с документом не реализуема от слова "совсем", да и зачем вам такое, чтоб окно закрывалось сразу после отработки одного вызванного скрипта?
нужно именно закрывание после каждого выполненного скрипта.
и таки я это реализовал. см. выше :)
в посте со скромной оценкой моих умственных способностей в начале — используется таки dialog

В случае palette - никак, нажал на соответствующую кнопку, нужный скрипт отработал, окно продолжает висеть. Для закрывания панельки кнопочку специальную надо программировать
panel и palette это прям уж совсем разные вещи :)
с моей точки зрения palette в данном случае неудобно.
нужно чтобы нажал хоткей, который передаётся через все удалёнки, появилось окно, выбрал нужный скрипт, окно исчезло, и больше не мешалось :)
 
Последнее редактирование: