[ID CC2022] Как обратиться к стилю параграфа (app.findGrepPreferences.appliedParagraphStyle) в группе?

rezunoff

Участник
Топикстартер
Сообщения
64
Реакции
13
Подскажите, как обратиться к стилю параграфа (five), который может быть внутри группы (или в группах с подгруппами) с любым названием?

var myDoc = app.activeDocument;
var mySel = myDoc.selection[0];
app.findGrepPreferences = app.changeGrepPreferences = null;

app.findGrepPreferences.appliedParagraphStyle = "five"; // -???


mySel.changeGrep();

1659954302072.png
 

densen

15 лет на форуме
Сообщения
429
Реакции
304
Подскажите, как обратиться к стилю параграфа (five), который может быть внутри группы (или в группах с подгруппами) с любым названием?
app.findGrepPreferences.appliedParagraphStyle = myDoc.paragraphStyleGroups.item("grp1").paragraphStyleGroups.item("grp2").paragraphStyles.item("five");
 
Последнее редактирование:
  • Спасибо
Реакции: Drawer и Skvoznyak

Skvoznyak

15 лет на форуме
Сообщения
5 382
Реакции
2 133
Заранее мы не знаем имя группы (...с любым названием).
вы можете воспользоваться массивом allParagraphStyles, где стили находятся не в виде дерева, а простого списка, и искать перебором по имени (это не коллекция, так что методов item/itemByName в нем нет)

Document.allParagraphStyles (Read Only)
Data Type: Array of ParagraphStyle
Adobe InDesign 2020 (15.0) Object Model
Lists all paragraph styles (regardless of their group).
 

iv-mi

15 лет на форуме
Сообщения
545
Реакции
345
Я эту задачу решаю сохранением в одном массиве имён абзацных стилей - для выпадающего меню,
и в другом id этих стилей

JavaScript:
var paraStyles = [];

var paraStylesID = [];

while (paraStyles.length > 0) charStyles.pop();

while (paraStylesID.length > 0) charStylesID.pop();

var myParagraphStyles = app.activeDocument.allParagraphStyles;

var myParagraphStyleName, obj;

for (var i=0; i < myParagraphStyles.length ; i++) { // for

    myParagraphStyleName = myParagraphStyles[i].name;

    if (myParagraphStyleName[0] == "[") continue;

    obj = myParagraphStyles[i];

    while(obj.parent instanceof ParagraphStyleGroup) {

        myParagraphStyleName = obj.parent.name + ":" + myParagraphStyleName;

        obj = obj.parent;       

        }

    paraStyles.push(myParagraphStyleName);

    paraStylesID.push(myParagraphStyles[i].id);       

    } // for


Выпадающий список абзацных стилей
var letterParaStyle = needLetter.add ("dropdownlist", undefined, paraStyles);

Индекс выбранного стиля
var para_Index = letterParaStyle.selection.index;

Получение id этого стиля и использование
JavaScript:
var para_StyleID = paraStylesID[para_Index];
story.insertionPoints[rezIndex].paragraphs[0].appliedParagraphStyle = app.activeDocument.paragraphStyles.itemByID(Number(para_StyleID));
 

iv-mi

15 лет на форуме
Сообщения
545
Реакции
345
а в чем смысл проверять пустой массив на длину, и в несбыточном случае (0 > 0) модифицировать другой?
По поводу проверки пустых массивов. Я эту конструкцию увидел когда-то давно, возможно, когда-то объявление массива не гарантировало, что он точно пустой. Сохранил себе этот образчик кода, и просто его повторяю при объявлении новых массивов.
А модификация другого -- да, это ошибка, когда я готовил это сообщение.
Спасибо.
Конечно, надо while (paraStyles.length > 0) paraStyles.pop();
 

rezunoff

Участник
Топикстартер
Сообщения
64
Реакции
13
Я эту задачу решаю сохранением в одном массиве имён абзацных стилей - для выпадающего меню,
и в другом id этих стилей

JavaScript:
var paraStyles = [];

var paraStylesID = [];

while (paraStyles.length > 0) charStyles.pop();

while (paraStylesID.length > 0) charStylesID.pop();

var myParagraphStyles = app.activeDocument.allParagraphStyles;

var myParagraphStyleName, obj;

for (var i=0; i < myParagraphStyles.length ; i++) { // for

    myParagraphStyleName = myParagraphStyles[i].name;

    if (myParagraphStyleName[0] == "[") continue;

    obj = myParagraphStyles[i];

    while(obj.parent instanceof ParagraphStyleGroup) {

        myParagraphStyleName = obj.parent.name + ":" + myParagraphStyleName;

        obj = obj.parent;      

        }

    paraStyles.push(myParagraphStyleName);

    paraStylesID.push(myParagraphStyles[i].id);      

    } // for


Выпадающий список абзацных стилей
var letterParaStyle = needLetter.add ("dropdownlist", undefined, paraStyles);

Индекс выбранного стиля
var para_Index = letterParaStyle.selection.index;

Получение id этого стиля и использование
JavaScript:
var para_StyleID = paraStylesID[para_Index];
story.insertionPoints[rezIndex].paragraphs[0].appliedParagraphStyle = app.activeDocument.paragraphStyles.itemByID(Number(para_StyleID));
Спасибо, Михаил! По -.Id - работает на ура.
Код:
var paraStyles = [];
var paraStylesID = [];
while (paraStyles.length > 0) paraStyles.pop();
while (paraStylesID.length > 0) paraStylesID.pop();
//~ while (paraStyles.length > 0) charStyles.pop();
//~ while (paraStylesID.length > 0) charStylesID.pop();
// Конечно, надо while (paraStyles.length > 0) paraStyles.pop();
var myParagraphStyles = app.activeDocument.allParagraphStyles;
var myParagraphStyleName, obj;

for (var i=0; i < myParagraphStyles.length ; i++) { // for
    myParagraphStyleName = myParagraphStyles[i].name;
    if (myParagraphStyleName[0] == "[") continue;
    obj = myParagraphStyles[i];
    while(obj.parent instanceof ParagraphStyleGroup) {
        myParagraphStyleName = obj.parent.name + ":" + myParagraphStyleName;
        obj = obj.parent;       
        }
    paraStyles.push(myParagraphStyleName);
    paraStylesID.push(myParagraphStyles[i].id);       
    } // for
///
var w = new Window("palette", "Paragraph Style:");
app.activate();
w.alignChildren = "left";
var byStyle = w.add("group");
byStyle.orientation = "column";
var FontDropdownGroup = byStyle.add("group");
var buttonGroup = byStyle.add("group");
button = buttonGroup.add("button", undefined, "W");
FontDropdownGroup.add("statictext", undefined, "Paragraph Style: ");
var letterParaStyle = FontDropdownGroup.add("dropdownlist", undefined, paraStyles);
letterParaStyle.selection = 0;
w.show()
///


button.onClick = function() {
var para_Index = letterParaStyle.selection.index;
var para_StyleID = paraStylesID[para_Index];
app.findGrepPreferences = app.changeGrepPreferences = null;
app.findGrepPreferences.appliedParagraphStyle = app.activeDocument.paragraphStyles.itemByID(Number(para_StyleID));
alert(para_StyleID);
app.activate();
   }
 

Skvoznyak

15 лет на форуме
Сообщения
5 382
Реакции
2 133
Код:
var para_StyleID = paraStylesID[para_Index];
story.insertionPoints[rezIndex].paragraphs[0].appliedParagraphStyle = app.activeDocument.paragraphStyles.itemByID(Number(para_StyleID));

забавно кстати что это работает, так как в .paragraphStyles стилей внутри групп не видно
 

iv-mi

15 лет на форуме
Сообщения
545
Реакции
345
Код:
var para_StyleID = paraStylesID[para_Index];
story.insertionPoints[rezIndex].paragraphs[0].appliedParagraphStyle = app.activeDocument.paragraphStyles.itemByID(Number(para_StyleID));

забавно кстати что это работает, так как в .paragraphStyles стилей внутри групп не видно
Да, id однозначно определяет выбранный стиль, неважно в какой он по уровню вложения группе.
Я очень долго морочился с разбором полного имени на имена групп и имя стиля. А потом вдруг такое решение придумалось.
И всё стало очень просто.
 
  • Спасибо
Реакции: Skvoznyak

iv-mi

15 лет на форуме
Сообщения
545
Реакции
345
да ну ) не может такого быть
Скорее всего, вы правы. Но этот мой опыт из 2008 года. Я тогда мало что понимал в этой науке, и делал скрипты переделкой из других. Вот где-то такой пример указания массива встретил, так и использую.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
32 071
Реакции
10 519
Ну если у тезки в [] паразитные элементы остаются, то, может new Array() исправит дело?
 

Drawer

Участник
Сообщения
586
Реакции
207
Последнее редактирование:

iv-mi

15 лет на форуме
Сообщения
545
Реакции
345
> if (myParagraphStyleName[0] == "[") continue;
Я исключаю в рамках использования скриптов выбор пользователем служебных стилей (в их имени есть открывающая квадратная кавычка). Только сознательно созданные.
 
  • Спасибо
Реакции: _MBK_ и Drawer