¿Cómo puedo crear un camino con curvas Bézier usando un script?

Tengo un script que hace una forma simple* para mí:

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

Sin embargo, las formas que creo están limitadas a caminos rectos, ¿cómo podría cambiar esto para crear caminos con bordes curvos?

Soy bastante nuevo e inexperto en las secuencias de comandos de Illustrator, estoy seguro de que hay una mejor manera de hacer este camino en primer lugar.


Utilizo este script de Wolff para extraer las coordenadas de mi ruta (después de crear la ruta en Illustrator), supongo que también tendría que modificarlo para que exporte rutas redondas.

*La forma de ser un hexágono es irrelevante, la idea es poder crear formas arbitrarias.

Bienvenido al lado oscuro.

Respuestas (1)

No puede hacerlo con setEntirePath, debe crear un nuevo elemento de ruta (Document.pathItems.add()) y luego debe agregar sus puntos de ruta individualmente.

Harías esto a través de:

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

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

Ahora, cuando agregue más, ¡esto formará su curva Bezier!


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

Aquí está el resultado:

¡El VERDADERO resultado!

Y aquí hay uno en el que se ensambla todo, por lo que recopila las coordenadas de su selección y crea un elemento duplicado de lo mismo (sin usar comandos de copiar/pegar o duplicar) exactamente 100 puntos por encima de la selección inicial.

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

Y aquí está el resultado de eso:

ingrese la descripción de la imagen aquí

¿Hay alguna manera de extraer estos datos de una forma que he creado?
Intenté agregar el código y obtuve el error myPath is undefined, definitivamente estoy haciendo algo mal
Bueno, tienes que definirlo primero, ¿de dónde crees que vendría? Intente hacer esto: var myPath = app.activeDocument.pathItems.add(); Eso, por supuesto, tiene que venir antes que cualquiera de las cosas que actúan sobre la variable llamada "myPath". Pero no te preocupes, ¡lo conseguirás!
Utilice este ejercicio para recopilar puntos de ruta de un elemento de ruta seleccionado: var doc = app.activeDocument; var myPath = doc.selection[0]; var pathPointArray = []; var estePunto; for(var i = 0; i < myPath.pathPoints.length; i++){ thisPoint = myPath.pathPoints[i]; pathPointArray.push([thisPoint.leftControl, thisPoint.anchor, thisPoint.rightControl]); } alerta(pathPointArray.join("\n"));
Las coordenadas que exporta no se pueden usar para una curva bezier, ¿o sí?
Oy, hubo un GRAN error en mi fragmento: las cosas no se llaman "leftControl" o "rightControl", de hecho se llaman "rightDirection" y "leftDirection". ¡Estén atentos para la actualización de la respuesta!
Bueno, de hecho son coordenadas para curvas bezier. Cada objeto PathPoint tiene sus direcciones izquierda/derecha, esas son sus manijas de control. El ancla es el punto 'real', en el caso de los polígonos, puede pensar en ellos como curvas Bezier sin ningún tipo de Bezier, ya que sus 'manejadores de control' están técnicamente retraídos a las mismas coordenadas que los puntos de anclaje. Como puede ver en el ejemplo, los puntos izquierdo/anclaje/derecho se colocan en una matriz de matrices de 3 elementos de matrices de 2 elementos. Puede usar esta matriz para agregar nuevos PathPoints a una ruta que cree.
Es perfectamente válido pensar en la jaula de control como puntos de un bezier.
Esperaba exportar las coordenadas (usando este script), ¿qué necesito modificar para hacer eso?
En este momento, la secuencia de comandos solo tiene en cuenta la propiedad .anchor para registrar las coordenadas del ancla, también deberá incorporar los puntos de dirección izquierda/dirección derecha y luego, con lo que sea que luego dibujaría en la secuencia de comandos, tendría que considerarlos como Bueno. Básicamente es el código que puse en la respuesta: intente ir de arriba a abajo y vea qué lee cada línea. Con la comprensión de este fragmento básico, podrían surgir poderes de superusuario incalculables.