[AI CC-CC2021] Как вызвать цвет из файла

Андрей1977

Участник
Топикстартер
Сообщения
42
Реакции
1
Как вызвать сохраненный цвет или градиент из файла и применить его к выделенному объекту и к группе объектов (stroke or fill)? Заранее всех благодарю.
 

_MBK_

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

Андрей1977

Участник
Топикстартер
Сообщения
42
Реакции
1
Поясните этот момент
Да, вопрос немного ширше. Например, я работая над одним проектом, разработал градиент, который хочу использовать для других документов после закрытия этого проекта. Как его можно сохранить, чтобы в другом проекте я мог его применить не вручную, а вызвав его через скрипт.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 185
Реакции
10 844
Не совсем понимаю все равно
Вы хотите текстовое описание этого градиента получить, дабы его потом в скрипте пользовать?
 

Yur1j

Участник
Сообщения
207
Реакции
63
а что мешает использовать адобовскую библиотеку?
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 185
Реакции
10 844
Еще на одном моменте хочу заострить внимание. Если у вас некий объект (цвет, градиент и т.д.) содержится в одном файле, то, даже если этот файл открыт параллельно с целевым, использовать его в целевом файле категорически нельзя - результат непредсказуем, от потери данных до крэша иллюстратора, этот момент индусы не продумали. Только заново создавать объект с нуля в целевом файле по образу и подобию.
Именно поэтому я и спросил про текстовое представление.
 

Андрей1977

Участник
Топикстартер
Сообщения
42
Реакции
1
Не совсем понимаю все равно
Вы хотите текстовое описание этого градиента получить, дабы его потом в скрипте пользовать?
Пусть это будет текстовое описание. Скрипт вызвав данный градиент изменит, пусть заливку, выбранного (selected) объекта в документе.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 185
Реакции
10 844
Я вас сразу предупреждаю, что это непросто. Вот пример из доки создания нового градиента с нуля
JavaScript:
// Creates a new gradient in current document then
// applies the gradient to the frontmost path item
if ( app.documents.length > 0 ) {
// Create a color for both ends of the gradient
var startColor = new RGBColor();
var endColor = new RGBColor();
startColor.red = 0;
startColor.green = 100;
startColor.blue = 255;
endColor.red = 220;
endColor.green = 0;
endColor.blue = 100;
// Create a new gradient
// A new gradient always has 2 stops
var newGradient = app.activeDocument.gradients.add();
newGradient.name = "NewGradient";
newGradient.type = GradientType.LINEAR;
// Modify the first gradient stop
newGradient.gradientStops[0].rampPoint = 30;
newGradient.gradientStops[0].midPoint = 60;
newGradient.gradientStops[0].color = startColor;
// Modify the last gradient stop
newGradient.gradientStops[1].rampPoint = 80;
newGradient.gradientStops[1].color = endColor;
// construct an Illustrator.GradientColor object referring to the
// newly created gradient
var colorOfGradient = new GradientColor();
colorOfGradient.gradient = newGradient;
// get first path item, apply new gradient as its fill
var topPath = app.activeDocument.pathItems[0];
topPath.filled = true;
topPath.fillColor = colorOfGradient;
}
А вам, по сути, придется брать существующий градиент и перебирать все его стопы и их цвета и выносить в некий промежуточный объект, текстовое представление которого использовать в дальнейшем
 
Последнее редактирование:
  • Спасибо
Реакции: Андрей1977

eugeny

15 лет на форуме
Сообщения
858
Реакции
210
Я вас сразу предупреждаю, что это непросто. Вот пример из доки создания нового градиента с нуля

А вам, по сути, придется брать существующий градиент и перебирать все его стопы и их цвета и выносить в некий промежуточный объект, текстовое представление которого использовать в дальнейшем
Ну если у него уже готов градиент, то надо объект градиента сконвертить в Json и сохранить в текстовый файл. Потом прочитать его и сделать обратную конвертацию в объект.
 

_MBK_

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

eugeny

15 лет на форуме
Сообщения
858
Реакции
210
У вас есть готовый код, который это делает???
код в json?

Код:
var colourObject=app.activeDocument.gradients[i]; // это заданный градиент допустим.
var file;
file = File.saveDialog('Export');
file.open('w');
file.write(JSON.stringify(colourObject));
file.close();
только файл придется выбирать -- безопасность javascript )).
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 185
Реакции
10 844
А я уж было обрадовался :(
120179
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 185
Реакции
10 844
Обычно для подобных вещей лично я использовал такое
JavaScript:
var colourObject=app.activeDocument.gradients[0]; // это заданный градиент допустим.
alert(colourObject.toSource());
однако в случае с градиентом (и любым встроенным объектом) алерт ругается неприличным смайликом
120180
 

eugeny

15 лет на форуме
Сообщения
858
Реакции
210
Точняк! я уже и забыл. Тогда самый простой способ перебрать свойства и сохранить свой json )).
Код:
var colourObject=app.activeDocument.gradients[0]; // это заданный градиент допустим.

var tmp="";
for (var key in colourObject) {
    tmp+=( "Ключ: " + key + " значение: " + colourObject[key] ); // вот сохранил свойства в строку в качестве примера.
    }
alert (tmp);
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 185
Реакции
10 844
Только там выйдет гораздо сложнее, к примеру, цвета тоже придется вот так по косточкам раскладывать.
 

veretragna

γνώσις
Сообщения
578
Реакции
200
Сейчас проверить не могу, но как насчет попробовать сделать прямую копию объекта через slice?
Типа такого:
var colorCopy = Object.entries(colourObject).slice()
 
Последнее редактирование:

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 185
Реакции
10 844
прямую копию объекта
Объекта, находящегося в другом документе?
У меня кажется было даже такое - копировал в другой документ через duplicate объект с каким то нестандартным градиентом, после чего закрытие исходного документа крэшило иллюстратор.
 

veretragna

γνώσις
Сообщения
578
Реакции
200
Объекта, находящегося в другом документе?
У меня кажется было даже такое - копировал в другой документ через duplicate объект с каким то нестандартным градиентом, после чего закрытие исходного документа крэшило иллюстратор.
Значит, какие-то объекты скопировались по референсу в итоге. Увы, в js нет метода скопировать объект целиком, дублируя референсы в локальную копию, если в нем уже есть вложенные объекты по референсу.
В обычном js это решают доп. модулем для deep copy (видел на stackoverflow), для иллюстратора такого финта ушами не видел.
Но попробовать-то можно, вдруг сработает
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 185
Реакции
10 844
В иллюстраторе очень криво сделана работа с несколькими открытыми документами. К примеру, попробуйте поработать с объектами открытого, но неактивного документа - будете очень сильно удивлены обилию страшных чудес.