[AI CC-CC2022] Есть ли готовый скрипт для изменения/задания размера наконечнику стрелки?

  • Автор темы Автор темы catpaw
  • Дата начала Дата начала

catpaw

Топикстартер
12 лет на форуме
Сообщения
245
Реакции
10
Всем доброго времени суток!
Задача: всем наконечникам стрелок задавать один размер.
Геометрически задача решаемая: узнать существующее расстояние между двумя точками
(я предполагаю, что у одинаковых стрелок порядок точек в пути одинаковый) и задать масштаб для получения желаемого.
Но я новичок и не никак не пойму, как пробраться к x и y этих двух точек.
Кроме того, мне кажется, что проблема должна быть популярной. Старые версии иллюстратора делали "разобранные" стрелки, где наконечники масштабировались. Может есть уже скрипт?
 
Так в новых тоже масштабируются... "неразобранные" :)
Зачем х у?
При масштабировании наконечники "разобранных" стрелок масштабируются вместе с рисунком, а нужно, чтобы их размер оставался таким же, как до масштабирования. Кроме того в полученных файлах размеры стрелок уже гуляют и их нужно привести к единообразию.
 
Всем доброго времени суток!
Задача: всем наконечникам стрелок задавать один размер.
Геометрически задача решаемая: узнать существующее расстояние между двумя точками
(я предполагаю, что у одинаковых стрелок порядок точек в пути одинаковый) и задать масштаб для получения желаемого.
Но я новичок и не никак не пойму, как пробраться к x и y этих двух точек.
Кроме того, мне кажется, что проблема должна быть популярной. Старые версии иллюстратора делали "разобранные" стрелки, где наконечники масштабировались. Может есть уже скрипт?
Вы определитесь, вам нужны "разобранные" стрелки (т.е. переведенные в редактируемый шейп или просто одинаковые не смотря на толщину линии? Но сразу предупреждаю - если я правильно понял обе задачи - они нетривиальны.
 
1. Зачем разбирать стрелки?
2. Eсли после масштабирования толщину линий со стрелками привести к единому значению, "неразобранные" стрелки и так станут одинаковыми... Или нужно все таки
одинаковые не смотря на толщину линии?
3. Если стрелки разобраны, то это отдельные объекты, по какому алгоритму определить что этот объект стрелка и его нужно скорректировать?
 
Похоже я "разобранными стрелками" сбила всех с толку. Мне нужно, сделать все наконечники одинакового размера. Они самостоятельные, а не те, что в современных версиях назначаются в поле обводка.
Я выделяю треугольничек, а скрипт находит расстояние между двумя определенными точками и, узнав расстояние между ними, масштабирует до нужного.
 
То есть, стрелки разобранные, наконечники все одинаковые, отличаются на евклидово преобразование, надо распознать их, распознать преобразование, и применить к каждой некое другое преобразование? Неплохая задачка, я б взялся незадорого ;)
 
То есть, стрелки разобранные, наконечники все одинаковые, отличаются на евклидово преобразование, надо распознать их, распознать преобразование, и применить к каждой некое другое преобразование? Неплохая задачка, я б взялся незадорого ;)
Зачем так усложнять? Скрипту нужно работать с одной стрелкой. Найти длину бока треугольничка и исходя из его длины сделать масштабирование, но уже всего треугольничка до нужного размера. Мне нужно просто найти расстояние от точки 0 до точки 1 выделенного треугольничка, но я не знаю, какими JS-словами до всего этого достучаться. Что внутри pathPoint я не нашла.
 
3. Если стрелки разобраны, то это отдельные объекты, по какому алгоритму определить что этот объект стрелка и его нужно скорректировать?
Никакого алгоритма. Я выделяю стрелку, а скрипт ее масштабирует.
 
Найти длину бока треугольничка и исходя из его длины сделать масштабирование, но уже всего треугольничка до нужного размера
То есть предполагается что всевсевсе наконечники - равносторонние треугольники? Тогда все просто - pathPoint.ancor это массив из координат, формулу расстояния между точками с известными координатами вы помните? Причем, можно даже еще проще - берите периметр конца и получите готовое значение для масштабирования
 
