[AI CS4-CS6] Вызвать из скрипта эффект с параметрами

  • Автор темы Автор темы Oleg Butrin
  • Дата начала Дата начала

Oleg Butrin

Топикстартер
20 лет на форуме
Сообщения
1 993
Реакции
1 224
Нужно применить к объекту эффект (фактически, любой) из списка Distort & Transform. Из скрипта можно вызвать диалоговое окно эффекта через executeMenuCommand. Но надо задать параметры и применить, а тут нет очевидного пути.
Что характерно, через Action тоже не задаются параметры, или я что-то туплю?
 
надо из скрипта вызывать экшн и внимательно смотреть как туда передаются параметры.
Самый сок в том, что в Action тоже можно только открыть окно эффекта. Но не передать параметры.
Нашел более другой подход. Если получится -- опишу позже.
 
Roughen его фамилия.
 
надо задать параметры и применить, а тут нет очевидного пути
Используйте динамический (временный) стиль. Принцип такой же, как с (динамически создаваемой) action. Сначала применение нужного эффекта записать в файл, в данном случае styles library, распатронить, изучить, необходимое и достаточное хранить в теле скрипта как темплейт. К сожалению, мне не удалось импортировать стиль из библиотеки, открываемой как "библиотека". Поэтому реализация еще более ужас-ужас-ужас, чем это звучит выше, с копи-пастом между документами, hairy "Illustrator scripting", FWIW:
Код:
// An Illustrator CS6 JavaScript

( function main() {
   
if ( !app.selection || app.selection.length !== 1 ) return;

var doc  = app.activeDocument;
var item = doc.selection[ 0 ];

var name = inject_dummy_roughen_style({
    size        : 25,
    detail      : 25,
    is_smooth   : 0,
    is_absolute : 0,
});

doc.activate();
app.paste();
app.cut();

item.selected = true;
var style = doc.graphicStyles.getByName( name );
style.mergeTo( item );
style.remove();
return;

function inject_dummy_roughen_style( options_obj ) {
    if ( typeof( options_obj ) !== 'object' ) options_obj = {};

    if ( !options_obj.size      ) options_obj.size      = 5;
    if ( !options_obj.detail    ) options_obj.detail    = 10;
    if ( !options_obj.is_abs    ) options_obj.is_abs    = 0;
    if ( !options_obj.is_smooth ) options_obj.is_smooth = 0;
   
    var name = '~/' + ( new Date()).getTime();
    var str  = '%!PS-Adobe-3.0\
%%Creator: Adobe Illustrator(R) 16.0\
%%BoundingBox: 0 0 0 0\
%%EndComments\
%%BeginProlog\
%%EndProlog\
%%BeginSetup\
%AI9_BeginArtStyles\
/KnownStyle :\
('+ name + ') /Name ,\
/ActiveStyle :\
/CompoundFilter :\
(Chain Style Filter) 0 0 /Filter ,\
1 /Visible ,\
/BasicFilter :\
(Adobe Roughen) 1 0 /Filter ,\
1 /Visible ,\
(Roughen.aip) /PluginFileName ,\
(Roughen) /Title ,\
/Dictionary : /NotRecorded ,\
' + options_obj.is_smooth      + ' /Real (roundness) ,\
' + options_obj.size           + ' /Real (size) ,\
' + options_obj.detail         + ' /Real (dtal) ,\
5 /Real (asiz) ,\
' + options_obj.is_absolute    + ' /Real (absoluteness) ,\
; /Dict ;\
 /Part ,\
/CompoundFilter :\
(Stack Style Filter) 0 0 /Filter ,\
1 /Visible ,\
/BasicFilter :\
(Stroke Style Filter) 0 0 /Filter ,\
1 /Visible ,\
2 /FillOrStroke ,\
/Dictionary : /NotRecorded ,\
/StrokeStyle : 0 1 0 0 0 Xy\
0 J 0 j 1 w 10 M []0 d 0 XR\
0 0 Xd\
/Def ; \
 (StrokeStyle) ,\
; /Dict ;\
 /Part ,\
/BasicFilter :\
(Conduit Filter) 0 0 /Filter ,\
1 /Visible ,\
;\
 /Part ,\
/BasicFilter :\
(Fill Style Filter) 0 0 /Filter ,\
1 /Visible ,\
/Dictionary : /NotRecorded ,\
0 /Bool (UseEvenOdd) ,\
/FillStyle : 0 1 0 0 0 Xy\
0 J 0 j 1 w 10 M []0 d 0 XR\
0 0 Xd\
/Def ; \
 (FillStyle) ,\
; /Dict ;\
 /Part ,\
;\
 /Part ,\
/BasicFilter :\
(Blend Style Filter) 0 0 /Filter ,\
1 /Visible ,\
/Dictionary : /NotRecorded ,\
/BlendStyle : 0 1 0 0 0 Xy\
0 J 0 j 1 w 10 M []0 d 0 XR\
/Def ;\
 (BlendStyle) ,\
; /Dict ;\
 /Part ,\
;\
\
/Execution ;\
 /Def ;\
%AI9_EndArtStyles\
%AI9_BeginArtStyleList\
(' + name + ')\
%AI9_EndArtStyleList\
%%EndSetup\
%%Trailer\
%%EOF\n';

    var f = new File( name );
    f.open( 'w' );
    f.write( str );
    f.close();

    var tmp   = app.open( f );
    var style = tmp.graphicStyles.getByName( name );
    var rect  = tmp.pathItems.rectangle( 0, 0, 1, 1 );
    style.applyTo( rect );
    rect.selected = true;
    app.cut();

    tmp.close( SaveOptions.DONOTSAVECHANGES );
    f.remove();

    return name;
}

})();
 
