[ID CC-CC2021] Из InDesign-а в Photoshop

UserD

Топикстартер
15 лет на форуме
Сообщения
48
Реакции
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;
    }
}

Очень надеюсь на помощь
 
Последнее редактирование:

dosp

Участник
Сообщения
1 143
Реакции
369
Тут на форуме должен быть скрипт Crop&Resize. С похожим функционалом.
Он в свободном доступе, насколько я знаю. Думаю можно подсмотреть как там это работает.
 

UserD

Топикстартер
15 лет на форуме
Сообщения
48
Реакции
1

UserD

Топикстартер
15 лет на форуме
Сообщения
48
Реакции
1
'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
 

Oleg Butrin

20 лет на форуме
Сообщения
1 989
Реакции
1 213

UserD

Топикстартер
15 лет на форуме
Сообщения
48
Реакции
1
В итоге, получилось приметно так:
Код:
// Поменять выделенное изображение на аналогичное .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;
    }
}
Спасибо всем
 
Последнее редактирование: