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;
}