¿Cómo rotar todos los elementos como un grupo? (En un guión, Illustrator)

Tengo un SVG con algunos caminos curvos. Me gustaría crear nversiones de esto, girándolos como un grupo ( grados de separación), alrededor 360 / ndel centro del lienzo en forma de cuadrado en el que se encuentran, así:

ejemplo de rotación

Luego, me gustaría guardarlos en archivos SVG separados.

Según una investigación inicial, esto debería ser posible en Illustrator. Sin embargo, ni siquiera puedo hacer que rote todos los objetos como un grupo, solo puedo rotar cada objeto alrededor de su centro con:

doc = app.activeDocument;
sel = doc.pageItems;
for (var i = 0; i < sel.length; i++) {
    sel[i].rotate(30);
}

¿Cómo podría hacer esto? (También estoy abierto a cualquier alternativa de software).

Simplemente agrupe todos los elementos antes de rotar. Vea mi respuesta a Rotar una capa alrededor del centro y guardar el archivo (72 veces)
¡Usa la manipulación de matrices!
@Cai - Entonces, ¿cómo agrupas todos los elementos ? No pude encontrar esto en Google antes y parece que tampoco puedo encontrarlo en su otra respuesta.
En realidad, tiene razón, acabo de decir en los comentarios de mi otra respuesta al grupo primero (quise decir en AI en sí, no en el script, solo seleccione todo y cmd/ctrl+G)... ¿Necesita hacer esto con ¿Varios SVG o solo uno? Si es solo uno, agrupar en AI manualmente es bastante fácil

Respuestas (5)

Introducción rápida a la programación de gráficos por computadora. Siempre que intente hacer una transformación compuesta, es mejor componer la transformación en una operación de matriz. Principalmente porque puede especificar una transformación compleja de una sola vez.

OK, entonces no, tenemos que calcular los límites. Pero entonces también podría rotar alrededor de un punto arbitrario en algunos casos (esto lo hace fácil).

#target illustrator

var doc = app.activeDocument;
var sel = doc.pageItems;
var bounds = calculate_bounds(sel);
var center = [(bounds[0]+bounds[2])/2,
              (bounds[1]+bounds[3])/2]

for (var i = 0; i < sel.length; i++) {
    rotate_around_global_pos(sel[i], 30, center);
}


/********* Support functions *********/

function rotate_around_global_pos(obj, ang, pos) {
    var rot = app.getRotationMatrix(15);
    var mov = app.getTranslationMatrix(pos[0], pos[1]);
    var inv = app.invertMatrix(mov);
    var mtx = app.concatenateMatrix(inv, rot);
    var mtx = concatenateMatrix(mtx, mov);

    obj.transform(mtx, 1, 1, 1, 1, 1, Transformation.DOCUMENTORIGIN);
}

function calculate_bounds(sel){
    var minX = Number.POSITIVE_INFINITY;
    var maxX = Number.NEGATIVE_INFINITY;
    var minY = Number.POSITIVE_INFINITY;
    var maxY = Number.NEGATIVE_INFINITY;


    for (i = 0; i < sel.length; i++){
        var item = sel[i];
        var bounds = sel[i].controlBounds;

        minX = Math.min( minX, bounds[0], bounds[2] );
        maxX = Math.max( maxX, bounds[0], bounds[2] );
        minY = Math.min( minY, bounds[1], bounds[3] );
        maxY = Math.max( maxY, bounds[1], bounds[3] );
    }
    return [maxX, maxY, minX, minY];
}
¡Gracias! La rotación basada en matriz alrededor de un punto arbitrario es exactamente lo que necesitaba. Quería rotar alrededor del centro del lienzo (no el rectángulo delimitador del grupo de objetos) y exportar después de cada rotación, pero cambiar esto y combinarlo con el código de Cai en la otra pregunta produce el resultado perfecto. Voy a publicar mi código en un minuto. (Además, creo que la primera línea de la rotate_around_global_posfunción debería ser ).var rot = app.getRotationMatrix(ang);

Siempre puede registrar una acción en un archivo (Ventana > Acciones) y luego ejecutar el resto como un lote usando esa acción...

Hice una prueba creando, guardando el primer grupo y luego rotando y guardando 7 copias... y funcionó bien:

Rotar y guardar acción 1

Aquí está mi acción para que puedas ver cómo lo hice:

Rotar y guardar acción 2

