[AI CC-CC2021] Скрипт RandomStrokeWidth

Stiff

Топикстартер
15 лет на форуме
Сообщения
23
Реакции
1
На основе известного скрипта RandomSwatchesFill написал для своих целей рандомизатор толщины контуров. Двумя этими скриптами получается сделать вот такие "карты расшифровки генома".

mySelection = app.activeDocument.selection;
myDoc = app.activeDocument;

maxWidth = 4;
minWidth = 0.5;

if (mySelection instanceof Array)
{
for (i=0; i<mySelection.length; i++)
{
if(mySelection.typename == "PathItem")
{
selItem = mySelection;
selItem.strokeWidth = Math.round( Math.random() * 10 * maxWidth ) / 10 + minWidth;
// число с плавающей точкой от 0 до 1 умножается на 10, затем на максимальное значение толщины контура
// округляем до целого числа и делим на 10, получаем толщины с одним знаком после запятой от 0 до maxWidth
// в конце увеличиваем толщину контура на minWidth, чтобы убрать слишком тонкие контуры
}
}
}
 

Oleg Butrin

20 лет на форуме
Сообщения
1 989
Реакции
1 213
Кнопочка есть для оформления кода. Вот она:
1644475359676.png

И будет красиво.
 
  • Спасибо
Реакции: Stiff

_MBK_

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

Не по теме:
Гмм, извиняюсь за нескромный вопрос - и такое там кто-то покупает???
'8()'
 

Stiff

Топикстартер
15 лет на форуме
Сообщения
23
Реакции
1
JavaScript:
mySelection = app.activeDocument.selection;
myDoc = app.activeDocument;

maxWidth = 4;
minWidth = 0.5;

if (mySelection instanceof Array)
{
    for (i=0; i<mySelection.length; i++)
    {
        if(mySelection.typename == "PathItem")
        {
                selItem = mySelection;
                selItem.strokeWidth = Math.round( Math.random() * 10 * maxWidth ) / 10 + minWidth;
                // число с плавающей точкой от 0 до 1 умножается на 10, затем на максимальное значение толщины контура
                // округляем до целого числа и делим на 10, получаем толщины с одним знаком после запятой от 0 до maxWidth
                // в конце увеличиваем толщину контура на minWidth, чтобы убрать слишком тонкие контуры
         }
    }
}
 
Последнее редактирование:
  • Спасибо
Реакции: dumbm1

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 138
Реакции
10 835
Все это хорошо, но выделенные pathItems во-первых, должны быть stroked, а во вторых, для каждого вызова скрипта значения толщин будут одинаковые ибо рандомизатор ущербен.
 

Stiff

Топикстартер
15 лет на форуме
Сообщения
23
Реакции
1
Все это хорошо, но выделенные pathItems во-первых, должны быть stroked, а во вторых, для каждого вызова скрипта значения толщин будут одинаковые ибо рандомизатор ущербен.
Я не ставил целью сделать универсальный скрипт. Да, path должны быть с контуром. По поводу рандома: никто не мешает вызвать скрипт несколько раз, чтобы получить варианты. Проверено, работает как надо.
 

_MBK_

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

YemZ

В бане
Сообщения
14
Реакции
7
Мой внутренний перфекционист говорит, что если в коде есть переменные min и max, то результат должен быть между min и max, а не между min и (max+min).
JavaScript:
var mySelection = app.activeDocument.selection;
var myDoc = app.activeDocument;

var maxWidth = 4;
var minWidth = 0.5;

if (mySelection instanceof Array)
{
    for (i=0; i<mySelection.length; i++)
    {
        if(mySelection[i].typename == "PathItem")
        {
            mySelection[i].strokeWidth = Math.round((Math.random() * (maxWidth - minWidth) + minWidth)*10)/10;
        }
    }
}

А еще, когда вы постили код без тэга
Код:
[CODE]
,форум съел
Код:
[i]
из строк, где было
Код:
mySelection[i]
 
  • Спасибо
Реакции: ~RA~ и ITIT

creold

Сергей Осокин
Сообщения
27
Реакции
36
Можно еще подшаманить, сделав управление шагом рандомных толщин. Для каких-нибудь задач юзера, требующих точности.

Добавил компаунды, можно заморочиться и парсить внутри групп еще пути. Активация строука в Виндовс версиях ок, на Маках в ряде версий старый индусский баг, что строук не включится, если в selection несколько путей. Его можно обойти костыльно, но не стал дописывать.

JavaScript:
var maxWidth = 4;
var minWidth = 0.5;
var step = 0.3; // Шаг изменения толщин

if (selection.length || selection.typename !== 'TextRange') {
  for (var i = 0; i < selection.length; i++) {
    var iSel;

    if (selection[i].typename == 'PathItem') iSel = selection[i];
    else if (selection[i].typename == 'CompoundPathItem') iSel = selection[i].pathItems[0];
    else continue;

    // В Мак версиях свойство stroked для нескольких объектов баговано
    if (!iSel.stroked) iSel.stroked = true;
    iSel.strokeWidth = getRandomWithStep(minWidth, maxWidth, step);
  }
}

function getRandomWithStep(min, max, step) {
  var range = (max - min) / step;
  return Math.round(Math.random() * range) * step + min;
}
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 138
Реакции
10 835
selection.typename == 'CompoundPathItem') iSel = selection.pathItems[0]
Этот прием не работает.
У компаунда легко может быть пустой pathItems, причем, чаще всего так и есть, если компаунды скриптом собирать.
 

creold

Сергей Осокин
Сообщения
27
Реакции
36
чаще всего так и есть
Чаще — когда шрифты в аутлайны переводятся. Если пользователь сам создавал простые компаунды, там я бы "чаще" посчитал, все ok (без GroupItem). Для этого в компаунд временно пустой путь добавить, он получит свойства объекта. Обработать объект, в конце скрипта удалить временный путь. Примерно:

JavaScript:
var tmp = [];
.. // код скрипта
try {
    iSel = selection[i].pathItems[0];
} catch (e) {
    // В массив tmp собирать, в конце циклом удалить в нем pathItems
    tmp.push(selection[i].pathItems.add());
    iSel = selection[i].pathItems[0];
}

Это как и про группы и баги строуков в Мак ОС примечание — было бы желание масштабно накрутить функционала в скрипт Stiff'a. Там и пересчет толщин в единицы документа можно делать, не только пиксели.
 

_MBK_

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