[AI CC-CC2021] Скрипт Unclipping Mask.

У

Удалённый пользователь 513

Гость

Не по теме:
Скрипт будет крайне не полезен для файлов импортированных из других приложений, например Corel Draw, когда в clipping mask лежит единственный объект - прямоугольник с градиентной заливкой.
Такие ситуации возникают редко, но всё-же хочется увидеть/написать скрипт который: создает массив объектов с clipping mask для работы цикла, и по циклу: если в clipping mask содержится единственный объект, то запоминает его параметры заливки, удаляет его, и к clipping mask, которая уже не clipping mask применяет эту заливку.

 

romaya

Топикстартер
10 лет на форуме
Сообщения
317
Реакции
40

Не по теме:
Скрипт будет крайне не полезен для файлов импортированных из других приложений, например Corel Draw, когда в clipping mask лежит единственный объект - прямоугольник с градиентной заливкой.
Такие ситуации возникают редко, но всё-же хочется увидеть/написать скрипт который: создает массив объектов с clipping mask для работы цикла, и по циклу: если в clipping mask содержится единственный объект, то запоминает его параметры заливки, удаляет его, и к clipping mask, которая уже не clipping mask применяет эту заливку.

Выложите файл/файлы для тестирования, попробую и такой скрипт написать.
 

romaya

Топикстартер
10 лет на форуме
Сообщения
317
Реакции
40
Кстати, я решил поменять название скрипта на более соответствующее его функционалу. Возможно зря я это сделал. Скрипт теперь называется Expand Clipping Mask. Хотя ссылка на ресурс осталась прежней и по ней доступно оба варианта с разными названиями, но одинаковым функционалом.
 

romaya

Топикстартер
10 лет на форуме
Сообщения
317
Реакции
40

Не по теме:
Скрипт будет крайне не полезен для файлов импортированных из других приложений, например Corel Draw, когда в clipping mask лежит единственный объект - прямоугольник с градиентной заливкой.
Такие ситуации возникают редко, но всё-же хочется увидеть/написать скрипт который: создает массив объектов с clipping mask для работы цикла, и по циклу: если в clipping mask содержится единственный объект, то запоминает его параметры заливки, удаляет его, и к clipping mask, которая уже не clipping mask применяет эту заливку.


Ну написал. Правда, с использованием action. В общем, перед запуском скрипта нужно будет создать экшен New Graphic Style в наборе My Actions. В экшене запишите только одно действие, как вы нажимаете на пиктограмму New Graphic Style в палитре Graphic Styles. Затем удалите все стили из этой палитры, оставив только [Default]. Теперь можно приступать. Выделяете все и запускаете Expand Clipping Mask (экс-Unclipping Mask), который разберет "самую большую" маску. Затем выполняете код, приведенный ниже:
JavaScript:
var doc = app.activeDocument;
app.executeMenuCommand('deselectall');
for (var i = 0; i < doc.pageItems.length; i++) {
    if (doc.pageItems[i].typename == 'GroupItem' && doc.pageItems[i].clipped == true) {
        if (doc.pageItems[i].pageItems.length == 2) {
            var clipPath = doc.pageItems[i].pageItems[0];
            var clipContent = doc.pageItems[i].pageItems[1];
            clipContent.selected = true;
            app.doScript('New Graphic Style', 'My Actions');
            doc.graphicStyles[1].applyTo(clipPath);
            doc.graphicStyles[1].remove();
            doc.pageItems[i].selected = true;
            app.executeMenuCommand('releaseMask');
            clipContent.remove();
            app.executeMenuCommand('deselectall');
            }
      }
};
alert ('Is done!');

И будет вам щастье!
 
Последнее редактирование:

romaya

Топикстартер
10 лет на форуме
Сообщения
317
Реакции
40
Не обработанными остались только маски, содержимое которых больше или меньше одного элемента. Таких масок две штуки. Но это можно и руками сделать. :)
 

romaya

