• Global community
    • Language:
      • Deutsch
      • English
      • Español
      • Français
      • Português
  • 日本語コミュニティ
    Dedicated community for Japanese speakers
  • 한국 커뮤니티
    Dedicated community for Korean speakers
Exit
6

Turning an object around any point from equations without a spreadsheavory is neither csv

Advocate ,
May 15, 2021 May 15, 2021

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:
Capture tableau.PNG

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;
Capture petit.PNG

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;
Capture xx.PNG

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.
Capture dec.PNG

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;

renél80416020_0-1621098236975.pngrenél80416020_1-1621098263909.png

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;

renél80416020_2-1621098344966.png     renél80416020_3-1621098344967.png

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;

renél80416020_4-1621098390287.pngrenél80416020_5-1621098390289.png

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".

renél80416020_6-1621098477285.png

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;

renél80416020_7-1621098497644.png

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)

renél80416020_8-1621098516695.png

ex10
var equa1 = "120+cos(x)*15", stepj = 0.2;
var equa2 = "x", borne = [radDeg(PI*2),0], stepa = -radDeg(PI/110);

renél80416020_9-1621098566958.png

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
//--------------------------------------------------------------

 

 

 

 

 

TOPICS
Draw and design , Scripting

Views

201

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Adobe
Community Expert ,
May 15, 2021 May 15, 2021

Copy link to clipboard

Copied

LATEST

great post! thanks for such detailed explanation along with screenshots Rene. 

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines