[ID CC-CC2021] Можно ли отредактировать стили (абзацев, символов...) скриптом?

catpaw

Топикстартер
12 лет на форуме
Сообщения
245
Реакции
10
Всем доброго времени суток!
Я очень-очень начинающий создатель скриптов. Для создания стиля я использую что-то вроде

Код:
    try{ app.activeDocument.characterStyles.item("MyStyle").name;
        }catch (myError){ app.activeDocument.characterStyles.add({name:"MyStyle",
                          horizontalScale:myIndexHscale,verticalScale:myIndexVscale,
                          position:Position.NORMAL}); }

Скажите пожалуйста, можно ли отредактировать стили абзацев или символов (какой-то один параметр, не меняя остальных), используя скрипт? Вижу, что для создания используется add. А что нужно для редактирования стилей? И возможно ли оно скриптом?
 

Oleg Butrin

20 лет на форуме
Сообщения
1 989
Реакции
1 213
app.activeDocument.characterStyles.itemByName('MyStyle').position = Position.NORMAL;
 
  • Спасибо
Реакции: catpaw

catpaw

Топикстартер
12 лет на форуме
Сообщения
245
Реакции
10
Последнее редактирование:

Oleg Butrin

20 лет на форуме
Сообщения
1 989
Реакции
1 213
var style = app.activeDocument.characterStyles.itemByName('MyStyle'); style.position =...;
 
  • Спасибо
Реакции: catpaw

veretragna

γνώσις
Сообщения
578
Реакции
199
Скопировал из рабочего скрипта вот такой кусок.
Скрипт меняет размер шрифта глобально по стилям абзаца.
Может, пригодится.
JavaScript:
var ptSizeDiff = -0.5;

var myPgfStyles = app.activeDocument.allParagraphStyles; // включая стили в группах
for (var i = 1; i < myPgfStyles.length; i++) { // пропускаем нулевой стиль - при обращении вызывает ошибку
    var paraStyle = myPgfStyles[i];
   
    var parentStyle = paraStyle.basedOn;
    if (parentStyle.pointSize == paraStyle.pointSize)
        continue; // пропускаем стиль - у предка размер шрифта такой же
   
    var initialPtSize = paraStyle.pointSize;
    paraStyle.pointSize += ptSizeDiff;
   
    var initialLeading = paraStyle.leading;
    if (initialLeading != Leading.AUTO) {
        var myLeading = initialLeading * ((initialPtSize + ptSizeDiff)/initialPtSize); // заодно пропорционально подогнать интерлиньяж, если он не автоматический
        paraStyle.leading = myLeading.toFixed(1);
    }
}
 
  • Спасибо
Реакции: catpaw

catpaw

Топикстартер
12 лет на форуме
Сообщения
245
Реакции
10
Скопировал из рабочего скрипта вот такой кусок.
Скрипт меняет размер шрифта глобально по стилям абзаца.
Может, пригодится.
JavaScript:
var ptSizeDiff = -0.5;

var myPgfStyles = app.activeDocument.allParagraphStyles; // включая стили в группах
for (var i = 1; i < myPgfStyles.length; i++) { // пропускаем нулевой стиль - при обращении вызывает ошибку
    var paraStyle = myPgfStyles[i];
  
    var parentStyle = paraStyle.basedOn;
    if (parentStyle.pointSize == paraStyle.pointSize)
        continue; // пропускаем стиль - у предка размер шрифта такой же
  
    var initialPtSize = paraStyle.pointSize;
    paraStyle.pointSize += ptSizeDiff;
  
    var initialLeading = paraStyle.leading;
    if (initialLeading != Leading.AUTO) {
        var myLeading = initialLeading * ((initialPtSize + ptSizeDiff)/initialPtSize); // заодно пропорционально подогнать интерлиньяж, если он не автоматический
        paraStyle.leading = myLeading.toFixed(1);
    }
}
Спасибо за скрипт! Уже пытаюсь использовать. Но почему-то с заменой шрифта (причем только определенного) у меня не срабатывает.
Строка
Код:
    alert ("Applied Font "+paraStyle.appliedFont.name+"!")
выдает и шрифт и начертание причем в километре друг от друга "Имя начертание"
а просто appliedFont выдает объект
 

iv-mi

15 лет на форуме
Сообщения
563
Реакции
375
"километр" -- это табуляция. Между именем шрифта и начертанием есть код "\t"
 
  • Спасибо
Реакции: catpaw

veretragna

