//Скрипт предназначен для открытия в Adobe Illstrator PDF файлов, помещенных в публикацию Adobe InDesign. //Опционально возможен запуск одного из экшенов для обработки файлов, а также закрытие файлов после обработки. //АВТОР ОРИГИНАЛЬНОГО СКРИПТА: Олег Бутрин (http://indesign.rudtp.ru) //АВТОР МОДИФИКАЦИИ под Adobe Illustrator: Влад Осипов (http://ossipov.info) //ДАТА НАПИСАНИЯ: 16.06.2006 #target indesign //Заголовочная часть - определение переменных диалога var langAlertNoDoc = localize({en: "No documents are open!", ru: "Нет открытых документов!"}); var langAlertIllustratorNotStarted = localize({en: "Illustrator not started!", ru: "Невозможно запустить Illustrator!"}); var langAlertNoImages = localize({en: "Can\'t find normal link!", ru: "Невозможно найти обновленные связи!"}); var langDialogImagesFrom = localize({en: "Images from:", ru: "Картинки из:"}); var langDialogDocument = localize({en: "document", ru: "документа"}); var langDialogSpread = localize({en: "spread", ru: "разворота"}); var langDialogPage = localize({en: "page", ru: "страницы"}); var langDialogSelection = localize({en: "selection", ru: "выделенного"}); var langDialogRunAction = localize({en: "Run Action", ru: "Запустить Action"}); var langDialogCloseAfterAction = localize({en: "Close after Action", ru: "Закрыть после выполнения"}); var iniScriptName = "Open PDF Files In Illustrator"; var iniScriptVersion = "1.0"; //Для изменения экшена отредактируй нижеследующие определения var iniActionSet = "Default Actions"; var iniActionName = "Basic workspaces"; //Функция получения картинок из указанного массива объектов function getSelectedImages(myArray) { var myResult = new Array(); for (var myCounter = 0; myCounter < myArray.length; myCounter++) { var myObject = myArray[myCounter]; if (myObject.constructor.name == "PDF") { myResult.push(myObject) } else { for (var objCounter = 0; objCounter < myObject.allGraphics.length; objCounter++) { if (myObject.allGraphics[objCounter].constructor.name == "PDF") { myResult.push(myObject.allGraphics[objCounter]); } } } } return myResult; } //Функция поиска дублирующихся файлов в массиве function checkDoubledFile(myArray, myObject) { for (var objCounter = 0; objCounter < myArray.length; objCounter++) { if (myObject.itemLink.filePath == myArray[objCounter].itemLink.filePath) { return true; } } return false; } //Функция получения списка неповторяющихся файлов function getUniqImages(myArray) { var myResult = new Array(); for (var myCounter = 0; myCounter < myArray.length; myCounter++) { var myObject = myArray[myCounter]; if (!checkDoubledFile(myResult, myObject)) { myResult.push(myObject); } } return myResult; } //Функция отсеивания необновленных и отсутствующих файлов function removeMissingFile(myArray) { var myResult = new Array(); for (var myCounter = 0; myCounter < myArray.length; myCounter++) { if (myArray[myCounter].itemLink.status == LinkStatus.normal) { myResult.push(myArray[myCounter]); } } return myResult; } //Функция получения полного пути к файлу function getImagePath(myArray) { var myResult = new Array(); for (var myCounter = 0; myCounter < myArray.length; myCounter++) { myResult.push(myArray[myCounter].itemLink.filePath); } 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; } } with (app) { //Получаем активный документ try { var myDoc = activeDocument; } catch (error) { alert(langAlertNoDoc); exit(); } // Делаем выборку файлов из выделенных объектов и проводим отсеивание var myFiles = getSelectedImages(selection); myFiles = getUniqImages(myFiles); myFiles = removeMissingFile(myFiles); // Создаем и запускаем диалог var myDialog = dialogs.add({name: iniScriptName + " " + iniScriptVersion}); with (myDialog.dialogColumns.add().borderPanels.add().dialogColumns.add()) { dialogRows.add().staticTexts.add({staticLabel:langDialogImagesFrom}); var selectedRegion = dialogRows.add().radiobuttonGroups.add(); with (selectedRegion) { radiobuttonControls.add({staticLabel:langDialogDocument, checkedState: true}); radiobuttonControls.add({staticLabel:langDialogSpread}); radiobuttonControls.add({staticLabel:langDialogPage}); if (myFiles.length > 0) { radiobuttonControls.add({staticLabel:langDialogSelection, checkedState: true}); } var selectedAction = dialogRows.add().checkboxControls.add({staticLabel: langDialogRunAction}); var selectedCloseAfter = dialogRows.add().checkboxControls.add({staticLabel: langDialogCloseAfterAction}); } } var myResult = myDialog.show(); if (!myResult) { myDialog.destroy(); exit(); } // Проводим выборку файлов и отсеивание на основании выбранных настроек switch (selectedRegion.selectedButton) { case 0: var myFiles = getSelectedImages([myDoc]); myFiles = getUniqImages(myFiles); myFiles = removeMissingFile(myFiles); break; case 1: var myFiles = getSelectedImages([activeWindow.activeSpread]); myFiles = getUniqImages(myFiles); myFiles = removeMissingFile(myFiles); break; case 2: var myFiles = getSelectedImages([activeWindow.activePage]); myFiles = getUniqImages(myFiles); myFiles = removeMissingFile(myFiles); break; } // Если в выборке не осталось ни одного файла, то предупреждаем и выходим if (myFiles.length == 0) { alert(langAlertNoImages); exit(); } // Создаем в виде текстовой переменной скрипт для Photoshop очень аккуратно и внимательно, посколько любая ошибка приводит к отказу выполнения var myScriptString = ""; // Получаем список имен файлов и передаем его в запускаемый скрипт myScriptString += "var myFiles = " + getImagePath(myFiles).toSource() + ";"; myScriptString += "for (var myCounter = 0; myCounter < myFiles.length; myCounter++) { "; myScriptString += "try {"; myScriptString += "app.open(File(myFiles[myCounter]));"; // Передаем экшн if (selectedAction.checkedState) { myScriptString += "app.doAction(\'" + iniActionName + "\', \'" + iniActionSet + "\');"; } if (selectedCloseAfter.checkedState) { myScriptString += "app.activeDocument.close(SaveOptions.SAVECHANGES);"; } myScriptString += "} catch (error) {alert(error)}"; myScriptString += "}"; // Создаем и выполняем объект BridgeTalk if (executeTarget("illustrator")) { var bt = new BridgeTalk; bt.target = "illustrator"; bt.body = myScriptString; bt.send(); } else { alert(langAlertIllustratorNotStarted); myDialog.destroy(); exit(); } myDialog.destroy(); exit(); }