Скриптинг в InDesign. Часть 2
Тестирование и отладка скриптов
Просмотр доступных для скриптингакоманд, объектов, свойств и классов
Просмотр библиотеки типов (type library)InDesign в среде VisualBasic
Просмотр словаря (dictionary)InDesign в среде AppleScript
Script 2-1. Пополосный вывод ps-файлов
Продолжаем публикацию серии материалов, посвященных скриптингу в ID. В этой части серии мы завершаем рассмотрение базовых конструкций VB и AppleScript и создадим скрипт, выводящий каждую полосу публикации в отдельный ps-файл.
Единицы измерения
В предыдущей части серии при обзоре базовых конструкций и понятий VB и AppleScript в приложении к ID-скриптингу мы рассмотрели свойства координатной сетки. Любая операция, связанная с запросом о геометрических свойствах объекта или с изменением таковых, использует его координаты. Координата объекта — величина размерная, и размерность ее может фигурировать как в виде простого числового значения (12,78), так и виде строки, в которой явным образом указывается единица измерения («2p3,2», «23,5 mm»). При получении числового значения InDesign считает, что речь идет о единицах измерения, установленных по умолчанию в текущей публикации. В противном случае используется та единица измерения, которая была указана явно.
При запросе о геометрических свойствах объектов, InDesign возвращает значения в текущих единицах измерения, установленных в публикации. Иногда формат возвращаемых значений отличается от того, к которому мы привыкли в палитре Transform. Вследствие того что ID при выполнении скриптов не может производить арифметические операции над строковыми представлениями величин вида «0p3,5» и «13p4», возвращаться будут величины в представлении «0,2916» и «13,333» соответственно.
В случае предполагаемого использования в создаваемом скрипте каких-либо арифметических операций с единицами измерения (сложение, вычитание, умножение, деление) настоятельно рекомендуем в блоке инициализации указывать приложению необходимое нам одно из доступных значений константы idMeasurementUnits (idMSCentimeters, idMSCiceros, idMSInches, idMSInchesDecimal, idMSMillimeters, idMSPicas, idMSPoints). В финальной части скрипта можно вернуться к единице измерения, принятой в публикации до выполнения скрипта. Исполнение следующего кода эквивалентно установке значений «millimetres» для вертикальной и горизонтальной линейки во вкладке Units & Increments палитры Preferences:
Dim myInDesign As InDesign.Application Dim myPub As InDesign.Document Dim myViewPrefs As InDesign.ViewPreference Set myInDesign = CreateObject(“InDesign.Application.2.0”) Set myPub = myInDesign.ActiveDocument Set myViewPrefs = myPub.ViewPreferences myViewPrefs.HorzMeasurementUnits = idMSMillimeters myViewPrefs.VertMeasurementUnits = idMSMillimeters
Такой способ начальной инициализации единиц измерения позволяет не указывать их тип явным образом при каждой операции с геометрическими характеристиками объекта и избавляет от возникновения множества трудно обнаруживаемых ошибок и неточностей.
Подпрограммы и процедуры
Подпрограммы (subroutines в VB) и процедуры (handlers в AplleScript) являются отдельными исполняемыми модулями, к которым мы можем обращаться из основного кода скрипта. В большинстве случаев подпрограммам (процедурам) передается одно или несколько значений, и после исполнения над ними каких-либо действий внутри подпрограммы обратно принимаются значения-результаты. Используя подпрограммы, очень удобно, например, преобразовывать единицы измерения из одного типа в другой или вычислять координаты геометрического центра объекта, зная его угловые координаты (GeometricBounds). Семантические конструкции подпрограмм ничем не отличаются от конструкций, доступных для использования в обычном коде. Подпрограммы облегчают код, позволяя один раз описать и отладить часто используемую операцию, чтобы в дальнейшем неоднократно к ней обращаться из тела скрипта. Если при создании скрипта появляются повторяющиеся несколько раз сочетания однотипных строк, то стоит всерьез задуматься о вынесении их в подпрограмму. Как раз такая ситуация проиллюстрирована нами в предлагаемом скрипте пополосной печати публикации (стр. 60), где вывод каждой сепарации в отдельный файл реализован в основном коде, хотя его можно было осуществить, использовав подпрограмму.
Обращение к подпрограмме происходит через команду «GoSub mySubroutineName», после выполнения которой переменные, возвращаемые подпрограммой, доступны для использования в теле скрипта. Код подпрограммы должен находиться вне текста скрипта (после команды End Sub), начинаться со строки «mySubroutineName:» и заканчиваться командой «End Sub». Следующий скрипт вычисляет координаты геометрического центра предварительно выбранного объекта:
Private Sub Command1_Click() Dim myInDesign As InDesign.Application Dim mySelection As Object Dim myBounds As Variant Set myInDesign = CreateObject(“InDesign.Application.2.0”) Set mySelection = myInDesign.Selection.Item(1) myBounds = mySelection.GeometricBounds GoSub CalculateGeometricCenter ‘ С этого момента переменная “myCenter” ‘ доступна для последующих операторов Exit Sub ‘ Следующая строка — указатель начала тела подпрограммы CalculateGeometricCenter: myX1 = myBounds(1) myY1 = myBounds(0) myX2 = myBounds(3) myY2 = myBounds(2) myXCenter = myX1 + ((myX2 - myX1)/2) myYCenter = myY1 + ((myY2 - myY1)/2) myCenter = Array(myXCenter, myYCenter) Return End Sub
Тестирование и отладка скриптов
Visual Basic предоставляет возможность контроля за исполнением скрипта, что значительно облегчает процесс отладки кода и исправления неизбежно возникающих при этом ошибок. Мы можем остановить скрипт в любой точке, исполнять код в пошаговом режиме, наблюдая за результатами действия каждой строки, а также отслеживать значения переменных в тот или иной момент.
Наблюдение за значениями переменных в VB осуществляется посредством окна Watches (Debug>Quick Watch). Установив курсор на отслеживаемой переменной (в нашем случае — myCenter), вызываем Watch и в появившемся окне Quick Watches нажимаем кнопку Add. Чтобы увидеть значение переменной в момент исполнения определенной строки, на ней необходимо установить стоп-точку (Debug>Toggle Breakpoint). В процессе исполнения скрипта VB остановится на указанной стоп-точке и в окне Watch (если оно скрыто — View>Watch Window) мы увидим значение перменной в текущий момент (рис. 1). Команда Debug>Step Into (клавиша F8) выполнит следующую за стоп-точкой команду, а Run>Start (F5) запустит исполнение скрипта в штатном режиме.
Обработка ошибок
Предположим, что мы создали скрипт, который занимается форматированием текста. Естественно, что объектом действия этого скрипта должен быть выделенный текст или текстовый фрейм. Но что произойдет, если в данный момент выделенным объектом является любой другой объект, отличный от текстового? Для разрешения подобных коллизий в VB предусмотрен механизм обработки ошибок (error handling) — группа операторов, добавляемых к коду, позволяющих выяснить причину возникновения ошибки, указать пользователю на эту причину и подсказать ему «правильное поведение».
Оператор on error предусматривает три варианта развития событий:
On Error GoTo line — переход к подпрограмме вывода сообщений об ошибке и/или выполнения действий, эту ошибку устраняющих;
On Error Resume Next — игнорирование ошибки и переход к следующей строке кода;
On Error GoTo 0 — отключение всех ранее активированных обработчиков ошибок.
Объект err содержит информацию о возникающих ошибках и иногда, в целях отладки, используется для имитации ошибочных ситуаций. Подробно на свойствах этого объекта мы останавливаться не будем, отметим лишь такие важные его свойства, как number и description. Использование при отладке скрипта свойства err.number позволяет точно диагностировать возникшую проблему, а err.description — указать пользователю на суть и причину возникновения ошибки. Так, при исполнении приведенного ниже скрипта попытка поместить на полосу несуществующий файл приводит к возникновению ошибки №432 «File name or class name not found during Automation operation»:
Private Sub Command1_Click() Dim myInDesign As InDesign.Application Dim myDocument As InDesign.Document Dim myPage As InDesign.Page Set myInDesign = CreateObject(“InDesign.Application.2.0”) Set myDocument = myInDesign.ActiveDocument Set myPage = myDocument.Pages.Item(1) On Error GoTo myDisplayError Err.Description = “Файл не найден!” Set myImage = myPage.Place(“c:\primer.tif”) Exit Sub myDisplayError: MsgBox Err.Description End Sub
Просмотр доступных для скриптингакоманд, объектов, свойств и классов
Большим подспорьем для самостоятельного изучения скриптинга в InDesign является наличие описаний команд, объектов, свойств и доступных методов непосредственно в средах разработки (VB и AppleScript). Без планомерного изучения этих своебразных руководств добиться значимых результатов в освоении скриптинга вряд ли удастся. Доступ к этим «кладезям знаний» осуществляется в VB и Apple Script по-разному.
Просмотр библиотеки типов (type library)InDesign в среде VisualBasic
- В любом открытом VB-проекте выбираем пункт меню Project > References.
- Находим1 и активируем пункт «Adobe InDesign 1.5 Type Library» или «Adobe InDesign 2.0 Type Library» (рис. 2).
- View > Object Browser. Visual Basic открывает диалоговое окно Проводника Объектов (Object Browser, рис. 3).
- В раскрывающемся списке доступных библиотек выбираем InDesign. В средней части диалогового окна отображаются списки классов объектов, членов этих классов, а также методов, доступных для операций над каждым классом.
- При выборе любого объекта или метода в нижней части Object Browser появляются информация об иерархической принадлежности объекта и краткие сведения о синтаксисе доступных операций с ним.
Просмотр словаря (dictionary)InDesign в среде AppleScript
- Запускаем InDesign и AppleScript Editor. Редактор сриптов присутствует в любой Mac OS, если же это не так, то его инсталляция присутствует на установочном CD с Mac OS.
- В окне Script Editor выбираем File > Dictionary.
- При запущенном InDesign выбираем его в списке приложений. В правой части окна находятся свойства, доступные для каждого объекта, а слева — сами классы объектов (рис. 4).
От теории к практике
Очень часто необходимо получить вывод публикации в пополосном режиме, в частности, для спуска полос в одной из программ-импозеров. Процедура ручного вывода каждой полосы в отдельный файл достаточно утомительна и требует повышенного внимания от верстальщика. У авторов нет информации о существовании плагинов, реализовывающих подобную задачу. Поэтому и был создан предлагаемый сегодня скрипт, осуществляющий пополосный вывод публикации в отдельные ps-файлы.
Все настройки цветоделения устанавливаются в стилях публикации. Стиль выбирается в ниспадающем списке предлагаемой формы (рис. 5). Отметив флажок «По краскам», мы получим отдельные ps-файлы для каждой полосы и каждой краски (с соответствующим индексом).
КомпьюАрт 3'2002