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

  • Автор темы Автор темы bossrus
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.
Добавил в твой код
Код:
resizeShop += " pic.toSource();";
Результат нулевой.
 
прости, а какой результат ожидался?

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

alert(resultMsg.body);

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

bt.send(100000);
 
  • Спасибо
Реакции: Oleg Butrin
Экспериментальным путем был получен работающий вариант:
Код:
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);
Без двойного апдейта именно в таком виде не работает.
 
а у меня мой первый работает.

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

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

но опять-же — это всё не решает сабжа.
вот в чём печаль.
 
нет там паузы.
bt.send(100000) это не пауза, а таймаут. да и не нужен он, без него все работает, кроме alert

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

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

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

вообще, вы мою модификацию пробовали запускать?
 
а, может про это речь -
app.waitForAllTasks();

но это как раз дает завершиться всем бэкграундным процессам
 
как на работе разгребусь — обязательно попробую. может и скрипт уменьшится раза в 2 :)))
 
проверил.
Экспериментальным путем был получен работающий вариант:...
адаптировал свой код для наглядности, и получилось вот что:
Код:
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(); надёжно вешает (или выключает) поток, и переименование папки остаётся единственным способом выполнить сабж.
 
Статус
Закрыто для дальнейших ответов.