[AI CS4-CS6] Управление градиентом на JavaScript

Статус
Закрыто для дальнейших ответов.

Bigroom

Участник
Топикстартер
Сообщения
26
Реакции
3
По коду, то если быть точнее, в случае явного указания типа градиента, создается градиент с настройками последнего выделенного градиента (в моем случае он был радиальным). Не взирая на тип, который я указываю, создается именно такой же градиент, который был выделен последний раз. Если не указывать тип, создается градиент по умолчанию.

Что касается задачи, то Вы не правильно поняли. Это все нужно для микростоков. Микростоки принимают векторные изображения в формате EPS 10/8. С версии Иллюстратора CS4 существует некий баг: когда сохраняешь файл в формате EPS 10/8, то все радиальные градиенты с эксцентриситетом отличным от нуля экспандятся в набор однотонно окрашенных объектов (как будто созданных Блендом). Если же в градиентах еще и использовалась прозрачность отдельных цветов, то они превращаются в растр.
С прозрачностью ничего не поделать, а вот с багом эллиптичности можно справиться одним хитрым способом, на который я наткнулся здесь: Чтобы избежать растрирования или разбиения радиальных градиентов, используйте мэши

Смысл скрипта в следующем. Допустим имеется квадрат, окрашенный эллиптическим градиентом для эффекта тени. Аспект рэтио градиента 50%. Скрипт окрашивает данный квадрат однотонно, а поверх него создает окружность, и заливает ее стандартным радиальным градиентом. После этого окружность трансформируется так, чтобы она по форме и расположению полностью совпала с первоначальным эллиптическим градиентом. При этом, скорее всего по причине бага, градиент растягивается по форме трансформируемого объекта, и принимает форму эллипса, но Аспект рэтио в его настройках остается 100%. Дальше скрипт создает такое же количество цветовых переходов, и копирует все настройки цветовых переходов из первоначального градиента в новосозданный (если просто скопировать цветовые переходы прямо, то Аспект ретио меняется). И напоследок эллипс с градиентом обрезается маской по форме квадрата. Получается группа из трех объектов, по виду абсолютно идентична первоначальному квадрату. И отлично преобразовывается в формат EPS. Также отлично переводится в мэш, чего нельзя было добиться с первоначальным квадратом (скорее всего из-за багов, оговоренных нами вчера).
Это все игра с багами. Данные градиенты нормально сохраняются в формате EPS, но если сохранить их в AI, закрыть файл, и вновь открыть - их внешний вид изменится до неузнаваемости.
Из-за бага люди, работающие с микростоками, избегают использования эллиптических градиентов, что приводит к повышенной примитивности рисунков. Но я этот баг победил при помощи другого бага. Так что баг багу рознь))
 

Skvoznyak

15 лет на форуме
Сообщения
5 500
Реакции
2 168
mygrad.GradientStops = activeDocument.Selection[0].fillColor.GradientStops;

Подскажите, что я делаю не правильно ?

с маленькой буквы для начала надо:
mygrad.gradientStops = activeDocument.selection[0].fillColor.gradientStops;

затем, у GradientColor нет свойств gradientStops и type - они глубже

fillColor.gradient.gradientStops
fillColor.gradient.type

я правда 19 Ill смотрю, но не думаю что это менялось
 
  • Спасибо
Реакции: Flame

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 235
Реакции
10 852
По коду, то если быть точнее, в случае явного указания типа градиента, создается градиент с настройками последнего выделенного градиента (в моем случае он был радиальным). Не взирая на тип, который я указываю, создается именно такой же градиент, который был выделен последний раз. Если не указывать тип, создается градиент по умолчанию.
Бррр
Вы точно мой процитированный кусок кода пробовали? В моем CS6 все создается правильно, какой укажешь тип. Версия 16.0.0 32 бит нелокализованная 'hmmm'
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 235
Реакции
10 852
При этом, скорее всего по причине бага, градиент растягивается по форме трансформируемого объекта, и принимает форму эллипса, но Аспект рэтио в его настройках остается 100%.
Этот момент тоже поподробнее - вы при resize ставите флажок changeFillGradients=false, но у вас градиент все равно меняется?
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 235
Реакции
10 852
С версии Иллюстратора CS4 существует некий баг: когда сохраняешь файл в формате EPS 10/8, то все радиальные градиенты с эксцентриситетом отличным от нуля экспандятся в набор однотонно окрашенных объектов (как будто созданных Блендом).
Попутно и этот момент проверил - создаю объект с радиальным градиентом, масштабирую со сменой пропорций, экспортирую в EPS десятой версии - все отлично, градиент остался правильным градиентом.
Меня начинают терзать смутные сомнения относительно вашей версии иллюстратора 'hmmm'
 

