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

  • Автор темы Автор темы bossrus
  • Дата начала Дата начала

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;

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

не подскажете что можно придумать, чтобы и функции вызывались, и диалог не особо мешался?
 
Последнее редактирование модератором:
Поделиться тебе моей старой панелью запуска скриптов?
 
В смысле, можно расписать то, что запускать скрипты, меняющие документ, следует исключительно из немодального диалогового окна (например, palette), но будет ли тебе от этого счастье?
 
  • Спасибо
Реакции: bossrus
Тогда смотри в сторону 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)
ничем не отличается от тех же строк без апп.ду :(
 
Посмотреть вложение 140967
где sFold может быть и сетевым путём.
да. это я видел. но это приводит к запуску скрипта, если он не обёрнут в function.
а мне нужно загрузить скрипт, и в нём запустить процедуру.... идея.
ща попробую налету слабать скрипт с импортом и запуском процедуры, и уже этот "налётный" скрипт запустить...
 
Посмотреть вложение 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);

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

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

объявляем оооочень глобальную переменную
Код:
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();

профит. никакой модальности, но очень много запусков совершенно выбранного скрипта :)
 
Если уж зашла речь об извращенных решениях, то у меня, вроде как, работало из диалога без закрытия через File.execute
 
Если уж зашла речь об извращенных решениях, то у меня, вроде как, работало из диалога без закрытия через File.execute
маловероятно.
проблема не в тех скриптах, которые присоединяются.
проблема в том, что сам индизайн не даёт доступа к некоему набору свойств документа, если в это время в индизайне открыто модальное окно
 
с хоткеями начались траблы. никакие программы для удалёнки не передают их правильно и в полном объёме. а ещё на работе стоят маки, а дома у всех писюки...
Не судите строго, может глупость сморожу :) Но нельзя скриптом ID вызвать внешний скрипт (если для Win vbs скажем) и уже в нем реализовать окно, кнопки с запуском и т.д.?

Не по теме:
Хотя я бы таки поискал в чем затык с горячими клавишами, почему и какие не правильно работают и попытался это исправить (если "в лоб", то перехват чем - то вроде AHK и отправка "правильного" скан-кода на мак)
 
Только что проверил - работает (причем, по идее, во всех адобовских программах, кроме, разумеется, акробата)
Немодальное диалоговое окно panel висит на экране, на нем нажимается кнопка по нажатию которой вызывается ESTK с нужным скриптом, меняющим все что угодно в открытом документе, вплоть до создания нового
Но, повторяю, это извращенное решение, правильнее, наверное, через бридж или через экстеншн
 
Немодальное диалоговое окно panel висит на экране, на нем нажимается кнопка по нажатию которой вызывается ESTK
вооот. панель.
а как реализовано ожидание нажатия кнопки на немодальном окне?
 
Ну естественно панель
запускать скрипты, меняющие документ, следует исключительно из немодального диалогового окна (например, palette),
а как реализовано ожидание нажатия кнопки на немодальном окне?
Так же как и на модальном
JavaScript:
z.startB.onClick = startB_onClick;
 
Ну естественно панель
дык вот. а у меня не панель, а диалог.

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

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