6 Replies Latest reply on Jul 9, 2015 7:54 AM by Colsound

    Calculer la surface d'un objet

    Colsound

      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[p],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[p].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[i],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[i].name) {

                 return i;

                 }

          }

      }

      function extractPathes(s,tabs){

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

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

            tabs.push(s[i]);

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

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

            extractPathes(s[i].pageItems, tabs);

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

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

            extractPathes(s[i].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[k].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[k]) == 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][i] == monUnite) {

          unite = uniteMesure[1][i];

          continue;

         }

         return unite;

      }