Skip to main content
Guimzen
Participating Frequently
June 24, 2015
Question

Calculer la surface d'un objet

  • June 24, 2015
  • 3 replies
  • 13548 views

Bonjour, comment faire pour calculer la surface d'un objet dans Illustrator cc 2015 ?
je possède un script conçu par Scriptomedia, qui permet de le faire mais le facteur d'échelle utilisé (ligne 11 > var ech = 30) me donne des résultats erronés.

Or, je travaille à échelle 1/150 dans les faits. Que dois-je faire ou modifier pour obtenir des résultats cohérents ? merci.


Le script ressemble à ceci :

-----------------

// surface6.js

/* Calcule la surface des traces selectionnes et effectue la somme

   en pt2 mm2 m2 et a echelle 1:1 variable ech facteur d'echelle defaut 30

   les variable ard... correspondent au nb de chiffres apres la virgule pour arrondi

   variable er ecart  en + et - pour lequel les mm2 sont arrondis au nombre entier

   affichage sur le plan de travail dans un nouveau calque*/

//INIT------------------------------------

var coulText = macmykColor(25,100,100,25);

var police ="Arial-ItalicMT";

var corps = 12;

var ech = 30;

var ardmm = 2;

var ardm = 6;

var ardp = 3;

var er = 0.1;

//----------------------------------------

if (app.documents.length > 0) {

   var docRef = app.activeDocument;

       docRef.rulerOrigin = [0,0];

   var erreur = 0.05; // % erreur pour le test de surface du cercle

   var Version  = parseInt(version);

   if (parseInt(version) >= 12) {

   var point = UnitValue (1,"Pt");

   var mm = UnitValue (1,"mm");//alert(mm)

   var m = UnitValue (1,"m");

   var pouce = UnitValue (1,"in");

   } else {

      var mm = uniteMesure("mm");//alert(mm)

      var mm1 = uniteMesure("mm")*ech;//alert(mm)

      var pouce = uniteMesure("in");

      var pouce1 = uniteMesure("in")*ech;

      var point = uniteMesure("pt");

      var point1 = uniteMesure("pt")*ech;

      var m = mm*1000;

      var m1 = m*ech;

      }

   var iCount = textFonts.length;

   var numPolice = detectPolice (police,iCount);

   var p; //compteurs

   var aire, smm, spouce, total = 0;

   var liste = initliste();

   var propObjets = new Array();

   var pathes = new Array();

   var selectedItems = selection;

   extractPathes(selectedItems,pathes);

   var endIndex = pathes.length;

   var ObjetName, aire, rayonNul;

       if (endIndex > 0) {

       nouveauLayer = docRef.layers.add();

       nouveauLayer.name = nomLayer("Aire");

         for (p = 0; p < endIndex; p++) {

         rayonNul = false;

           if (propObjet(pathes

,propObjets)) { //cercle

           aire = propObjets[2][1];

           }

           else aire = propObjets[2][0];

         pointText1(propObjets[0][0],propObjets[0][1],"p "+p,corps,numPolice,coulText);

         Sm   = getArrondi(aire/Math.pow(point*m,2),ardm);

         Sm1  = getArrondi(Sm*ech,ardm);

         Smm  = proche(getArrondi(aire/Math.pow(point*mm,2),ardmm),er);

         Smm1 = proche(getArrondi(Smm*ech,ardmm),er*ech);

         Spouce = getArrondi(aire/Math.pow(point*pouce,2),ardp);

           if (rayonNul) ObjetName = "point isole";

           else {

           ObjetName = pathes

.name;

           if (ObjetName != "")  ObjetName = ObjetName;

           else ObjetName = "Sans nom";

           }

         liste[0] += p+"\tSurface = "+getArrondi(aire,2)+"\r";

         liste[1] += Smm+"\r";

         liste[2] += Smm1+"\r";

         liste[3] += Sm+"\r";

         liste[4] += Sm1+"\r";

         liste[5] += ObjetName+"\r";

         total += aire;

         }

         afficheTab(20,corps*1.3*(p+6),liste);

             if (endIndex  != 1) {

             Sm   = getArrondi(total/Math.pow(point*m,2),ardm);

             Sm1  = getArrondi(Sm*ech,ardm);

             Smm  = proche(getArrondi(total/Math.pow(point*mm,2),ardmm),er);

             Smm1 = proche(getArrondi(Smm*ech,ardmm),er*ech);

             pointText1(20,corps*1.3*3,"Facteur d'Èchelle "+ech+"\rSurface totale   = "+getArrondi(total,2)+

             " pt2\t\tou "+Smm+" mm2\t\tou  "+Sm+" m2",corps,numPolice,coulText);

             pointText1(20,corps*1.3,"Surface ech 1:1 = "+getArrondi(total*ech,2)+

             " pt2\t\tou "+Smm1+" mm2\t\tou  "+Sm1+" m2",corps,numPolice,coulText);

             }

       } else alert("Au revoir, 1 selection est obligatoire","De Elleere");

} else alert("Pour l'execution de ce sript un document doit etre ouvert !","Script Alerte de Elleere !");

