Copy link to clipboard
Copied
Bonjour à tous!
En reprenant l'exemple de Simon Templar,
https://community.adobe.com/t5/illustrator/using-spreadsheet-data-to-transform-illustrator-objects/t...
Je voudrais montrer que l'on peut se passer aisément d'un tableur et d'un fichier csv, en utilisant des formules par script.
Les données fournies par Simon:
On constate que pour Mov la formule est celle de la spirale d'Archimède ρ = a θ en coordonnées polaires avec a = 1, pour le calcul on incrémente l'angle (Rot) de 15°.
Ce qui donne comme représentation avec un objet carré de 10pt
Les lignes de code qui suivent proviennent du script, je donnerai les détails plus loin.
Dans le script qui suit, le centre de rotation est le centre de l'objet sélectionné, vous pouvez sélectionner plusieurs objets de taille et de forme différente (un traitement par objet sélectionné).
ex1
var equa1 = "1*x", stepj = 1.1;
var equa2 = "x", borne = [15,15*26], stepa = 15;
Pour mieux suivre le fonctionnement prenons a = θ avec les mêmes critères (seule la colonne Move change)L'objet en centré sur la trajectoire de base.
ex2
var equa1 = "x*x", stepj = 1.1; //1.1
var equa2 = "x", borne = [15,15*26], stepa = 15;
Au début du code, zone INIT, on trouve:
- Sur la première ligne, l'option afficher la trajectoire de l'objet.
var trajectoire = false; // si true trace la trajectoire de l'objet lors de sont déplacement (segments rectilignes)
- Ensuite la façon de placer les objets dupliqués après ou avant.
var tend = true; // true PLACEATEND false PLACEATBEGINNING
- Le décalage, deux variables qui s'additionnent.
var dec = 0; // décalage en plus ou en moins sur le rayon (unité le point))
var propdec = 0; // dec proportionnel à la hauteur de l'objet ex 0.5 ou 1/2
Par exemple avec dec = 0 et propdec = 0.5, et la courbe de base un cercle, l'objet sera posé sur le cercle de base.
Remarque: les objets sont orientés selon la position de l'objet initial (debout à gauche, couché à droite).
- les attributs des lignes trajectoire et cercle de base couleur et largeur du contour, .
- En dernier, vous allez trouver plusieurs groupes de deux lignes, ce sont des exemples.
equa1 pour Mov le rayon avec le pas et equa2 pour l'angle (Rot), les bornes plus l'incrément, (unité le degré).
Remarque: les bornes peuvent êtres inversées comme par exemple [1,390] ou [390,1]
Important, la variable devra toujours être nommée par la lettre x en minuscule.
Pour les non initiés à la programmation, (dans la zone INIT du script)
et passer d'un exemple à l'autre, il suffit d'enlever ou de placer deux barres obliques (slatch) au début des lignes à activer ou non.
C'est toujours la dernière affectation qui est prise ne compte.
ex3 Le résultat de gauche avec ajout d'une symétrie et deux cercle placés en arrière plan.
var equa1 = "100+20*cos(Math.pow(x,1.5))", stepj = 0.1;
var equa2 = "5*x/2", borne = [0,120], stepa = 1;
Remarque; si vous souhaitez conserver la même trajectoire et augmenter le nombre d'étapes, il faut agir sur les deux pas dans les mêmes proportions.
var equa1 = "100+20*cos(Math.pow(x,1.5))", stepj =0.1/2;
var equa2 = "5*x/2", borne = [0,120], stepa =1/2;
ex4 à gauche tend = true;, à droite tend = false;
var equa1 = "90+20*cos(3*x/4)", stepj = 0.1;
var equa2 = "5*x/2", borne = [0,600], stepa = 0.8;
ex5
var equa1 = "120-Math.pow(x,1.2)+20*cos(3*x/4)", stepj = 0.1;
var equa2 = "5*x/2", borne = [0,300], stepa = 0.4;
Après exécution du script, J'ai juste ajouté un cercle contour noir fond dégradé dans l'embouchure du "tuyau".
ex6 exemple 5 avec bornes inversées.
var equa1 = "120-Math.pow(x,1.2)+20*cos(3*x/4)", stepj = 0.1;
var equa2 = "5*x/2", borne = [300,0], stepa = -0.4;
ex7
var equa1 = "120-Math.pow(x,1.2)+20*cos(3*x/4)", stepj = 0.1;
var equa2 = "Math.pow(x,1.8)", borne = [60,157], stepa = 0.1; // 157 ou radDeg(50*PI)
ex10
var equa1 = "120+cos(x)*15", stepj = 0.2;
var equa2 = "x", borne = [radDeg(PI*2),0], stepa = -radDeg(PI/110);
Attention! dans ce cas signe - pour stepa
A vous de découvrir les autres exemples...
Attention les dimensions de l'objet initial influent beaucoup sur le résultat!
Amusez vous!
René
Le script...
// JavaScript Document for Illustrator
// rotation autour point 04.js
// transformed selection based on equations
// René Landry - 11/04/2021
var PI = Math.PI;
//INIT ----------
var tend = false; // true PLACEATEND false PLACEATBEGINNING
var dec = 0; // décalage en plus ou en moins sur le rayon
var propdec = 0; // dec proportionnel à la hauteur de l'objet
var trajectoire = false; // si true affiche la trajectoire de l'objet (segments rectilignes)
var coulTraj = macmykColor(0,100,100,0); // couleur de la trajectoire
var coulCercle = macmykColor(0,100,0,0); // couleur du cercle de base
var epTraj = 1.5; // largeur contour de la trajectoire
var epCercle = 2; // largeur contour du cercle de base
// ex1
var equa1 = "1*x", stepj = 1.1;
var equa2 = "x", borne = [15,15*26], stepa = 15;
// ex2
//var equa1 = "x*x", stepj = 1.1; //1.1
//var equa2 = "x", borne = [15,15*26], stepa = 15;
// ex3
//var equa1 = "100+20*cos(Math.pow(x,1.5))", stepj = 0.1;
//var equa2 = "5*x/2", borne = [0,120], stepa = 1;
// ex4
//var equa1 = "90+20*cos(3*x/4)", stepj = 0.1;
//var equa2 = "5*x/2", borne = [0,600], stepa = 0.8;
// ex5
//var equa1 = "120-Math.pow(x,1.2)+20*cos(3*x/4)", stepj = 0.1;
//var equa2 = "5*x/2", borne = [0,300], stepa = 0.4;
// ex6
//var equa1 = "120-Math.pow(x,1.2)+20*cos(3*x/4)", stepj = 0.1;
//var equa2 = "5*x/2", borne = [300,0], stepa = -0.4;
// ex7
//var equa1 = "120-Math.pow(x,1.2)+20*cos(3*x/4)", stepj = 0.1;
//var equa2 = "Math.pow(x,1.8)", borne = [60,157], stepa = 0.1;
// ex8
//var equa1 = "110", stepj = 1.1;
//var equa2 = "x", borne = [0,radDeg(2*PI)], stepa = radDeg(PI/6);
// ex9
//var equa1 = "120+cos(x)*20", stepj = 0.4;
//var equa2 = "x", borne = [0,radDeg(2*PI)], stepa = radDeg(PI/110);
// ex10
//var equa1 = "120+cos(x)*15", stepj = 0.2;
//var equa2 = "x", borne = [radDeg(PI*2),0], stepa = -radDeg(PI/110);
//----------------
alert("rotation autour point 04")
function main() {
var idoc = app.activeDocument;
if (idoc.selection.length == 0) { alert("Vous n'avez rien sélectionné ?"); return;}
var selectedItems = selection;
var nbItem = selectedItems.length;
selection = null;
var k = 1;
while (selectedItems.length) {
var sel = selectedItems.pop();
var gr, cc, q, r, angle, line;
gr = idoc.groupItems.add();
if (trajectoire) {
line = sel.layer.pathItems.add();
line.name = "line "+k; k++;
}
p = sel.position;
cc = [p[0]+sel.width/2,p[1]-sel.height/2]; // centre de rotation
if (!/x/.test(equa1)) {
var ellips = sel.layer.pathItems.ellipse(cc[1]+equa1*1,cc[0]-equa1*1,equa1*2,equa1*2,false,true);
attrbut(ellips,epCercle,coulCercle);
}
q = 0;
if (k == 1 && trajectoire) pointSuivant(cc,line);
if (borne[0] > borne[1] && stepa < 0)
for (var a = borne[0], j = 0; a > borne[1]; a += stepa, j += stepj) {
traitement(); q++;
}
else if (stepj > 0 && stepa > 0)
for (var a = borne[0], j = 0; a < borne[1]; a += stepa, j += stepj) {
traitement(); q++;
}
alert("Nombre de d'objets créés = "+q);
if (trajectoire) {
attrbut(line,epTraj,coulTraj);
}
redraw();
}
function traitement() {
r = cal(j,equa1);
angle = cal(a,equa2);
autourpt(gr,sel,dec,cc,angle,r,propdec,tend,line);
}
}
//-------
if (app.documents.length > 0) main();
//-------
function attrbut(obj,w,c) {
with(obj) {filled = false; strokeWidth = w; strokeColor = c; trokeDashes = [];}
}
function autourpt(relativeobj,obj,d,o,t,r,propd,tend,line)
{ // Rotation autour du point o de rayon r
var T = tend ? ElementPlacement.PLACEATEND : ElementPlacement.PLACEATBEGINNING;
var tr = degRad(t);
r += obj.height*propd+d; // décalage
obj = obj.duplicate(relativeobj,T);
obj.position = [o[0]-obj.width/2+r*cos(tr),o[1]+obj.height/2+r*sin(tr)];
if (line != undefined) {
pointSuivant([obj.position[0]+obj.width/2,obj.position[1]-obj.height/2],line);
}
obj.rotate(t-radDeg(PI/2));
}
//-------
function cal(x,equa) {
return eval(equa);
}
//-------
function macmykColor( c, m, j, n )
{ //crée une nouvelle couleur CMJN
var cmykColor = new CMYKColor();
cmykColor.cyan = c;
cmykColor.magenta = m;
cmykColor.yellow = j;
cmykColor.black = n;
return cmykColor;
}
//-------
function pointSuivant(pt,line)
{// Ajoute un point a un tracé ou place le 1r point
var newPoint = line.pathPoints.add();
newPoint.anchor = pt;
newPoint.leftDirection = newPoint.anchor;
newPoint.rightDirection = newPoint.anchor;
newPoint.pointType = PointType.CORNER;
}
//--------------------------------------------------------------
function sin(a) {return Math.sin(a);} // sin(a)
function cos(a) {return Math.cos(a);} // cos(a)
function degRad(a) {return PI/180*a;} // Conversion degre > radian
function radDeg(a) {return 180/PI*a;} // Conversion radian > degre
//--------------------------------------------------------------
Copy link to clipboard
Copied
great post! thanks for such detailed explanation along with screenshots Rene.