Tengo un SVG con algunos caminos curvos. Me gustaría crear n
versiones de esto, girándolos como un grupo ( grados de separación), alrededor 360 / n
del centro del lienzo en forma de cuadrado en el que se encuentran, así:
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).
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];
}
rotate_around_global_pos
función debería ser ).var rot = app.getRotationMatrix(ang);
n
se pueda cambiar un parámetro y el ángulo de rotación y los nombres de archivo de salida se generen automáticamente. (Si n
se 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 n
los 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.
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:
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.
Caí
joojaa
Atila Tanyi
Caí