γνώσις
Сообщения
578
Реакции
199
Спасибо за скрипт! Уже пытаюсь использовать. Но почему-то с заменой шрифта (причем только определенного) у меня не срабатывает.
Строка
Код:
    alert ("Applied Font "+paraStyle.appliedFont.name+"!")
выдает и шрифт и начертание причем в километре друг от друга "Имя начертание"
а просто appliedFont выдает объект
Между именем и начертанием шрифта расположен табулятор, как сказал уважаемый iv-mi.
По этому табу можно отделить название от начертания и проверить их по-всякому.

А чтобы абзацу или стилю абзаца присвоить шрифт и начертание, нужно сделать примерно так:
JavaScript:
paraStyle.appliedFont = "Calibri";
paraStyle.fontStyle = "Regular";
 
  • Спасибо
Реакции: catpaw

catpaw

Топикстартер
12 лет на форуме
Сообщения
245
Реакции
10
Между именем и начертанием шрифта расположен табулятор, как сказал уважаемый iv-mi.
По этому табу можно отделить название от начертания и проверить их по-всякому.

А чтобы абзацу или стилю абзаца присвоить шрифт и начертание, нужно сделать примерно так:
JavaScript:
paraStyle.appliedFont = "Calibri";
paraStyle.fontStyle = "Regular";
Да! Но как скрипту найти стиль с тем шрифтом, который нужно исправить? Не перебирать же все начертания...
 

veretragna

γνώσις
Сообщения
578
Реакции
199
Да! Но как скрипту найти стиль с тем шрифтом, который нужно исправить? Не перебирать же все начертания...
Примерно вот так. Этот кусок точно работает, проверено.
Нужно перебрать не все начертания, а все стили
JavaScript:
var myPgfStyles = doc.allParagraphStyles;
for (var i = 1; i < myPgfStyles.length; i++) {
    var paraStyle = myPgfStyles[i];
    var paraFontFamily = paraStyle.appliedFont.fontFamily;
    var paraFontStyle = paraStyle.appliedFont.fontStyleName;
    if (paraFontFamily == "Lucida Console" && paraFontStyle == "Regular") {
        paraStyle.appliedFont = "Calibri";
        paraStyle.fontStyle = "Regular";
    }
}
Если начертание менять не нужно, просто уберите строки с paraFontStyle, будет работать только с семейством.
 
Последнее редактирование:
  • Спасибо
Реакции: catpaw

catpaw

Топикстартер
12 лет на форуме
Сообщения
245
Реакции
10
Примерно вот так. Этот кусок точно работает, проверено.
Нужно перебрать не все начертания, а все стили
JavaScript:
var myPgfStyles = doc.allParagraphStyles;
for (var i = 1; i < myPgfStyles.length; i++) {
    var paraStyle = myPgfStyles[i];
    var paraFontFamily = paraStyle.appliedFont.fontFamily;
    var paraFontStyle = paraStyle.appliedFont.fontStyleName;
    if (paraFontFamily == "Lucida Console" && paraFontStyle == "Regular") {
        paraStyle.appliedFont = "Calibri";
        paraStyle.fontStyle = "Regular";
    }
}
Если начертание менять не нужно, просто уберите строки с paraFontStyle, будет работать только с семейством.
Я не знала слов fontFamily с сотоварищи! Теперь получилось! 'thank'
 

veretragna

γνώσις
Сообщения
578
Реакции
199
Я не знала слов fontFamily с сотоварищи! Теперь получилось! 'thank'
Установите себе ExtendScript Toolkit CC и пользуйтесь инструментом Help - Object model viewer.
Если выбрать в выпадающем меню объектную модель индизайна, можно тщательно рассмотреть все потроха любого его класса, будь то ParagraphStyle или Document.
 
  • Спасибо
Реакции: catpaw и Skvoznyak

catpaw

Топикстартер
12 лет на форуме
Сообщения
245
Реакции
10
Установите себе ExtendScript Toolkit CC и пользуйтесь инструментом Help - Object model viewer.
Если выбрать в выпадающем меню объектную модель индизайна, можно тщательно рассмотреть все потроха любого его класса, будь то ParagraphStyle или Document.
Самое удивительное, что я все статьи себе накопировала и по абзацу и по знаку, но именно этих слов там нет...по прямой связи. Эти слова в хелпе относятся к Font и(!) Watermark, так что не всегда F1, тем более новичкам, :( помогает... Надо знать как цепочки, хоть и очевидные, выстраивать.