Используйте сценарии!
Как ответили другие, вы должны использовать сценарии. Но некоторые из других решений здесь используют только RGB, тогда как мое использует цвета, которые вы выбираете из своего документа. Кроме того, некоторые решения не давали ровного цвета в точке закругления или имели слишком много и/или перекрывающихся остановок градиента, поэтому мой скрипт решает эти проблемы.
Чтобы использовать его, выберите 2 или более путей, заполненных цветами, предназначенными для градиента, а затем при появлении запроса введите количество повторений градиента.
Редактировать : сайт пасти не работает, поэтому я включил код ниже:
// select two paths, then run this script
if (app.activeDocument.selection.length < 2) {
alert("Please select two or more paths with fills.");
} else {
var cycles = Number(prompt ("Repeat the gradient how many times?")) || 5;
var myselection = app.activeDocument.selection;
var colors = [];
for (var i = 0; i < myselection.length; i++) {
var newColor = myselection[i].fillColor;
colors.push(newColor);
}
var stops = colors.length * cycles - 1; // “stops” does not include default 2 stops
var interval = 100 / (cycles * colors.length); // ... the distance between stops
var newGradient = app.activeDocument.gradients.add();
newGradient.type = GradientType.LINEAR; // asymmetric, for 3 or more colours
//newGradient.type = GradientType.RADIAL; // symetric, for 3 or more colours
// the default 2 gradient stops (at beginning and end)
// should be the same colour, so that the gradient smoothly wraps around:
newGradient.gradientStops[0].color = colors[0];
newGradient.gradientStops[1].color = colors[0];
// now add stops between beginning and end stops:
for ( i = 1; i <= stops; i++ ) {
var thisStop = newGradient.gradientStops.add();
thisStop.rampPoint = i * interval;
thisStop.color = colors[i % colors.length];
}
// to get a even result, the first and last rampPoints cannot be 0 and 100:
newGradient.gradientStops[0].rampPoint = 0.1;
newGradient.gradientStops[stops + 1].rampPoint = 99.9;
}
Пример 1: черно-белый, повторяется 6 раз, документ CMYK:
Пример 2: 3 цветовых градиента, 6 повторов:
Пример 3: документ RGB, 6 цветов, 20 повторений. Заметили, как закрашенные пути перекрываются? Этот порядок наложения (спереди назад) определяет порядок цветов в градиенте.
Изменение цветов в градиенте . Выберите контур с примененным градиентом, затем выберите всплывающее меню панели «Образцы» → «Добавить выбранные цвета». Новые глобальные образцы будут добавлены на панель образцов, и когда вы редактируете один из них, он обновляется везде, где появляется.
Вы можете добиться этого с помощью сценариев Illustrator. Проверка документации для CC15.3 в справочном PDF-файле JavaScript в разделе «Градиенты» на странице 68.
Создайте цвета:
// Create the colors
var startColor = new RGBColor();
startColor.red = 0;
startColor.green = 100;
startColor.blue = 255;
var middleColor = new RGBColor();
middleColor.red = 252;
middleColor.green = 238;
middleColor.blue = 33;
var endColor = new RGBColor();
endColor.red = 220;
endColor.green = 0;
endColor.blue = 100;
Создайте градиент:
var newGradient = app.activeDocument.gradients.add();
newGradient.name = "new_gradient_75097";
Создайте линейный градиент:
newGradient.type = GradientType.LINEAR;
или Создайте радиальный градиент:
newGradient.type = GradientType.RADIAL;
Там, где вы хотели бы построить несколько типов градиента, было бы в GradientStops
:
// Modify the first gradient stop
newGradient.gradientStops[0].rampPoint = 0
newGradient.gradientStops[0].midPoint = 20;
newGradient.gradientStops[0].color = startColor;
// Modify the middle gradient stop
newGradient.gradientStops.add();
// Modify the last gradient stop
newGradient.gradientStops[1].rampPoint = 70;
newGradient.gradientStops[1].midPoint = 80;
newGradient.gradientStops[1].color = endColor;
Приношу свои извинения, было отмечено, что я не полностью объяснил, как можно создать градиент n раз, поэтому я дополнительно изменил сценарий, включив подсказку и цикл.
Назовите количество раз:
var countgradient = Number(prompt ("Enter Gradient Count"));
Создайте цикл и далее добавьте количество градиентов:
for ( i =0; i < countgradient; i++ ) {
var origCount = newGradient.gradientStops.length;
var lastStop = newGradient.gradientStops[origCount-1];
var firstStop = newGradient.gradientStops.add();
firstStop.rampPoint = lastStop.rampPoint;
lastStop.rampPoint = lastStop.rampPoint - 1;
firstStop.color = endColor;
var secondStop = newGradient.gradientStops.add();
secondStop.rampPoint = lastStop.rampPoint;
lastStop.rampPoint = lastStop.rampPoint - 2;
secondStop.color = startColor;
}
Код выше смесь того, что на странице 65-71 по ссылке вверху:
Пример с 1 разом:
Пример с 5 раз:
Вы можете изменить lastStop.rampPoint - n
, чтобы настроить, где они приземляются. Надеюсь это поможет.
Это будет работать, только если вы используете градиент в качестве штриха (как в вашем вопросе). Если вы хотите повторять градиент бесконечно (в отличие от определенного количества повторений), вы можете пропустить шаги 2 и 3 и использовать узорчатую кисть вместо художественной кисти. В CC теперь вы можете использовать изображения в кистях, поэтому вы можете растеризовать градиент вместо его расширения, но я использую CS6, поэтому я не могу это проверить.
Разверните эффект трансформации ( Object → Expand Appearance ).
Вы не можете использовать градиенты в кистях, поэтому вам нужно будет расширить градиент ( Object → Expand ), выбрать количество объектов для расширения в разделе «Expand Gradient To».
Расширение градиента оставит вас с некоторыми обтравочными масками в расширенном градиенте, вам нужно будет просмотреть слои и удалить их (или продолжайте щелкать правой кнопкой мыши и «Разгруппировать», затем «Отпустить обтравочную маску», пока не будет больше масок).
Перетащите расширенные градиенты на панель «Кисти» и выберите «Художественная кисть». Параметры по умолчанию для вашей кисти, скорее всего, будут в порядке, поэтому просто нажмите «ОК». Вы всегда можете вернуться и настроить параметры кисти позже.
Примените новую кисть.
Основываясь на руководстве Illustrator JS, я придумал код ниже. Этот код делает именно то, что вы хотите:
Более общую версию можно найти ниже строки.
(1) Сначала мы устанавливаем желаемое количество цветов и желаемое количество повторений градиента:
//Change these
var numberOfColors = 2; //Change this to the desired number of colors in the gradient
var iteration = 5; //Change this to the desired times you want to repeat the gradient
(2) Затем мы устанавливаем некоторые переменные, которые будут использоваться позже. Вычисляет GradientInterval
процентное положение, в котором должна быть установлена каждая точка. totalNumberofStops
довольно очевиден. Массив colors
будет использоваться позже.
//Don't change these
var i,j;
var gradientInterval = 100 / numberOfColors / iteration;
var totalNumberOfStops = numberOfColors * iteration;
var colors = [];
(3) Затем мы можем определить наши цвета. Вам нужно ровно столько цветов, сколько было задано в numberOfColors
начале. Отсутствующие цвета по умолчанию будут черными.
//Don't forget to push the colors to the colors array!
var color1 = new RGBColor();
color1.red = 0;
color1.green = 0;
color1.blue = 0;
colors.push(color1);
var color2 = new RGBColor();
color2.red = 255;
color2.green = 255;
color2.blue = 255;
colors.push(color2);
(4) Пришло время создать наш градиент и дать ему имя. Теперь мы также можем установить тип.
//Let's initiate the gradient & name it
var newGradient = app.activeDocument.gradients.add();
newGradient.name = "new_gradient";
//Choose the gradient type here
//newGradient.type = GradientType.RADIAL; //Uncomment the one you need
newGradient.type = GradientType.LINEAR; //Uncomment the one you need
(5) Теперь о хорошем. Сначала мы зациклимся, totalNumberOfStops
чтобы мы могли создать каждую точку и добавить ее в градиент. Создаем новую остановку и устанавливаем ее на одну дальше предыдущей. Теперь нам нужно получить правильный цвет из нашего массива цветов. Когда модуль индекса цикла, деленный на количество цветов, равен 0, мы знаем, что у нас были все цвета, и нам нужно начать заново, поэтому мы сбрасываем наш индекс цвета.
Пример Скажем, у меня есть шесть цветов, которые я хочу повторить 5 раз. У нас тридцать остановок. Мы перебираем все цвета, используя j
. Когда j
становится 6, цветов больше нет (шесть — это седьмой цвет в массиве, но в массиве всего шесть цветов). Таким образом, каждый раз, кратный шести, мы снова начинаем с 0. В противном случае мы просто переходим к следующему цвету.
Теперь нам нужно только добавить окончательную цветовую остановку на 100%.
//Now here is where the magic starts
for(i=0;i<totalNumberOfStops;i++){
var newStop = newGradient.gradientStops.add();
newStop.rampPoint = i * gradientInterval;
var modulus = i % numberOfColors;
if(modulus === 0){
j = 0;
}else{
j+=1;
}
newStop.color = colors[j];
}
var lastStop = newGradient.gradientStops.add();
lastStop.rampPoint = 100;
lastStop.color = colors[colors.length-1];
(6) Последний шаг: применение градиента к обводке. Сделанный. Партия!
//Apply gradient stroke to selected object
var colorOfGradient = new GradientColor();
colorOfGradient.gradient = newGradient;
var topPath = app.activeDocument.pathItems[0];
topPath.stroked = true;
topPath.strokeWidth = 140;
topPath.strokeColor =colorOfGradient;
(7) Возможно, вам придется вручную установить обводку «Применить градиент вдоль обводки», потому что я не нашел кода для этого.
Этот код был специально создан для вашего случая. Более общую версию можно найти здесь: http://pastie.org/10921740
Некоторые примеры:
Градиент с двумя цветами, повторяющийся дважды:
Градиент с пятью цветами, повторяющийся 10 раз:
У меня была такая же проблема, и этот ответ от MG_ был именно тем, что мне было нужно!
Однако через некоторое время я заметил, что мне то и дело нужны и не плавные градиенты, и тоже не бесшовные градиенты. Было немного сложно найти хорошее решение, поэтому я делюсь здесь модифицированным скриптом с теми, у кого такая же проблема. Я также включил простой пользовательский интерфейс для настройки всего.
var run = true;
if (app.activeDocument.selection.length < 2) {
alert("Please select two or more paths with fills.");
} else {
var dlg = new Window("dialog{text:'Create repeated gradient'}");
dlg.location = [500,50];
(dlg.alertBtnsPnl1 = dlg.add('panel', undefined, 'Color transition:')).helpTip = "Smooth or rough transition";
(dlg.alertBtnsPnl1.selectS = dlg.alertBtnsPnl1.add('radiobutton', [15,15,95,35], 'Smooth' )).helpTip = "Smooth color transition";
(dlg.alertBtnsPnl1.selectR = dlg.alertBtnsPnl1.add('radiobutton', [15,15,75,35], 'Rough' )).helpTip = "Sharp color transition";
dlg.alertBtnsPnl1.orientation='row';
dlg.alertBtnsPnl1.selectS.value = true;
(dlg.alertBtnsPnl3 = dlg.add('panel', undefined, 'Gradient type:')).helpTip = "Linear or radial gradient";
(dlg.alertBtnsPnl3.selectL = dlg.alertBtnsPnl3.add('radiobutton', [15,15,95,35], 'Linear' )).helpTip = "Linear gradient";
(dlg.alertBtnsPnl3.selectR = dlg.alertBtnsPnl3.add('radiobutton', [15,15,75,35], 'Radial' )).helpTip = "Radial gradient";
dlg.alertBtnsPnl3.orientation='row';
dlg.alertBtnsPnl3.selectL.value = true;
(dlg.alertBtnsPnl2 = dlg.add('panel', undefined, 'Gradient repeats:')).helpTip = "Gradient repeat count";
(dlg.alertBtnsPnl2.slide = dlg.alertBtnsPnl2.add('slider', [25,15,165,39], 'Set repeat count for gradient:')).helpTip = "Use Slider to set a repeat count";
dlg.alertBtnsPnl2.slide.value = 2;
(dlg.alertBtnsPnl2.titleEt = dlg.alertBtnsPnl2.add('edittext', [100,15,160,35], dlg.alertBtnsPnl2.slide.value)).helpTip = "Enter a repeat count value";
dlg.alertBtnsPnl2.titleEt.text = Math.ceil(dlg.alertBtnsPnl2.slide.value);
dlg.alertBtnsPnl2.orientation='row';
(dlg.alertBtnsPnl4 = dlg.add('panel', undefined, 'First and last colors:')).helpTip = "Define type of gradient loop";
(dlg.sameStartAndEnd = dlg.alertBtnsPnl4.add('checkbox', [25,25,235,39], 'Start and end with same color')).helpTip="Use this for seamless gradient";
dlg.sameStartAndEnd.value = true;
dlg.alertBtnsPnl4.orientation='column';
dlg.btnPnl = dlg.add('group', undefined, 'Do It!');
dlg.btnPnl.orientation='row';
dlg.btnPnl.buildBtn1= dlg.btnPnl.add('button',[15,15,115,35], 'Cancel', {name:'cancel'});
dlg.btnPnl.buildBtn2 = dlg.btnPnl.add('button', [125,15,225,35], 'OK', {name:'ok'});
dlg.alertBtnsPnl2.slide.onChange= sliderChanged;
dlg.alertBtnsPnl2.titleEt.onChanging = eTextChanged;
dlg.btnPnl.buildBtn1.onClick= actionCanceled;
dlg.show();
if(run){
var smooth = (dlg.alertBtnsPnl1.selectS.value) ? true : false;
var cycles = dlg.alertBtnsPnl2.slide.value;
var myselection = app.activeDocument.selection;
var colors = [];
for (var i = 0; i < myselection.length; i++) {
var newColor = myselection[i].fillColor;
colors.push(newColor);
}
var stops;
var interval;
if(dlg.sameStartAndEnd.value && !smooth){
stops = colors.length * cycles - 2;
interval = 100 / ((cycles * colors.length)+1);
}else{
if(smooth && !dlg.sameStartAndEnd.value){
stops = colors.length * cycles - 2;
interval = 100 / ((cycles * colors.length)-1);
}else{
stops = colors.length * cycles - 1;
interval = 100 / (cycles * colors.length);
}
}
var allStops = stops;
var newGradient = app.activeDocument.gradients.add();
newGradient.type = (dlg.alertBtnsPnl3.selectL.value) ? GradientType.LINEAR : GradientType.RADIAL;
newGradient.gradientStops[0].color = colors[0];
if(dlg.sameStartAndEnd.value) newGradient.gradientStops[1].color = colors[0];
else newGradient.gradientStops[1].color = colors[colors.length - 1];
if(!smooth){
var thisStop = newGradient.gradientStops.add();
thisStop.rampPoint = interval-0.1;
thisStop.color = colors[0];
allStops++;
}
for(i = 1; i <= stops; i++){
var thisStop = newGradient.gradientStops.add();
thisStop.rampPoint = i * interval;
thisStop.color = colors[i % colors.length];
if(!smooth && i<(stops+1)){
var thisStop = newGradient.gradientStops.add();
thisStop.rampPoint = (i+1) * interval - 0.001;
thisStop.color = colors[i % colors.length];
allStops++;
}
}
if(!smooth && dlg.sameStartAndEnd.value){
var thisStop = newGradient.gradientStops.add();
thisStop.rampPoint = 100 - (interval*2);
thisStop.color = colors[colors.length-1];
allStops++;
var thisStop = newGradient.gradientStops.add();
thisStop.rampPoint = 99.9 - interval;
thisStop.color = colors[colors.length-1];
allStops++;
var thisStop = newGradient.gradientStops.add();
thisStop.rampPoint = 100 - interval;
thisStop.color = colors[0];
allStops++;
}
newGradient.gradientStops[0].rampPoint = 0.1;
if(dlg.sameStartAndEnd.value)newGradient.gradientStops[allStops + 1].rampPoint = 99.9;
}
}
function actionCanceled() {
run = false;
dlg.hide();
}
function sliderChanged() {
dlg.alertBtnsPnl2.slide.value = Math.ceil(dlg.alertBtnsPnl2.slide.value);
dlg.alertBtnsPnl2.titleEt.text = Math.ceil(dlg.alertBtnsPnl2.slide.value);
}
function eTextChanged() {
dlg.alertBtnsPnl2.titleEt.text = Math.ceil(dlg.alertBtnsPnl2.titleEt.text);
dlg.alertBtnsPnl2.slide.value = Math.ceil(dlg.alertBtnsPnl2.titleEt.text);
}
Так что в основном он работает так же, как ответ, который я связал, но имеет пару дополнительных опций:
Ну, я бы не стал использовать градиент полностью. Сначала создайте градиент, подобный тому, который у вас есть, затем заполните им холст и определите шаблон (редактировать > определить шаблон). Затем вы переходите к Слою. новый слой заливки и выберите узор. Вы можете использовать существующий слой в качестве обтравочной маски. Теперь «n» — это «масштаб», поэтому 100% — это 1, 50% — это n=2 и так далее. Чем меньше масштаб, тем более повторяемым будет узор и градиент.
Второй подход, который я бы выбрал, - это «шаг и повторение». Я не знаю, где и как вы хотите использовать этот множественный «волнистый» градиент, но «S&R» очень удобен для умножения вещей в фотошопе. Просто нажмите «ctrl (cmd) + alt + t», сделайте свое дело (масштабируйте, переместите, поверните объект), нажмите Enter, а затем используйте «shift + ctrl (cmd) + alt + t», и фотошоп повторит то, что вы сделали. Если вы вращаете, перемещаете и масштабируете объект, Ps будет делать это столько раз, сколько вы нажмете кнопку повтора.
Здесь я просто играл со вторым по величине конвертом, а затем повторил шаг.
Шон