Топикстартер
10 лет на форуме
Сообщения
317
Реакции
40
Если что, могу в ресурсы потом выложить. Надо только над названием скрипта подумать хорошенько, чтобы не повторять своих собственных ошибок. '))'
 

romaya

Топикстартер
10 лет на форуме
Сообщения
317
Реакции
40
Не обработанными остались только маски, содержимое которых больше или меньше одного элемента. Таких масок две штуки. Но это можно и руками сделать. :)
Хотя зачем руками - есть же Expand Clipping Mask (экс-Unclipping Mask) ;)
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 195
Реакции
10 846
Ну написал. Правда, с использованием action. В общем, перед запуском скрипта нужно будет создать экшен New Graphic Style в наборе My Actions. В экшене запишите только одно действие, как вы нажимаете на пиктограмму New Graphic Style в палитре Graphic Styles. Затем удалите все стили из этой палитры, оставив только [Default]. Теперь можно приступать. Выделяете все и запускаете Expand Clipping Mask (экс-Unclipping Mask), который разберет "самую большую" маску. Затем выполняете код, приведенный ниже:
JavaScript:
var doc = app.activeDocument;
app.executeMenuCommand('deselectall');
for (var i = 0; i < doc.pageItems.length; i++) {
    if (doc.pageItems[i].typename == 'GroupItem' && doc.pageItems[i].clipped == true) {
        if (doc.pageItems[i].pageItems.length == 2) {
            var clipPath = doc.pageItems[i].pageItems[0];
            var clipContent = doc.pageItems[i].pageItems[1];
            clipContent.selected = true;
            app.doScript('New Graphic Style', 'My Actions');
            doc.graphicStyles[1].applyTo(clipPath);
            doc.graphicStyles[1].remove();
            doc.pageItems[i].selected = true;
            app.executeMenuCommand('releaseMask');
            clipContent.remove();
            app.executeMenuCommand('deselectall');
            }
      }
};
alert ('Is done!');

И будет вам щастье!
А почему не хотите экшн на лету генерить из скрипта а на пользователей сваливаете? Нехорошо.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 195
Реакции
10 846
Я с утюга, погуглите по форуму полно ж примеров приводили.
 

romaya

Топикстартер
10 лет на форуме
Сообщения
317
Реакции
40
Другой недостаток приведенного выше кода, я вижу в том, что он не универсальный. В нем (скрипте) делается допущение, что контур маски будет первым элементом в группе-маске, а жизни так бывает не всегда. Особенно при импорте из сторонних программ. Это, конечно, тоже поправимо. Если возникнет острая необходимость - могу и это допилить. Заодно и экшн на лету генерить из скрипта можно заколбасить. Мотивации $ только не хватает.
 
Последнее редактирование:

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 195
Реакции
10 846
  • Спасибо
Реакции: romaya

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 195
Реакции
10 846
В принципе понятно. Интересно, а где временный файл с экшеном создается в таком случае? var f = new File('~/_ttt.aia');
Что это значит? ~/
Как раз так делать нельзя - на актуальных версиях винды каталог запросто может быть заблокирован для записи. Нельзя и в каталоге скрипта, поскольку очень часто многим хочется скрипт поместить в иллюстраторовская папку, дабы он в файловом меню автоматически отображался, да и со scriptbay проблемы будут. Правильнее всего, наверное, или в папку документа писать (если он сохранен) или во временную папку иллюстратора.
 

romaya

Топикстартер
10 лет на форуме
Сообщения
317
Реакции
40
Что-то типа того? Или я ошибаюсь, путая temp c backup data? Путь то у разных версий разный...

C:\Users\[username]\AppData\Roaming\Adobe\Adobe Illustrator 19 Settings\en_US\x64\DataRecovery

Может лучше ("правильней") как-то так?

C:\Windows\Temp
 
Последнее редактирование:

Oleg Butrin

20 лет на форуме
Сообщения
1 990
Реакции
1 213
Тильда в пути файла означает папку пользователя. Как правило, туда запись открыта.
 
  • Спасибо
Реакции: romaya

_MBK_

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