Wie kann ich mit einem Skript einen Pfad mit Bézierkurven erstellen?

Ich habe ein Skript, das eine einfache Form * für mich erstellt:

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) ) ) ;
}

Die Form(en), die ich erstelle, sind jedoch auf gerade Pfade beschränkt. Wie könnte ich dies ändern, um Pfade mit gekrümmten Kanten zu erstellen?

Ich bin ziemlich neu und unerfahren in der Illustrator-Skripterstellung. Ich bin sicher, dass es einen besseren Weg für mich gibt, diesen Weg überhaupt zu gehen.


Ich verwende dieses Skript von Wolff, um meine Pfadkoordinaten zu extrahieren (nachdem ich den Pfad in Illustrator erstellt habe). Ich nehme an, ich müsste das auch ändern, damit es runde Pfade exportiert.

*Die Form, die ein Sechseck ist, ist irrelevant, die Idee ist, beliebige Formen erstellen zu können.

Willkommen auf der dunklen Seite.

Antworten (1)

Sie können es nicht mit setEntirePath machen, Sie müssen ein neues pathItem erstellen (Document.pathItems.add()) und dann müssen Sie Ihre Pfadpunkte einzeln hinzufügen.

Sie würden dies tun über:

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

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

Wenn Sie jetzt mehr hinzufügen, bildet dies Ihre Bezier-Kurve!


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"));

Hier ist das Ergebnis:

Das ECHTE Ergebnis!

Und hier ist eine, bei der das Ganze zusammengesetzt wird, wobei es die Koordinaten aus Ihrer Auswahl sammelt und ein Duplikat desselben Objekts (ohne Kopieren/Einfügen oder Duplizieren-Befehle) genau 100 Punkte über der ursprünglichen Auswahl erstellt.

    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
        ];
    };

Und hier ist das Ergebnis daraus:

Geben Sie hier die Bildbeschreibung ein

Gibt es eine Möglichkeit , diese Daten aus einer von mir erstellten Form zu extrahieren ?
Ich habe versucht, den Code hinzuzufügen und habe den Fehler erhalten myPath is undefined, ich mache definitiv etwas falsch
Nun, du musst es zuerst definieren, woher dachtest du, dass es kommen würde? Versuchen Sie Folgendes: var myPath = app.activeDocument.pathItems.add(); Das muss natürlich vor allem kommen, was auf die Variable "myPath" wirkt. Aber keine Sorge, du wirst es bekommen!
Verwenden Sie diese Übung, um pathPoints von einem ausgewählten pathItem zu sammeln: 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.leftControl, thisPoint.anchor, thisPoint.rightControl]); } alert(pathPointArray.join("\n"));
Die exportierten Koordinaten können nicht für eine Bezierkurve verwendet werden, oder?
Oy, da war ein GROSSER Fehler in meinem Snippet-Ding - die Dinge heißen nicht "leftControl" oder "rightControl", sie heißen tatsächlich "rightDirection" und "leftDirection". Bleiben Sie dran für das Antwort-Update!
Nun, sie sind tatsächlich Koordinaten für Bezierkurven. Jedes PathPoint-Objekt hat Ihre linken/rechten Richtungen, das sind Ihre Steuergriffe. Der Anker ist der „eigentliche“ Punkt, im Fall von Polygonen können Sie sich diese als Bezierkurven ohne Beziering vorstellen, da ihre „Steuergriffe“ technisch auf die gleichen Koordinaten wie die Ankerpunkte zurückgezogen sind. Wie Sie im Beispiel sehen können, werden die Links-/Anker-/Rechtspunkte in ein Array von Arrays mit 3 Elementen oder Arrays mit 2 Elementen eingefügt. Sie können dieses Array verwenden, um einem von Ihnen erstellten Pfad neue Pfadpunkte hinzuzufügen.
Es ist völlig richtig, sich den Steuerkäfig als Punkte eines Beziers vorzustellen.
Ich hatte gehofft, die Koordinaten zu exportieren (mit diesem Skript), was muss ich ändern, um das zu tun?
Im Moment berücksichtigt dieses Skript nur die .anchor-Eigenschaft, um die Koordinaten des Ankers zu protokollieren, Sie müssen auch die leftDirection/rightDirection-Punkte einbeziehen und dann mit dem, womit Sie später das Skript zeichnen würden, müssten Sie diese als betrachten Also. Es ist im Grunde der Code, den ich in die Antwort eingefügt habe - versuchen Sie, von oben nach unten zu gehen und zu sehen, was jede Zeile liest. Mit dem Verständnis dieses grundlegenden Snippets könnten ungeahnte Superuser-Kräfte entstehen.