как заставить индизайн обновить состояние линков "вотпрямщас"?

Статус
Закрыто для дальнейших ответов.

Oleg Butrin

20 лет на форуме
Сообщения
1 990
Реакции
1 213
Добавил в твой код
Код:
resizeShop += " pic.toSource();";
Результат нулевой.
 

Skvoznyak

15 лет на форуме
Сообщения
5 500
Реакции
2 168
прости, а какой результат ожидался?

возвращаемое значение нужно обработать еще внутри onResult
типа там

alert(resultMsg.body);

и есть тонкость с асинхронными вызовами (если основной скрипт завершился, alert из onResult не покажется). поэтому для начала лучше вызвать синхронно с таймаутом

bt.send(100000);
 
  • Спасибо
Реакции: Oleg Butrin

Oleg Butrin

20 лет на форуме
Сообщения
1 990
Реакции
1 213
Экспериментальным путем был получен работающий вариант:
Код:
var myLink = app.activeDocument.allGraphics[0].itemLink;
var pic = myLink.filePath;

var resizeShop = "";
resizeShop += " var pic='"+pic+"'\r";
resizeShop += " app.open(File(pic));\r";
resizeShop += " app.activeDocument.resizeImage(app.activeDocument.width + 1, app.activeDocument.height + 1, 300, ResampleMethod.BICUBICSMOOTHER);\r";
resizeShop += " app.activeDocument.close(SaveOptions.SAVECHANGES);\r"
resizeShop += " pic.toSource();";

var bt = new BridgeTalk();
bt.target = "photoshop";
bt.body = resizeShop;

bt.onResult = function(resultMsg) {
    app.waitForAllTasks();
    myLink.update();
    if (myLink.status) {myLink.update()};
}

bt.send(100000);
Без двойного апдейта именно в таком виде не работает.
 

Skvoznyak

15 лет на форуме
Сообщения
5 500
Реакции
2 168
а у меня мой первый работает.

в чем сермяжный смысл такой проверки?
if (myLink.status)

какой-то статус из возможных у link же в любом случае есть, undefined он не бывает, насколько я понимаю
 

Oleg Butrin

20 лет на форуме
Сообщения
1 990
Реакции
1 213
Смысл скорее не сермяжный, а сакральный.
Если просто вызывать update(), то не работает. Если, например, до апдейта вызвать окно alert, то работает. Ну и вот так, как сделал - у меня работает.
 

bossrus

шибка умный, аднака
Топикстартер
12 лет на форуме
Сообщения
447
Реакции
74
Смысл скорее не сермяжный, а сакральный.
Если просто вызывать update(), то не работает. Если, например, до апдейта вызвать окно alert, то работает. Ну и вот так, как сделал - у меня работает.
но опять-же — тут введена пауза. именно поэтому — чтобы не вводить паузы — я сделал не сплошной скрипт с ожиданием обработки картинки (тем более, что у нас бывают картинки, которые образмериваются по 5-6 минут — какую паузу ставить? 5 минут? и материал с 100 картинок будет висеть сутки? 10 секунд? и в двух третях случаев скрипт будет игнорировать изменения, потому что картинка ещё не сохранилась?), а с вызовом индизайна обратно через тот-же bt.send. и вся асинхронность прекрасно становится совершеннейшей синхронностью и последовательностью.

но опять-же — это всё не решает сабжа.
вот в чём печаль.
 

Skvoznyak

15 лет на форуме
Сообщения
5 500
Реакции
2 168
нет там паузы.
bt.send(100000) это не пауза, а таймаут. да и не нужен он, без него все работает, кроме alert

и проблема лично у меня решилась. как было у вас в оригинале - действительно не работало.

и в двух третях случаев скрипт будет игнорировать изменения, потому что картинка ещё не сохранилась?

неа. onResult будет вызван строго после того, как сохранение закончится.

вообще, вы мою модификацию пробовали запускать?
 

Skvoznyak

15 лет на форуме
Сообщения
5 500
Реакции
2 168
а, может про это речь -
app.waitForAllTasks();

но это как раз дает завершиться всем бэкграундным процессам
 

bossrus

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

bossrus

шибка умный, аднака
Топикстартер
12 лет на форуме
Сообщения
447
Реакции
74
проверил.
Экспериментальным путем был получен работающий вариант:...
адаптировал свой код для наглядности, и получилось вот что:
Код:
var targets = BridgeTalk.getTargets(null,null);
var shps = new Array();
for (var q=0;q<targets.length;q++)
    if (targets[q].toLocaleLowerCase().indexOf("hotoshop")>=0) shps.push(targets[q]);

var myDialog = app.dialogs.add();
     with (myDialog.dialogColumns.add())
        {
        with (dialogRows.add().borderPanels.add().dialogColumns.add())
            {
            dialogRows.add().staticTexts.add({staticLabel: "выберите фотошоп"});
            var kName = dialogRows.add().dropdowns.add({stringList: shps, selectedIndex: 0});
            }
        }
    if (!myDialog.show()) {exit();};
var shopVersion=shps[kName.selectedIndex];
var indisVersion = "indesign-"+app.version;
   
    var pic = app.documents[0].allGraphics[0].itemLink.filePath;
   
    var resizeShop = "";
    resizeShop += " var pic='"+pic+"'\r";
    resizeShop += " app.open(File(pic));\r";
    resizeShop += " activeDocument.resizeImage(activeDocument.width-1, activeDocument.height-1, 300, ResampleMethod.BICUBICSMOOTHER);\r";
    resizeShop += " app.activeDocument.close(SaveOptions.SAVECHANGES);\r"
   
    var bt = new BridgeTalk;
    bt.target = shopVersion;
    bt.body = resizeShop;
    bt.onResult = function(resultMsg)
        {
        app.waitForAllTasks();
        app.documents[0].allGraphics[0].itemLink.update();
        alert('ok');
        }
    bt.send(1000);
    alert('neok');

при запуске картинка благополучно обрабатывается в шопе (уменьшается на 1 что-то-там по 2 направлениям), сохраняется...
индизайн выдаёт 'neok'.
если в bt.onResult = function(resultMsg) выключить строчку app.waitForAllTasks(); то эта ветка продолжает работать. алерт 'ok' показывается. но линк, понятное дело, не обновляется.

т.е. строка app.waitForAllTasks(); надёжно вешает (или выключает) поток, и переименование папки остаётся единственным способом выполнить сабж.
 
Статус
Закрыто для дальнейших ответов.