//---------------------------------------------

function proche(v,e)

{

var ar = Math.round(v);

if (Math.abs(v-ar) <= e) return ar;

return v;

}

function afficheTab(x,y,tab)

{

  var dec = 20, gout = 40;

     for (var i = 0; i < tab.length; i++) {

         pointText1(x,y,tab,corps,numPolice,coulText);

         var geo = [docRef.pageItems[0].geometricBounds];

         x += geo[0][2]-geo[0][0]+gout;

     }

}

function initliste() {

   return ["Objet de Rang\tpt2\r\r", " mm2\r\r", " 1:1 mm2\r\r", " m2\r\r", " 1:1 m2\r\r", " de nom\r\r"];

}

function propObjet(objetSelect,Cxy)

{ //

  var p1x, p1y, p2x, p2y, surface, aire, marge;

  var largeur, hauteur, Cx, Cy;

  var geo = [objetSelect.geometricBounds];

  p1x = geo[0][0]; p1y = geo[0][1]; p2x = geo[0][2]; p2y = geo[0][3];

  largeur = p2x-p1x;

  hauteur = p1y-p2y;

  if (objetSelect.pathPoints.length <= 2) {

  surface = aire = 0;

  }

  else {

  surface = Math.abs(objetSelect.area);

  aire = Math.PI*Math.pow((largeur+hauteur)/2,2)/4;

  }

  marge = aire*erreur/100;

        if (largeur == 0 && hauteur == 0) rayonNul = true; // rayon nul, point isole

        Cx = (p1x+p2x)/2;

        Cy = (p1y+p2y)/2;

        Cxy[0] = [Cx,Cy];

        Cxy[1] = [largeur,hauteur];

        Cxy[2] = [surface,aire];

        if (surface < aire+marge && surface > aire-marge)

        { // Si l'objet au premier plan est un cercle

        return true;

        }

  return false

}

function detectPolice(chaine,iCount) {

    for (var i = 0; i < iCount; i++) {

           if (police == app.textFonts.name) {

           return i;

           }

    }

}

function extractPathes(s,tabs){

  for(var i = 0; i < s.length; i++){

    if(s.typename == "PathItem" && !s.guides && !s.clipping){

      tabs.push(s);

    } else if(s.typename == "GroupItem"){

      // Cherche les objets de types dans ce groupe, recursivement

      extractPathes(s.pageItems, tabs);

    } else if(s.typename == "CompoundPathItem"){

      // Cherche les objets de type PathItem dans ce tracÈ transparent, recursivement

      extractPathes(s.pathItems,tabs);

    }

  }

}

function getArrondi(nb,N)

{ //arrondi nb ‡ N chiffres aprËs la virgule

  return Math.round(Math.pow(10,N)*nb)/Math.pow(10,N);

}

function inv(chaine) // fonction recursive

