[CC2015] Из InDesign-а в Photoshop

Тема в разделе «Скрипты и плагины InDesign», создана пользователем UserD, 9 июл 2018.

  1. Доброго времени!
    Прошу, снова, о помощи: скриптом хочу обработать выделенную картинку action-ном в Photoshop-е (action обрабатывает и пересохраняет в .psd).

    Но, есть проблема: русские имена файлов не обрабатывает :(

    и еще, без
    Код:
    alert (myNewFile);
    фокус не переходит на InDesign и связь не обновляется

    Код:
    // Поменять выделенное изображение на аналогичное .psd, после редактирования в Photosop
    mySelLink = app.selection[0].allGraphics[0].itemLink;
    
    //Для изменения экшена отредактируй нижеследующие определения
    var iniActionSet = "MySet";
    var iniActionName = "MyAction";
    
    var myScriptString = "";
    var mySelLink = app.selection[0].allGraphics[0].itemLink;
    var myFiles = mySelLink.filePath;
     
    //    Передаем файл в запускаемый скрипт
    myScriptString += "var myFiles = " + getImagePath(myFiles).toSource() + ";";
    myScriptString += "for (var myCounter = 0; myCounter < myFiles.length; myCounter++) { ";
    myScriptString += "try {";
    myScriptString += "app.open(File(myFiles[myCounter]));";
    //    Передаем экшн
    myScriptString += "app.doAction(\'" + iniActionName + "\', \'" + iniActionSet + "\');";
    myScriptString += "} catch (error) {alert(error)}";
    myScriptString += "}";
    //    alert(myScriptString);
    //    Создаем и выполняем объект BridgeTalk
        if (executeTarget("photoshop")) {
            var bt = new BridgeTalk;
            bt.target = "photoshop";
            bt.body = myScriptString;
            bt.send();
        } else {
            alert(langAlertPhotoshopNotStarted);
        }
    
    #target indesign
    myNewFile = myFiles.slice (0, myFiles.length-4);
    myNewFile = myNewFile + ".psd";
    alert (myNewFile);
    //alert();
    
    if (File(myNewFile).exists) mySelLink.relink(File(myNewFile));
    mySelLink.update();
    //mySelLink.relink(File(myNewFile));
    //alert ("Сделано!");
    
    //Функции
    function getImagePath(myString) {
        var myResult = new Array();
            myResult.push(myString);
        return myResult;
    }
    //Функция запуска приложения с использованием функций BrigeTalk (подробно об использовании Bridge Talk смотри в описании Bridge Scripting)
    function executeTarget (appSpec) {
        try {
    //        если приложение уже запущено, передаем ему фокус
            if (BridgeTalk.isRunning(appSpec)) {
                BridgeTalk.bringToFront (appSpec);
            } else {
    //            если приложение не запущено, запускаем его и передаем фокус
                BridgeTalk.launch (appSpec);
                BridgeTalk.bringToFront (appSpec);
            }
            return true;
        } catch (error) {
            return false;
        }
    }
    Очень надеюсь на помощь
     
    #1 UserD, 9 июл 2018
    Последнее редактирование: 9 июл 2018
  2. Тут на форуме должен быть скрипт Crop&Resize. С похожим функционалом.
    Он в свободном доступе, насколько я знаю. Думаю можно подсмотреть как там это работает.
     
  3. Ага, Crop And Resize но легче не стало :(
     
  4. 'cooll)'
    А как быть с русскими именами файлов?

    И еще: скрипт писал на базе чужого, и с конструкцией
    Код:
    //    Передаем файл в запускаемый скрипт
    myScriptString += "var myFiles = " + getImagePath(myFiles).toSource() + ";";
    myScriptString += "for (var myCounter = 0; myCounter < myFiles.length; myCounter++) { ";
    myScriptString += "try {";
    myScriptString += "app.open(File(myFiles[myCounter]));";
    //    Передаем экшн
    myScriptString += "app.doAction(\'" + iniActionName + "\', \'" + iniActionSet + "\');";
    myScriptString += "} catch (error) {alert(error)}";
    myScriptString += "}";
    
    не разобрался :(.
    Нельзя ли как-то проще передать в Photoshop обрабатываемый файл
    Код:
    myFiles 
     
  5. В итоге, получилось приметно так:
    Код:
    // Поменять выделенное изображение на аналогичное .psd, после редактирования в Photosop
    
    //Для изменения экшена отредактируй нижеследующие определения
    var iniActionSet = "MySet";
    var iniActionName = "MyAction";
    
    var myScriptStr = "";
    var mySelLink = app.selection[0].allGraphics[0].itemLink;
    var mySerFile = mySelLink.filePath;
       
    //    Создаем и выполняем объект BridgeTalk  
        if (executeTarget("photoshop")) {
            var bt = new BridgeTalk;
            bt.target = "photoshop";
            myScriptStr += "var doc = app.open(File('" + mySerFile + "'));";
            myScriptStr += "app.doAction(\'" + iniActionName + "\', \'" + iniActionSet + "\');";
            bt.body = myScriptStr;
            // Только так и обновляет связи... Спасибо (с) Oleg Butrin.
            bt.onResult = function(resultMsg) {
                app.waitForAllTasks();
                mySelLink.update();
                if (mySelLink.status) {mySelLink.update()};
            }
            bt.send(100000);
        } else {
            alert("Что-то неладное в нашем королевстве...");
            exit();
        }  
    
    executeTarget ("indesign");
    myNewFile = mySerFile.slice (0, mySerFile.length-4);
    myNewFile = myNewFile + ".psd";
    
    if (File(myNewFile).exists) mySelLink.relink(File(myNewFile));
    mySelLink.update();
    
    
    // Функция запуска приложения с использованием функций BrigeTalk
    // (подробно об использовании Bridge Talk смотри в описании Bridge Scripting)
    function executeTarget (appSpec) {
        try {
    //        если приложение уже запущено, передаем ему фокус
            if (BridgeTalk.isRunning(appSpec)) {
                BridgeTalk.bringToFront (appSpec);
            } else {
    //            если приложение не запущено, запускаем его и передаем фокус
                BridgeTalk.launch (appSpec);
                BridgeTalk.bringToFront (appSpec);
            }
            return true;
        } catch (error) {
            return false;
        }
    }
    Спасибо всем
     
    #7 UserD, 11 июл 2018
    Последнее редактирование: 11 июл 2018