Bigroom

Участник
Топикстартер
Сообщения
26
Реакции
3
с маленькой буквы для начала надо:
mygrad.gradientStops = activeDocument.selection[0].fillColor.gradientStops;

затем, у GradientColor нет свойств gradientStops и type - они глубже

fillColor.gradient.gradientStops
fillColor.gradient.type

я правда 19 Ill смотрю, но не думаю что это менялось
Да, в коде была ошибка, я уже разобрался, но даже в случае правильного написания результат непредсказуем.

Бррр
Вы точно мой процитированный кусок кода пробовали? В моем CS6 все создается правильно, какой укажешь тип. Версия 16.0.0 32 бит нелокализованная 'hmmm'
Я пока еще не запускал Иллюстратор, но смотрю, что Ваш код по сути идентичен моему. У меня кстати версия Иллюстратора портабл. Если я указываю тип градиента еще до создания gradientColor и присвоения ему данного градиента, то результат такой как я описал выше. Если же я создаю градиент без настроек, присваиваю его новосозданному gradientColor, а тип градиента и другие настройки изменяю уже постфактум, то все нормально.

Бррр
Вы точно мой процитированный кусок кода пробовали? В моем CS6 все создается правильно, какой укажешь тип. Версия 16.0.0 32 бит нелокализованная 'hmmm'
Попутно и этот момент проверил - создаю объект с радиальным градиентом, масштабирую со сменой пропорций, экспортирую в EPS десятой версии - все отлично, градиент остался правильным градиентом.
Меня начинают терзать смутные сомнения относительно вашей версии иллюстратора 'hmmm'

Здесь Вы не правильно поняли: если создать радиальный градиент, а потом при помощи инструмента Grfdient Tool изменить его форму, угол и т.д., тогда возникают проблемы с преобразованием в EPS. Если просто ресайзить объект с градиентом, то проблем нет. Попробуйте например изменить поле Aspect Ratio в настройках градиента, и проверить как он будет экспортирован в EPS 10
 
  • Спасибо
Реакции: _MBK_

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 235
Реакции
10 852
У меня кстати версия Иллюстратора портабл
Мои опасения были не беспочвенны
Меня начинают терзать смутные сомнения относительно вашей версии иллюстратора
Если вы невнимательно прочли правила форума, пока не закрыли тему, постараюсь успеть в двух словах: портабл=варез, работа с ним одно расстройство, и на форуме полный ахтунг, тема вот-вот будет РИПанута поэтому совет - срочно ищите нормальную версию и тогда вернемся к этому разговору. 'topic'
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 235
Реакции
10 852
Здесь Вы не правильно поняли: если создать радиальный градиент, а потом при помощи инструмента Grfdient Tool изменить его форму, угол и т.д., тогда возникают проблемы с преобразованием в EPS. Если просто ресайзить объект с градиентом, то проблем нет. Попробуйте например изменить поле Aspect Ratio в настройках градиента, и проверить как он будет экспортирован в EPS 10
Хотя, действительно, сейчас глянул, проблемы с совместимостью по градиентам с 10 версией EPS действительно есть и в рабочей версии CS6
 

Bigroom

Участник
Топикстартер
Сообщения
26
Реакции
3
Мои опасения были не беспочвенны

Если вы невнимательно прочли правила форума, пока не закрыли тему, постараюсь успеть в двух словах: портабл=варез, работа с ним одно расстройство, и на форуме полный ахтунг, тема вот-вот будет РИПанута поэтому совет - срочно ищите нормальную версию и тогда вернемся к этому разговору. 'topic'

