[AI CC-CC2021] Покрасить текст с мульти-заливками

Gad

Сообщения
2 971
Реакции
1 405
Это технический скрипт - сначала отдельный скрипт мне рисует цветные полоски из макета по размеру каждой краски, потом делаю уголки, микроточки. И чтобы покрасить тех. метки, выделяю их по очереди и нужные цветные полоски, запускаю скрипт, получаю мульти-обводки - это для наглядности, удобно в Appearance смотреть.
Я не сильно понял смысл того что Вы делаете, но если верно понял результат, то действительно самый оптимальный/универсальный способ через графические стили. Сделать функцию, которая пройдется по всем выделенным объектам, создаст для каждого свой стиль и вернет массив этих стилей. Потом пройтись по массиву стилей, по очереди назначить их заданному объекту/занести в Appearance. Тогда не важно текст это или еще что, заодно толщина обводки сохранится ... если это нужно :)
Ответ как создать стили дан в вашем вопросе :)
Тогда не будет спрашивать имя, а скриптом потом переименовать как хочется :)
Вам просто нужно
создать Франкенштейна
:)
 

Gad

Сообщения
2 971
Реакции
1 405
А вот в этом месте не понял логики
Для стилей пришлось бы создавать временный объект и удалять его после передачи стиля тексту.
Задача взять у выделенных объектов краски и впихнуть их в один из выделенных объектов.
Вы же все равно "проходитесь" по всем объектам получая цвета, так и создавайте сразу стили, потом грохнуть после добавления в Appearance ...
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 138
Реакции
10 835
Вот этот момент самый непонятный
Но хотел красить напрямую без стилей, как это делаю с path.
Как именно можно покрасить без стилей мультизаливками path, но нельзя текст?
Можете пример привести, потому как мы запутались окончательно?
 

Gad

Сообщения
2 971
Реакции
1 405
Как именно можно покрасить без стилей мультизаливками path, но нельзя текст?
Ну тут я как раз разобрался :) Проблема в том, что выделяется то фрейм, а свойства цвета для того чтобы покрасить текст фрейма в скрипте нет. Это можно обойти, но опять таки методом Франкенштейна через экшен и swatches, потому и написал что стилями самый универсальный метод, подходит для всего и меньше мороки.
А мультизаливки (как бы это правильно ни называлось... :) ) он делает так:
Красит path потом executeMenuCommand("Adobe New Fill Shortcut"); и в аппиренсе дублируется текущая заливка, потом красит в другой.
 
Последнее редактирование:

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 138
Реакции
10 835

Gad

Сообщения
2 971
Реакции
1 405

Станислав Хоффман

Участник
Топикстартер
Сообщения
277
Реакции
23
Я должен уточнить на счёт стилей. Я привык называть стилями только то, что занесено в окно "Graphic Styles". Всё, что в Appearance, я стилем до этого момента не считал, хотя это тоже стиль объекта.
Вот наглядный кусок скрипта, который показывает, что path обрабатывается мульти-заливками, а текст нет.
Нарисуйте простой прямоугольник с заливкой Cyan 100% и такой же текст - с заливкой в Appearance, скрипт покажет на тексте заливку "undefined", т.е скрипт не имеет доступа к заливке текста напрямую без textrange.
JavaScript:
var doc = app.activeDocument;   
var sel = doc.selection; 
 
//alert ( doc.pageItems[0].fillColor );

alert ( "fill color:  " + sel[0].fillColor );

executeMenuCommand("Adobe New Fill Shortcut");  //  добавить мульти заливку

sel[0].fillColor.cyan = 40 ;

redraw();  //  без обновления New Fill не работает

executeMenuCommand("Adobe New Fill Shortcut");  //  добавить мульти заливку

sel[0].fillColor.cyan = 80 ;
 

Gad

Сообщения
2 971
Реакции
1 405
Короче :)
функция, которая пройдется по всем выделенным объектам, создаст для каждого свой стиль и вернет массив этих стилей
Такое Вам подойдет?:) Я Вам её сделаю, но попрошу видео конечного итога с пояснениями что зачем и почему :) Идет?
 
Последнее редактирование:

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 138
Реакции
10 835
Я тоже сразу прочитал эту фразу, не думайте.
Ответ адресовался Гаду на процитированный текст.
Однако это никак не проясняет ваш вопрос, более того, выглядит каким то странным капризом - мол ни один из прямых способов решнния задачи мне по (каким то неведомым религиозным соображениям) не подходит, хочу совсем странного неизведанного
 

Станислав Хоффман

