2015-04-28 3 views
3

Я хотел бы запустить код, протестировав только текущий выбор (не весь документ), и мне трудно понять, как именно массив «app.selection» «и его методы работают. Для начала, я использую «для» цикла к циклу через каждый элемент, выбранный с помощью:Как использовать app.selection [0] для скриптов в Adobe InDesign

for(loop = 0; loop < app.selection.length; loop++){ 
    var sel = loop; 
} 

Это работает хорошо, но когда я хочу, чтобы в определении того, что каждый элемент IS, это становится немного странно. Например,

for(txt = 0; txt < app.selection[sel].textFrames.length; txt++){ 
    // do something to each text frame in the selection here. 
} 

не работает, как ожидалось, но

for(img = 0; img < app.selection[sel].allGraphics.length; img++){ 
    // do something to each graphic in the selection here 
} 

, кажется, работает хорошо, независимо от того, выбор включает в себя больше, чем просто графики в одиночку, или он находится внутри или за пределами группы.

Временами кажется, что app.selection [0] - единственный способ получить доступ к элементу самостоятельно. Другими словами, если выбран текстовый фрейм, app.selection [0] может быть таким же, как app.document.textFrames [0], в этом случае было бы излишним (и неправильно), чтобы сказать

app.document.textFrames[0].textFrames[0] 

И все же одна и та же концепция на разных страницах работает как шарм. Это довольно озадачивает. Кроме того, представляется невозможным определить, какой предмет является объектом. Я хочу сказать что-то вроде:

if (app.selection[0] == [object TextFrame]) 

но это не работает для меня. Есть ли способ четко проверить, является ли текущий элемент группой, графическим или текстовым фреймом и делать разные вещи в зависимости от результата?

ответ

3

app.selection возвращает массив объектов, так что каждый элемент в массиве может быть другого типа, а также свойства и методы, доступные для него будут отличаться. При использовании ExtendScript Javascript консоли вы можете увидеть, что конкретный элемент массива на лету, просто набрав

app.selection[0] 

(или любой другой номер). Результатом будет что-то вроде [object TextFrame].

При перемещении по массиву выбора вы можете использовать приложение.выберите [0] .constructor.name, чтобы определить тип каждого. Или, если вы заинтересованы только в определенных типах,

if (app.selection[i] instanceof TextFrame){} 

В этот момент вы будете знать о том, какие свойства можно получить доступ, в зависимости от типа.

Чтобы ответить на вторую часть вопроса, не существует свойства allTextFrames, но есть свойство allPageItems. Это возвращает массив pageItems (textFrames, groups и т. Д.), И вы можете работать с ним аналогично app.selection. Так что, если у меня есть три текстовых фреймов, сгруппированных на первой странице моего документа (и больше ничего), я могу видеть, что следующая все верно:

app.activeDocument.pages[0].textFrames.length == 0; 
app.activeDocument.pages[0].allPageItems.length == 4; 
app.activeDocument.pages[0].allPageItems[0] instanceof Group; 
app.activeDocument.pages[0].allPageItems[1].constructor.name == "TextFrame"; 

Таким образом, вы могли бы, вероятно, цикл через этот массив, если он больше полезный для вас, чем сборка textFrames. Просто имейте в виду, что у вас нет доступа к специальным свойствам коллекции TextFrames (например, everyItem()).

+0

Отличный отклик! У меня есть другой вопрос относительно всех текстовых фреймов. Чтобы обновить ситуацию в моем вопросе, где app.selection.allGraphics [0] действовал нормально и app.selection.textFrames [0] неправильно, кажется, что это не вопрос недопонимания массива выбора (хотя ваш ответ очистил вопросы, которые у меня были об этом.) allGraphics находит каждый последний доступный графический файл, в то время как textFrames извлекает самые внешние текстовые фреймы в группе. Есть ли эквивалент для allTextFrames? –

+1

Не существует свойства allTextFrames, по крайней мере, ни в одной из версий ID, с которыми я работал (от 5.5 до CC). Существует свойство allPageItems. Я добавлю об этом примечание. – Christina

+0

Отлично! Благодаря! У меня теперь есть рабочая версия благодаря allPageItems. –

0

App.selection действительно является массив, каждый элемент можно получить по индексу:

вар Сель = app.selection // Может быть пустым на нет открытых документов! Пустой массив без выбора с открытым документом. От одного до n массива длины в случае выбора.

то при условии, что вы выбрали один или несколько пунктов, вы можете достичь этих объектов по его индексу

Сель [0] // Это возвращает первый элемент массива. Javascript начинает отсчет с нуля.

После того, как вы сказали, если вы получили доступ, скажите, что sel [4] и кол-во подсчетов менее 5 элементов или столбец 5 пуст, вы получите неопределенное значение. Поэтому перед тем, как использовать его, вам нужно тщательно проверить действительность элемента выбора и никогда не предполагать, что он что-то вернет.

НТН,

Лоик http://www.ozalto.com

 Смежные вопросы

  • Нет связанных вопросов^_^