То есть предполагается что всевсевсе наконечники - равносторонние треугольники? Тогда все просто - pathPoint.ancor это массив из координат, формулу расстояния между точками с известными координатами вы помните? Причем, можно даже еще проще - берите периметр конца и получите готовое значение для масштабирования
Для меня как раз отсюда начинается китайская грамота. Нет, геометрию еще помню, но записи в JS я просто не знаю.
 
Вы хоть девушка умная и целеустремленная, но вредная и ленивая
Ну неужели трудно открыть javascript reference или хотя бы погуглить?
У каждого PathItem есть свойство length - это его периметр
У подобных треугольников он отличается на коэффициент подобия - вот и все
правда остается главная проблема - распознавание подобных концов и (самое главное) точки прирастания его к основному контуру
 
Вы хоть девушка умная и целеустремленная, но вредная и ленивая
Ну неужели трудно открыть javascript reference или хотя бы погуглить?
У каждого PathItem есть свойство length - это его периметр
У подобных треугольников он отличается на коэффициент подобия - вот и все
правда остается главная проблема - распознавание подобных концов и (самое главное) точки прирастания его к основному контуру
Я поняла, что у Вас вагон времени на препирательства. У меня его нет. Спасибо за помощь.
 
А зачем такие сложности? Вам не подойдет скрипт, который делает все выделенные объекты одного размера? Такие есть в сети. Или например, заменить все выделенные наконечники на один, нужного размера, тоже можно.
 
Спасение утопающих дело рук самих утопающих.
Масштабирование наконечника стрелочки из трех точек до нужного размера по длине ее стороны.
Код:
function main(){
var pRatio = prompt("Ratio of ID Graph: ", "100");
var pDesC  = prompt("Desired Length of Arrow Side: ", "8");

for (var I = 0 ; I < app.activeDocument.selection.length ; I++ ) {
if (app.activeDocument.selection[I].typename == "PathItem") {

var sel = app.activeDocument.selection[I];

var x1, x2, x3, y1, y2, y3;
with (sel){
   x1 = pathPoints[0].anchor[0]; y1 = pathPoints[0].anchor[1];
   x2 = pathPoints[1].anchor[0]; y2 = pathPoints[1].anchor[1];
   x3 = pathPoints[2].anchor[0]; y3 = pathPoints[2].anchor[1];
}

  var second = Math.sqrt(Math.pow((x1 - x2), 2) + Math.pow((y1 - y2), 2));
  var third  = Math.sqrt(Math.pow((x3 - x2), 2) + Math.pow((y3 - y2), 2));

var selC;
if (second >= third) {selC = second;} else {selC = third;}

var myDesC = pDesC / (pRatio/100);
var ratio = myDesC / selC * 100;

//обводка масштабируется
//        sel.resize(ratio, ratio, true, true, true, true, ratio);
//обводка не масштабируется
        sel.resize(ratio, ratio, true, true, true, true, 100);
}}
alert("Arrow scaling done... Maybe...", "Arrow Scaling");
};
main();
 
Во первых, непонятно, нафига вычисляется длина стороны, если есть периметр, а во вторых - как распознается центр трансформации? Если всего этого не надо вообще (чего от вас упорно и безнадежно добивались) то данный выстраданный скрипт в две строки можно было сделать. Если бы вы не состроили из себя обиженную и с ревом скрылись в неизвестном направлении.
 
Во первых, непонятно, нафига вычисляется длина стороны, если есть периметр, а во вторых - как распознается центр трансформации?
В некоторых случаях когда стрелочки параллельны осям - деталями можно пренебречь.
Длина стороны находится, поскольку ее длина задается параметром.
 
Проще задать целевой периметр, по которому всевсевсе стрелки будут нормированы
 
Проще задать целевой периметр
Иногда не проще, стрелки могут иметь разный профиль стреловидности - от равностороннего до вытянутого. И визуально как раз важна длина одной из сторон относительно толщины линий. Опять же считать периметр удовольствие среднее, а нужный размер можно сразу получить из Geometric Bounds подобрав визуально.