Как я могу создать путь с кривыми Безье с помощью скрипта?

У меня есть скрипт, который делает для меня простую форму*:

var docRef = documents.add();
var piRef = activeDocument.pathItems;

{
    var pathRef = piRef.add();
    pathRef.setEntirePath( new Array(
        new Array(475,543.30078125),
        new Array(450,500),
        new Array(475,456.69873046875),
        new Array(525,456.69873046875),
        new Array(550,500),
        new Array(525,543.30078125),
        new Array(475,543.30078125) ) ) ;
}

Однако формы, которые я создаю, ограничены прямыми путями, как я могу изменить это, чтобы создавать пути с изогнутыми краями?

Я довольно новичок и неопытен в написании сценариев для Illustrator, я уверен, что для меня есть лучший способ пройти этот путь в первую очередь.


Я использую этот скрипт от Wolff, чтобы извлечь координаты моего пути (после создания пути в Illustrator), я предполагаю, что мне также придется изменить его, чтобы он экспортировал круглые пути.

* Форма шестиугольника не имеет значения, идея состоит в том, чтобы иметь возможность создавать произвольные формы.

Добро пожаловать на темную сторону.

Ответы (1)

Вы не можете сделать это с помощью setEntirePath, вам нужно создать новый pathItem (Document.pathItems.add()), а затем вам нужно добавить свои точки пути по отдельности.

Вы бы сделали это через:

var myPath = app.activeDocument.pathItems.add();

var newPoint = myPath.pathPoints.add();
newPoint.leftDirection = [10, -5];
newPoint.anchor = [0, 0];
newPoint.rightDirection = [-10, 5];

Теперь, когда вы добавите больше, это сформирует вашу кривую Безье!


var doc = app.activeDocument;
var myPath = doc.selection[0];
var pathPointArray = [];
var thisPoint;
for(var i = 0; i < myPath.pathPoints.length; i++){
    thisPoint = myPath.pathPoints[i];
    pathPointArray.push([
        [
            thisPoint.leftDirection[0],
            thisPoint.leftDirection[1]
        ],
        [
            thisPoint.anchor[0],
            thisPoint.anchor[1]
        ],
        [
            thisPoint.rightDirection[0],
            thisPoint.rightDirection[1]
        ]
    ]);
}
alert(pathPointArray.join("\n"));

Вот результат:

РЕАЛЬНЫЙ результат!

И вот один из них, где все собрано вместе, в результате чего оно собирает координаты из вашего выбора и создает дубликат того же элемента (без использования команд копирования/вставки или дублирования) ровно на 100 пунктов выше первоначального выбора.

    var doc = app.activeDocument;
    var myPath = doc.selection[0];
    var pathPointArray = [];
    var thisPoint;
    for(var i = 0; i < myPath.pathPoints.length; i++){
        thisPoint = myPath.pathPoints[i];
        pathPointArray.push([
            [
                thisPoint.leftDirection[0],
                thisPoint.leftDirection[1]
            ],
            [
                thisPoint.anchor[0],
                thisPoint.anchor[1]
            ],
            [
                thisPoint.rightDirection[0],
                thisPoint.rightDirection[1]
            ]
        ]);
    }

    var myNewPath = doc.pathItems.add();
    var thisArrayPointObject;
    var newPoint;
    for(var i = 0; i < pathPointArray.length; i++){
        thisArrayPointObject = pathPointArray[i];
        newPoint = myNewPath.pathPoints.add();
        newPoint.leftDirection = [
            thisArrayPointObject[0][0],
            thisArrayPointObject[0][1] + 100
        ];
        newPoint.anchor = [
            thisArrayPointObject[1][0],
            thisArrayPointObject[1][1] + 100
        ];
        newPoint.rightDirection = [
            thisArrayPointObject[2][0],
            thisArrayPointObject[2][1] + 100
        ];
    };

И вот результат от этого:

введите описание изображения здесь

Есть ли способ извлечь эти данные из формы, которую я сделал?
Я попытался добавить код и получил ошибку myPath is undefined, я определенно делаю что-то не так .
Ну, вы должны сначала определить это, откуда, по-вашему, это должно было взяться? Попробуйте сделать так: var myPath = app.activeDocument.pathItems.add(); Это, конечно, должно произойти до любого материала, который воздействует на переменную с именем «myPath». Но не волнуйтесь, вы получите его!
Используйте это упражнение для сбора pathPoints из одного выбранного pathItem: var doc = app.activeDocument; var myPath = doc.selection[0]; вар pathPointArray = []; вар эта точка; for(var i = 0; i < myPath.pathPoints.length; i++){ thisPoint = myPath.pathPoints[i]; pathPointArray.push([thisPoint.leftControl, thisPoint.anchor, thisPoint.rightControl]); } предупреждение(pathPointArray.join("\n"));
Координаты, которые он экспортирует, нельзя использовать для кривой Безье, не так ли?
Ой, в моем сниппете была БОЛЬШАЯ ошибка - вещи не называются "leftControl" или "rightControl", они на самом деле называются "rightDirection" и "leftDirection". Следите за обновлением ответа!
На самом деле они являются координатами кривых Безье. Каждый объект PathPoint имеет ваши направления влево/вправо, это ваши ручки управления. Якорь - это «фактическая» точка, в случае многоугольников вы можете думать о них как о кривых Безье без какого-либо безье, поскольку их «управляющие маркеры» технически отведены к тем же координатам, что и опорные точки. Как вы можете видеть в примере, левая/якорная/правая точки помещаются в массив из 3-элементных массивов из 2-элементных массивов. Вы можете использовать этот массив для добавления новых точек пути к пути, который вы создаете.
Совершенно справедливо думать о контрольной клетке как о точках Безье.
Я надеялся экспортировать координаты (используя этот скрипт), что мне нужно изменить, чтобы сделать это?
Прямо сейчас этот сценарий просто учитывает свойство .anchor для регистрации координат привязки, вам также нужно будет включить точки leftDirection/rightDirection, а затем с тем, что вы позже нарисуете в сценарии, вам придется рассматривать их как хорошо. В основном это код, который я вставил в ответ - попробуйте пройти сверху вниз и посмотреть, что читает каждая строка. С пониманием этого базового фрагмента могут появиться неисчислимые способности суперпользователя.