Правила, хоть и не слишком внимательно, но все же пересмотрел во время регистрации. И ведь никакого вареза я не распространяю, не советую и даже не описываю. Само лишь упоминание, какой версией Иллюстратора я пользуюсь, не достаточное основание для обвинения в "варезе", полагаю. В любом случае, проблема решена.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 235
Реакции
10 852
Само лишь упоминание, какой версией Иллюстратора я пользуюсь, не достаточное основание для обвинения в "варезе", полагаю. В любом случае, проблема решена.
Оффтопом на этом форуме является обсуждение версий, явно позиционируемых как варезные.
А у вас именно такая версия, причем, вы сами убедились в ее проблемности - 90% ваших скриптовых багов отсутствуют в нормальном CS6, лично у меня получилось повторить только баг с некорректным экспортом в 10 EPS
 

Bigroom

Участник
Топикстартер
Сообщения
26
Реакции
3
Не совсем корректно, так как для чистоты эксперимента нужно полностью воссоздать ситуацию. Попробуйте сделать следующее: создайте любой контур, залейте его радиальным градиентом, внесите какие-нибудь изменения в градиент при помощи инструмента Gradient Tool, после этого, не снимая выделения с данного контура, запустите тот скрипт, с указанием линейного типа градиента. Если все сработает нормально, тогда сдаюсь.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 235
Реакции
10 852
Попробуйте сделать следующее: создайте любой контур, залейте его радиальным градиентом, внесите какие-нибудь изменения в градиент при помощи инструмента Gradient Tool, после этого, не снимая выделения с данного контура, запустите тот скрипт, с указанием линейного типа градиента. Если все сработает нормально, тогда сдаюсь.
Сдавайтесь!
upload_2016-6-28_18-5-4.png
 

Bigroom

Участник
Топикстартер
Сообщения
26
Реакции
3
а покажите ваш последний вариант
Только что попробовал выполнить следующее:
Код:
myellypse = activeDocument.activeLayer.pathItems.ellipse(100, 100, 200, 400);

mygrad = activeDocument.gradients.add();

mygrad.type = GradientType.LINEAR;

mygradc = new GradientColor();

mygradc.gradient = mygrad;

myellypse.fillColor = mygradc;


myellypse.fillColor.gradient.gradientStops = activeDocument.selection

[0].fillColor.gradient.gradientStops;
Никакого результата.
Хорошо, я тоже сейчас в новом документе проделал это, написал новый скрипт (в цитате выше), и у меня все получилось, тип изменился:
Безымянный.jpg
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 235
Реакции
10 852
Хорошо, я тоже сейчас в новом документе проделал это, написал новый скрипт (в цитате выше), и у меня все получилось, тип изменился:
Ну вот видите. Что изменилось?
 

Bigroom

Участник
Топикстартер
Сообщения
26
Реакции
3
Тип градиента изменился корректно, на линейный, как и указано в коде. Вчера у меня с этим были проблемы, никак не создавался стандартный черно-белый градиент, а постоянно повторялся последний выделенный.

Сейчас возник еще один вопрос: возможно ли сгруппировать несколько соседних объектов так, чтобы группа сразу расположилась на том же месте в палитре слоев ? Я пока лишь нашел, что создать группу можно так:

mygroup = activeDocument.groupItems.add();

Но она появляется в самом верху палитры слоев, и похоже нет простого способа передвинуть ее на нужное место... или я ошибаюсь ?
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 235
Реакции
10 852
Но она появляется в самом верху палитры слоев, и похоже нет простого способа передвинуть ее на нужное место... или я ошибаюсь ?
Конечно ошибаетесь
Есть очень хороший метод move
 

Bigroom

Участник
Топикстартер
Сообщения
26
Реакции
3
Но указать конкретную позицию, как я понимаю, нельзя, нужно циклом ее перемещать ?
 

_MBK_

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

Bigroom

Участник
Топикстартер
Сообщения
26
Реакции
3
Спасибо, я из скудного руководства от Adobe понял, что аргумент move - группа или слой, в который нужно поместить объект.

А есть ли возможность при помощи Javascript обрезать контуры по типу Pathfinder или Shape Builder Tool ?
 
Статус
Закрыто для дальнейших ответов.