{ // inverse une chaine

if (chaine.length < 2) return chaine

return inv(chaine.substring(1))+chaine.substr(0,1)

}

function macmykColor(c,m,j,k)

{ //cree une nouvelle couleur CMJN

  var cmykColor = new CMYKColor();

  cmykColor.cyan = c;

  cmykColor.magenta = m;

  cmykColor.yellow = j;

  cmykColor.black = k;

  return cmykColor;

}

function nomLayer(nomLayer)

{ // Empeche les noms identiques, retourne le nom suivi d'un indice

      var nom, tnoms = new Array(), exist = false, indice = 0;

         for (k = 0; k < docRef.layers.length; k++) {

           nom = docRef.layers.name;

               if (nom.indexOf(nomLayer,0)!= -1) {

               tnoms[indice] = inv(nom);

               indice++;

               }

         }

      tnoms.sort();

      indice = 1; k = 0; nbExist = tnoms.length;

         while ((!exist || k < nbExist) && nbExist != 0) {

            if (parseInt(tnoms) == indice || k > nbExist-1) {

            k = 0;

            indice ++;

            }

            else {

            k++;

            exist = true

            }

         }

      return nomLayer+" "+indice;

}

function pointText1(x,y,text,corps,font,maCouleur)

{// Cree un element de bloc de texte de point

    var pointText = docRef.textFrames.add();

    pointText.contents =text;

    pointText.spacing = 0;

    pointText.position = [x,y];

    if (font != undefined)

    pointText.textRange.characterAttributes.textFont = app.textFonts[font];

    pointText.textRange.characterAttributes.fillColor = maCouleur;

    pointText.textRange.characterAttributes.size = corps;

}

function uniteMesure(monUnite) { // pour la version  CS 11

var uniteMesure = new Array();

uniteMesure[0] = ["cm","in","mm","pc","pt","Q","px"];

uniteMesure[1] = [28.34645,72,2.834645,12,1,0,709,1];

  for (var i = 0; i < uniteMesure[0].length; i++)

   if (uniteMesure[0] == monUnite) {

    unite = uniteMesure[1];

    continue;

   }

   return unite;

}

This topic has been closed for replies.

3 replies

fredsky2014
Known Participant
July 1, 2015

salut!

je pense qu'il faut se mettre en zoom 100% pour obtenir une échelle correcte.

zoom number (double) The zoom factor of this view, where 100.0 is 100%.

donc une ligne du genre :

app.documents[0].views[0].zoom= 100.0;

PS : pour mettre sous forme de code, utiliser l'option "éditeur avancé" dans ton message + mise en syntaxe= javascript

fred

renél80416020
Inspiring
July 9, 2015

Je suis l'auteur de ce script, pour toutes questions réponses allez sur Javascript pour Illustrator

Guimzen
GuimzenAuthor
Participating Frequently
July 9, 2015

Bonjour renél80416020. Merci encore pour ce script si vous en êtes l'auteur. J'ai finalement suivi les indications données par un autre forumiste via scriptomedia et j'arrive enfin à avoir des résultats cohérents. En effet il fallait rentrer pour l'échelle, la valeur correspondant à 150 au carré.

Guimzen
GuimzenAuthor
Participating Frequently
June 25, 2015

Merci pour votre réponse. J'ai eu beau changer l'échelle (150), mes résultats n'étaient pas du tout cohérents. Tant mieux si pour vous cela a fonctionné. Peut-être que j'en fait une mauvaise utilisation ou mon cas est peut-être trop complexe. Quoi qu'il en soit, je continue de creuser la question. Merci tout de même au développeur qui a fait un bon boulot car il fonctionne pour la majorité des cas.

Qwertyfly___
Legend
June 25, 2015

‌ccan you show a shape that gives bad result.

even provide a file to show what does not work.

if I know what does not work I may be able to work out what is wrong

Qwertyfly___
Legend
June 25, 2015

not sure what the problem is, may be a translation issue.

When I run this it works.

i set ech to 150.