Поэтому реализация еще более ужас-ужас-ужас, чем это звучит выше, с копи-пастом между документами
По итогу получилось договориться вынести стили в отдельный документ и использовать, как шаблон. В документе набор path items по одному на каждый нужный стиль, все одновременно вставляются через копи-паст, занося именованные стили в нужный документ. Через астрал, конечно, но тоже работает. Плюс возможность редактировать и добавлять стили с эффектами.
 
  • Спасибо
Реакции: люди_будущего
Гениально!
Я не додумался до такого 'cooll)'':=)'
 

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

 
Парадоксальное устройство скриптовой модели Иллюстратора

Не по теме:
Хотел тебе возразить, но, думаю, ты и сам вспомнишь скриптовую модель Акробата.
По сравнению с ней иллюстраторовская - просто верх гармонии и совершенства ;)

 
Понятно, практически то же :). Кстати, у меня были идеи по поводу сравнения путей, но там вроде как завяло, "пусть вручную". "Отражение" сопровождается сменой полярности. Скорее всего, изучаемые пути закручены одинаково или непредсказуемо, но вдруг. Далее, составной путь, образованный двумя путями (ну или всеми под-путями если экспонаты сами являются compound) с правилом even-odd, будет иметь нулевую площадь при точном совпадении "экспонатов". Чем больше несовпадение, тем она больше. Для ответа "да-нет", этого может быть достаточно. Площадь компаунда смотрим через объем помещающегося текста, для нормализованных габаритов (да, а вы как хотели, это Иллюстратор. Но способ работает.) Альтернативно, максимальную ширину компаунда смотрим через успех-неуспех операции path offset с отрицательным параметром. Черновик кода имеется, но неясно, насколько нужно.
 

Не по теме:
Хотел тебе возразить, но, думаю, ты и сам вспомнишь скриптовую модель Акробата.
Когда пишешь скрипт для Акробата, сразу понимаешь, что ты попал в лапы суровой бюрократической машине: тебе почти ничего нельзя, а любой действие будет сопровождаться обходом всех причастных сущностей.
А вот Иллюстратор -- он не такой. Гипотетически, сделать можно почти все, что нужно, но такими неожиданными и окольными путями, что порой сомневаешься в собственном здравомыслии. Даже Фрейммейкер не столь разухабист.

 
"Отражение" сопровождается сменой полярности.
Там было все вообще не так просто. Контрольные пути проходили трансформацию в сторонней программе, которая генерит pdf самостоятельно, иногда парадоксально и непредсказуемо менялись. Сравнивать их нужно было с обычными путями, которые не подвергались издевательству.
По итогу я нашел, как из скрипта использовать Pathfinder, что позволило сравнить площадь сложенных путей (предварительно сдублированных). Где площадь больше -- тот путь и "отраженный".