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

  • Автор темы Автор темы bossrus
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.
не может такого быть, что на момент обращения к линку файл еще на самом деле не проапдейтился? типа там скрипт для фотошопа работает асинхронно?
нет. всё чётко последовательно.
 
а как вызывается скрипт для шопа? ) если через bridgetalk - там вполне может быть асинхронно. а после того как он отработает запускается метод onResult()
 
а как вызывается скрипт для шопа? ) если через bridgetalk - там вполне может быть асинхронно. а после того как он отработает запускается метод onResult()
через бридж. но скрипт обновления в индизайне запускается из шопа через тот же бридж, когда отработан цикл на пересохранение картинок. не может быть никакого асинхрона

я же говорю — всё уже проверено/перепроверено.
и уже даже стало понятно как поправить. всё ок :)
 
.relink не помог. так же оставляет несколько последних картинок непроапдейченными. пока пауза в шопе после образмерки картинок рулит :(


более того — пока писал этот пост заметил, что если индиз в фоне — вообще все картинки остаются модифайными.
буду пробовать закрыть/открыть документ
 
буду пробовать закрыть/открыть документ
при выполнении команды app.open индиз показывает диалоги на обновление картинок. я знаю, что это можно отключить. но как?
 
при выполнении команды app.open индиз показывает диалоги на обновление картинок. я знаю, что это можно отключить. но как?
и по традиции отвечу себе сам:
Код:
//Set the value to false to prevent the dialog from showing.
app.linkingPreferences.checkLinksAtOpen = false;

//do some stuff ...

//Set the value back to its original value.
app.linkingPreferences.checkLinksAtOpen=true;
 
буду пробовать закрыть/открыть документ
ещё один провал. при быстром открытии/закрытии документа картинки начинают считаться занятыми другим юзером, и, как результат — не обновляются.

опять таки пауза рулит. печаль
 
придумал вариант.
переименовывать папку и линковать новые имена файлов — тогда пауза не требуется, и всё обновляется как надо.
как вариант покатит. всяко лучше, чем пауза в полминуты
 
скрипт можно целиком посмотреть?
 
да так, проверить почему такие проблемы ) можно в личку, дальше меня не уйдет
 
да так, проверить почему такие проблемы ) можно в личку, дальше меня не уйдет
дык это не проблемы. это тормоза логики работы индизайна. он опрашивает состояние файлов не постоянно, а весьма с большим промежутком времени.
завтра как на работу приду — скину сюда укороченную версию — чтобы скрипт модифицировал картинку, а потом обновлял её в индизайне. для экспериментов достаточно :)
 
пусковой скрипт (с выбором шопа):
Код:
#include "/Users/.../-lowTest.jsx";

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;

if (!BridgeTalk.isRunning(shopVersion)) {
            BridgeTalk.launch (appSpec);
        }

resizeToShop(shopVersion, indisVersion);

в include указываешь путь к рабочему плагину

рабочий плагин:
Код:
function resizeToShop(shopVersion, indisVersion)
    {
    var pic = app.documents[0].allGraphics[0].itemLink.filePath;
    var updateLinks ="";
    updateLinks="#include \"/Users/.../-lowTest.jsx\";";
    updateLinks += 'finalWork();';

    var resizeShop = "";
    resizeShop += " var pic='"+pic+"'\r";
    resizeShop += " app.open(File(pic));\r";
    resizeShop += " activeDocument.resizeImage(activeDocument.width/2, activeDocument.height /2, 300, ResampleMethod.BICUBICSMOOTHER);\r";
    resizeShop += " app.activeDocument.save();\r";
    resizeShop += " app.activeDocument.close(SaveOptions.SAVECHANGES);\r"
        resizeShop += "var bt = new BridgeTalk;\r";
        resizeShop += "bt.target = \""+indisVersion+"\";\r";
        resizeShop += "bt.body = '"+updateLinks+"';\r";
        resizeShop += "bt.send();";

    var bt = new BridgeTalk;
    bt.target = shopVersion;
    bt.body = resizeShop;
    bt.send();
    }



function finalWork()
    {
    app.documents[0].allGraphics[0].itemLink.update();
    alert('ok');
    }
то же самое.

берёт первую картинку в открытом документе, уменьшает в 2 раза, обновляет в вёрстке. по логике.
но так как индиз ещё не видит, что картинка изменилась — апдейта не будет.
поставить паузу перед апдейтом — то всё будет ок
 
и по традиции отвечу себе сам:
Код:
//Set the value to false to prevent the dialog from showing.
app.linkingPreferences.checkLinksAtOpen = false;

//do some stuff ...

//Set the value back to its original value.
app.linkingPreferences.checkLinksAtOpen=true;

Решение не универсальное, так как не учитывает текущие настройки. Правильнее - нечто вроде:
Код:
//Set the value to false to prevent the dialog from showing.
var userCheckLinksAtOpen = app.linkingPreferences.checkLinksAtOpen;
app.linkingPreferences.checkLinksAtOpen = false;

//do some stuff ...

//Set the value back to its original value.
app.linkingPreferences.checkLinksAtOpen=userCheckLinksAtOpen;
 
  • Спасибо
Реакции: bossrus
как-то все криво.

bt.send(); это асинхронный запуск скрипта.


а потом еще и опять из фотошопа индизайн через bridgetalk вызывается.
нахрена? есть же callback onResult
 
как-то все криво.
bt.send(); это асинхронный запуск скрипта.
а потом еще и опять из фотошопа индизайн через bridgetalk вызывается.
нахрена? есть же callback onResult
просьба в тапёра не стрелять. лабает как умеет. ©
что нашёл в интернете, то и использовал.
напиши как это должно выглядеть через колбэк.
и вообще к теме это не относится. какая разница как происходит возврат в индизайн. главное — что линк не успевается обновиться.
 
из мануала

Код:
var bt = new BridgeTalk;
bt.target = "bridge-3.0";
bt.body = "var tn = new Thumbnail(’C/MyPhotos/temp.gif’);
tn.core.immediate.size;"

bt.onResult = function( resultMsg ) {
   processFileSize(resultMsg.body);
}
bt.onError = function( errorMsg ) {
var errCode = parseInt (errorMsg.headers ["Error-Code"]); throw new Error (errCode, errorMsg.body);
}

bt.send();


Javascript Tools Guide, глава 5 вся посвящена bt



еще сейчас заметил - какой смысл сохранять два раза?

resizeShop += " app.activeDocument.save();\r";

resizeShop += " app.activeDocument.close(SaveOptions.SAVECHANGES);"
 
Последнее редактирование:
собственно, вот в чем загвоздка
app.waitForAllTasks();

Код:
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/2, app.activeDocument.height /2, 300, ResampleMethod.BICUBICSMOOTHER);\r";
    resizeShop += " app.activeDocument.close(SaveOptions.SAVECHANGES);"


    var bt = new BridgeTalk();
    bt.target = "photoshop";
    bt.body = resizeShop;
  
    bt.onResult = function(resultMsg)
        {
           app.waitForAllTasks();
    
                        myLink.update();
      
        }
  
  
    bt.send();
 
Последнее редактирование:
И работает onResult?
Я сколько раз не экспериментировал на разных версиях, никак не мог добиться возврата значения. Такое впечатление, что onResult не вызывается вообще никогда.
 
да, все работает.

чтоб вернулось, надо в конце bt.body добавить значение, типа там

bt.body+="returnObj.toSource();";
 
Последнее редактирование:
  • Спасибо
Реакции: dumbm1
Статус
Закрыто для дальнейших ответов.