Участник
Топикстартер
Сообщения
277
Реакции
23
вот скрипт с созданием нового стиля через action - он каждый раз запрашивает имя... по-моему, от этого не избавиться.
Код:
app.userInteractionLevel = UserInteractionLevel.DONTDISPLAYALERTS;

addSwatchSel()
//  5f74656d70 - _temp
//  4e6577205374796c65 - New Style
//  47726170686963205374796c6573 - Graphic Styles
//  4e65772047726170686963205374796c65 - New Graphic Style

function addSwatchSel(){
    var ActionString = [

'/version 3',
'/name [ 5',
'    5f74656d70',
']',
'/isOpen 1',
'/actionCount 1',
'/action-1 {',
'    /name [ 9',
'        4e6577205374796c65',
'    ]',
'    /keyIndex 0',
'    /colorIndex 0',
'    /isOpen 1',
'    /eventCount 1',
'    /event-1 {',
'        /useRulersIn1stQuadrant 0',
'        /internalName (ai_plugin_styles)',
'        /localizedName [ 14',
'            47726170686963205374796c6573',
'        ]',
'        /isOpen 1',
'        /isOn 1',
'        /hasDialog 1',
'        /showDialog 1',
'        /parameterCount 1',
'        /parameter-1 {',
'            /key 1835363957',
'            /showInPalette -1',
'            /type (enumerated)',
'            /name [ 17',
'                4e65772047726170686963205374796c65',
'            ]',
'            /value 1',
'        }',
'    }',
'}'
].join('\n');
    createAction(ActionString);   
    var ActionString = null;
    //                         имя стиля,  имя сета
    app.doScript("New Style", "_temp", false);
    app.unloadAction("_temp","");  // удаляем action
 
}

function createAction (str) {   
        var f = new File('~/Tracer.aia');   
        f.open('w');   
        f.write(str);   
        f.close();   
        app.loadAction(f);   
        f.remove();   
    }
function readFile (_file) {   
       _file.open('r');
        var _arrStr=_file.read();   
        _file.close();   
        return _arrStr
    }


app.userInteractionLevel = UserInteractionLevel.DISPLAYALERTS;
 

Gad

Сообщения
2 971
Реакции
1 405
Ответ адресовался Гаду на процитированный текст.
Я наверное неверно выразился... я имел в виду атрибут цвета для фрейма в апперансе который влияет на цвет всего текста
 

Станислав Хоффман

Участник
Топикстартер
Сообщения
277
Реакции
23
Короче :)

Такое Вам подойдет?:) Я Вам её сделаю, но попрошу видео конечного итога с пояснениями что зачем и почему :) Идет?
конечный стиль нужен только один - составленный из нескольких стилей объектов...
 

Gad

Сообщения
2 971
Реакции
1 405
Хм... а так?

JavaScript:
function getGrStyles(arrObj, prefStyle) {
    var myGS = new Array;
    var Action = "AddGraphicStyle"
    var ActionSet = "ApperanceColorText"
    actionStr = ['/version 3',
        '/name [ 18',
        '    4170706572616e6365436f6c6f7254657874',
        ']',
        '/isOpen 1',
        '/actionCount 1',
        '/action-1 {',
        '    /name [ 15',
        '        416464477261706869635374796c65',
        '    ]',
        '    /keyIndex 0',
        '    /colorIndex 0',
        '    /isOpen 0',
        '    /eventCount 1',
        '    /event-1 {',
        '        /useRulersIn1stQuadrant 0',
        '        /internalName (ai_plugin_styles)',
        '        /localizedName [ 14',
        '            47726170686963205374796c6573',
        '        ]',
        '        /isOpen 0',
        '        /isOn 1',
        '        /hasDialog 1',
        '        /showDialog 0',
        '        /parameterCount 1',
        '        /parameter-1 {',
        '            /key 1835363957',
        '            /showInPalette -1',
        '            /type (enumerated)',
        '            /name [ 17',
        '                4e65772047726170686963205374796c65',
        '            ]',
        '            /value 1',
        '        }',
        '    }',
        '}'].join('\n');
    var f = File(ActionSet + '.aia');
    f.open('w');
    f.write(actionStr);
    f.close();
    app.loadAction(f);
    f.remove();
for ( a = 0; a < arrObj.length; a++ ) {
    app.executeMenuCommand("deselectall")
    arrObj[a].selected = true;
    var GS = app.activeDocument.graphicStyles.length
    app.doScript(Action, ActionSet);
    redraw();
    myGS[a] = app.activeDocument.graphicStyles[GS]
    sn = prefStyle + (GS+1)
    myGS[a].name = sn;
};
app.unloadAction(ActionSet,'');
return myGS;
};
Функции передается массив объектов и префикс для названия стиля.
 