¡Gracias! Esta es probablemente la mejor manera de hacerlo usando Actions . Sin embargo, la razón por la que recurrí al enfoque de secuencias de comandos es para que nse pueda cambiar un parámetro y el ángulo de rotación y los nombres de archivo de salida se generen automáticamente. (Si nse cambió a 100 en lugar de 8, deberá cambiar el ángulo y volver a realizar los pasos 92 Transformar nuevamente / Guardar como manualmente).

Combinando la manipulación de matriz de joojaa y el bucle de exportación SVG de Cai , terminé con este script:

#target illustrator

var doc = app.activeDocument;
var docDir = ( doc.path != '' ) ? doc.path : '~';

var n = 20,
    iterations = n - 1,
    angle = 360 / n,
    destFolder = 'rotated'; // output files are saved in this subfolder

rotateAndExport();

function rotateAndExport() {
    var pos = [doc.width / 2, doc.height / 2];
    var layer = doc.layers[0];
    exportFile(1); // save the original file into the output folder
    for ( var r = 0; r < iterations; r++ ) {
        for ( var j = 0; j < layer.pageItems.length; j++ ) {
            var item = layer.pageItems[j];
            rotate_around_global_pos(item, -angle, pos);
        }
        exportFile(r + 2);
    }
}

function pad(number) { // pad with a leading zero (%02d)
    if (number <= 9) number = "0" + number;
    return number;
}

function exportFile( iteration ) {
    // create folder if it doesn't exist
    var destPath = docDir + '/' + destFolder;
    if ( false == Folder( destPath ).exists ) {
        new Folder( destPath ).create();
    }

    // export options
    var destFile;
    var type;
    var exportOptions;

    var svgPath = destPath + '/';
    destFile = new File( svgPath + '/output_' + pad(iteration) + ".svg");

    type = ExportType.SVG;
    exportOptions = new ExportOptionsSVG();
    exportOptions.preserveEditability   = false;
    exportOptions.embedRasterImages     = true;
    exportOptions.embedAllFonts         = false;
    exportOptions.encoding              = SVGDocumentEncoding.UTF8;
    exportOptions.fontType              = SVGFontType.OUTLINEFONT;

    doc.exportFile( destFile, type, exportOptions );
}

function rotate_around_global_pos(obj, ang, pos) {
    var rot = app.getRotationMatrix(ang);
    var mov = app.getTranslationMatrix(pos[0], pos[1]);
    var inv = app.invertMatrix(mov);
    var mtx = app.concatenateMatrix(inv, rot);
    var mtx = concatenateMatrix(mtx, mov);

    obj.transform(mtx, 1, 1, 1, 1, 1, Transformation.DOCUMENTORIGIN);
}

Este script crea una subcarpeta junto al archivo actualmente abierto y guarda nlos estados, cada uno de los cuales se gira en el sentido de las agujas del reloj con el mismo ángulo uno tras otro. (No es necesario agrupar las rutas y no es necesario agregar ningún rectángulo adicional).

Si está utilizando un archivo SVG, puede abrirlo en Adobe Illustrator. Luego seleccione todos los objetos que desea rotar. Ctrl + A debería hacer. Luego haz clic derecho y agrúpalos. Ahora, puede rotarlos fácilmente como uno solo.

También puede desagruparlos más tarde.

Gracias por su respuesta, pero me temo que se perdió la parte del "guión" de mi pregunta. En mi caso, n > 1(son alrededor de 20), por lo que me gustaría evitar hacer esto manualmente.

Además de la respuesta de @Yash Sheth, no es necesario que su pregunta esté escrita en sí misma. Puede realizarlo de manera bastante eficiente sin. Illustrator tiene la función ' transformar de nuevo ', (CMD o CTRL + D).

Entonces, podrías:

  1. Agrupa los elementos
  2. Objeto --> Transformar --> Girar
  3. Elige 360/n grados
  4. Presione 'Copiar' ( no APLICAR)
  5. Ahora, presiona CMD+D una cantidad n de veces.

Además (aunque no probado), puede crear una serie de n mesas de trabajo igualmente espaciadas, colocar la primera copia de 0º y la última copia de 360º-360º/ n en la primera y última mesa de trabajo, y usar la funcionalidad 'distribuir objetos' para colocar una copiar en cada mesa de trabajo. Exportar cada mesa de trabajo individualmente.