Станислав Хоффман

Участник
Топикстартер
Сообщения
277
Реакции
23
Я тоже сразу прочитал эту фразу, не думайте.
Ответ адресовался Гаду на процитированный текст.
Однако это никак не проясняет ваш вопрос, более того, выглядит каким то странным капризом - мол ни один из прямых способов решнния задачи мне по (каким то неведомым религиозным соображениям) не подходит, хочу совсем странного неизведанного
прямых способов всего два: создать заливки напрямую, что невозможно и создать стиль - там окно запроса имени... ну да, такое не устраивает.
 

Gad

Сообщения
2 971
Реакции
1 405
конечный стиль нужен только один - составленный из нескольких стилей объектов...
Так функция возвращает массив стилей, которые можно по очереди добавить в апперанс любому объекту, потом грохнуть их и создать этой же функцией новый на основе этого объекта ...
 
Последнее редактирование:

Станислав Хоффман

Участник
Топикстартер
Сообщения
277
Реакции
23
тут showDialog 0 поставьте
Удивительное дело, позавчера тестировал showDialog 0 - не работало. И сегодня днём не работало, а вечером заработало.

Ув. Gad, спасибо за скрипт. Он очень помог с именами стилей, хоть у меня и не заработал, выдал ошибку "the file is not compatible". Починил, взяв кусок из др. скрипта. Вот мой готовый скрипт с мульти-заливками текста из выделенных объектов. Работает относительно медленно, для ускорения можно создать прямоугольник с мульти-заливками и из него один раз перенести стиль на текст, а пока так:
JavaScript:
//  взять цвета с выделенных объектов для покраски текста через стили,
//  текст также должен быть выделен.

var doc = app.activeDocument;
var sel = doc.selection;
var myGS = new Array;
var count = 0;

for ( i = 0; i < sel.length; i++ ) 
{
if ( sel[ i ].typename == "TextFrame"  )   {    var temp = sel[ i ];  temp.selected = false;  sel = doc.selection;  }  //  turn off text from sel
else {    count = count + 1 ;  };
}
//                  objects, graphic style's unique names
getGrStyles ( sel, "_temp - " + i );  //  add new styles by selection

doc.selection = null;
temp.selected = true;

sel = doc.selection

sel [ 0 ].textRange.characterAttributes.fillColor = new NoColor() ;

for ( i = 0; i < count ; i++ )
{
doc.graphicStyles[ doc.graphicStyles.length - count + i ].mergeTo( sel [ 0 ] );
doc.graphicStyles[ doc.graphicStyles.length - count + i ].remove();
}

//alert ( myGS );

function getGrStyles(arrObj, prefStyle) {

    var Action = "AddGraphicStyle"
    var ActionSet = "ApperanceColorText"

    var actionStr = ['/version 3',
        '/name [ 18',
        '    4170706572616e6365436f6c6f7254657874',
        ']',
        '/isOpen 1',
        '/actionCount 1',
        '/action-1 {',
        '    /name [ 15',
        '        416464477261706869635374796c65',
        '    ]',
        '    /keyIndex 0',
        '    /colorIndex 0',
        '    /isOpen 0',
        '    /eventCount 1',
        '    /event-1 {',
        '        /useRulersIn1stQuadrant 0',
        '        /internalName (ai_plugin_styles)',
        '        /localizedName [ 14',
        '            47726170686963205374796c6573',
        '        ]',
        '        /isOpen 0',
        '        /isOn 1',
        '        /hasDialog 1',
        '        /showDialog 0',  //  turn dialog off
        '        /parameterCount 1',
        '        /parameter-1 {',
        '            /key 1835363957',
        '            /showInPalette -1',
        '            /type (enumerated)',
        '            /name [ 17',
        '                4e65772047726170686963205374796c65',
        '            ]',
        '            /value 1',
        '        }',
        '    }',
        '}'].join('\n');

createAction ( actionStr ) ;

function createAction (str) {   
        var f = new File('~/Tracer.aia');   
        f.open('w');   
        f.write(str);   
        f.close();   
        app.loadAction(f);   
        f.remove();   
    }
    
    for ( a = 0; a < arrObj.length; a++ )
    {
    app.executeMenuCommand("deselectall");
    arrObj[a].selected = true;
    var GS = app.activeDocument.graphicStyles.length;
    app.doScript(Action, ActionSet);
    redraw();
    myGS[a] = app.activeDocument.graphicStyles[GS];
    sn = prefStyle + (GS+1);
    myGS[a].name = sn;
    };

app.unloadAction(ActionSet,'');

return myGS;
};
 
  • Спасибо
Реакции: ITIT

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 138
Реакции
10 835