Toutes mes réponses sur les forums
-
AuteurRéponses
-
bebarth
Maître des clésbonjour,
Il faut ajouter 2 scripts d'”Actions du document”, mais cela dépend de si tous les champs ont ou pas la même couleur de fond.Admettons qu’il sont tous en “Light Gray”.
Script “Le document sera imprimé” :
for (var i=0; i<this.numFields; i++) this.getField(this.getNthFieldName(i)).fillColor=color.transparent;
Script “Le document a été imprimé” :
for (var i=0; i<this.numFields; i++) this.getField(this.getNthFieldName(i)).fillColor=color.ltGray;
Si tous les champs ont une couleur différente (ou presque…).
Script “Le document sera imprimé” :
lesCouleurs=[];
for (var i=0; i<this.numFields; i++) {
lesCouleurs.push(this.getField(this.getNthFieldName(i)).fillColor);
this.getField(this.getNthFieldName(i)).fillColor=color.transparent;
}
Script “Le document a été imprimé” :
for (var i=0; i<this.numFields; i++) this.getField(this.getNthFieldName(i)).fillColor=lesCouleurs;
@+
😎bebarth
Maître des clésbonjour,
Sinon ta proposition précédente me va très bien.
Très bien ! Mais perso il fallait que je trouve.
Voici donc un script qui fonctionne avec ton fichier :var lesChamps=[];
for (var i=0; i<this.numFields; i++) {
var nomChamp=this.getNthFieldName(i);
if (typeof this.getField(nomChamp).page=="object") {
lesChamps.push([nomChamp,this.getField(nomChamp).page])
}
}
if (lesChamps.length) {
var leTexte="";
for (var k=0; k<lesChamps.length; k++) {
var nom=lesChamps[k][0];
var lesPages=lesChamps[k][1];
for (var j=0; j<lesPages.length; j++) lesPages[j]=lesPages[j]+1;
var frequences={};
for (var j=0; j<lesPages.length; j++) {
var nb=lesPages[j];
if (frequences[nb]===undefined) frequences[nb]=1;
else frequences[nb]++;
}
var parPage=[];
var txt="• \""+nom+"\" - ";
for (var nb in frequences) parPage.push(frequences[nb]+" fois en page "+nb);
var parPage=parPage.toString();
var n=parPage.lastIndexOf(",");
if (n>-1) var parPage=(parPage.substring(0,n)+" et "+parPage.substring(n+1)).replace(/,/g,", ");
if (!leTexte) leTexte+="Champs dupliqués :";
leTexte+="\r"+txt+parPage+".";
}
console.clear();
console.show();
console.println(leTexte);
app.alert(leTexte,3);
} else app.alert("Tout est OK !!!",3);
@+
😎-
Cette réponse a été modifiée le il y a 9 mois et 2 semaines par
bebarth.
Attachments:
You must be logged in to view attached files.bebarth
Maître des clésJe pense que c’est une erreur de script.
Ce champ est le dernier et si on le supprime, ça fait la même chose avec le nouveau dernier champ.
De ce que j’ai pu constater, ça ne fait ça que si il n’y a pas de champs multiples.
Je ne peux pas regarder aujourd’hui…
@+
😎bebarth
Maître des clésbonjour,
Etrange, effectivement ! Juste ce champ… Je regarde dès que je peux.@+
😎bebarth
Maître des clésL’idéal serait encore de ne pas citer x fois la page lorsque le champ se trouve plusieurs fois sur cette page…
Ça me trottait dans la tête :
for (var i=0; i<this.numFields; i++) {
var nomChamp=this.getNthFieldName(i);
if (typeof this.getField(nomChamp).page=="object") {
var lesPages=this.getField(nomChamp).page;
}
}
for (var j=0; j<lesPages.length; j++) lesPages[j]=lesPages[j]+1;
var frequences={};
for (var i=0; i<lesPages.length; i++) {
var nb=lesPages;
if (frequences[nb]===undefined) frequences[nb]=1;
else frequences[nb]++;
}
var parPage=[];
var txt="Le champ \""+nomChamp+"\" n'est pas unique; il se trouve "
for (var nb in frequences) parPage.push(frequences[nb]+" fois en page "+nb);
if (parPage.length>1) txt+=": ";
var parPage=parPage.toString();
var n=parPage.lastIndexOf(",");
if (n>-1) var parPage=(parPage.substring(0,n)+" et "+parPage.substring(n+1)).replace(/,/g,", ");
app.alert(txt+=parPage+".",3);
@+
😎bebarth
Maître des clésMaintenant je vais essayer de transformer la valeur this.getField(nomChamp).page pour que la numérotation commence à 1 et non pas à 0. Je pensais qu’il fallait convertir cette chaine en nombre avant de lui ajouter 1 mais je crois que ce n’est pas si simple.
Tu peux écrire :
function doublons() {
for (var i=0; i<this.numFields; i++) {
var nomChamp=this.getNthFieldName(i);
if (typeof this.getField(nomChamp).page=="object") {
var lesPages=this.getField(nomChamp).page;
for (var j=0; j<lesPages.length; j++) lesPages[j]=lesPages[j]+1;
var lesPages=lesPages.toString();
var n=lesPages.lastIndexOf(",");
var lesPages=(lesPages.substring(0,n)+" et "+lesPages.substring(n+1)).replace(/,/g,", ");
app.alert("Le champ \""+nomChamp+"\" n'est pas unique; il se trouve sur la(les) page(s) : "+lesPages,3);
}
}
}
L’idéal serait encore de ne pas citer x fois la page lorsque le champ se trouve plusieurs fois sur cette page…
@+
😎bebarth
Maître des clésbonjour,
Si tu listes juste les noms des champs, tu ne trouveras pas de doublons !
Pour cela, il faut vérifier le paramètre “page” de chaque champ : si c’est un nombre le champ n’existe qu’une fois et si c’est une table, elle indique ou sont ces champs.Voici un script simple pour vérifier :
for (var i=0; i<this.numFields; i++) {
var nomChamp=this.getNthFieldName(i);
if (typeof this.getField(nomChamp).page=="object") app.alert("Le champ \""+nomChamp+"\" est présent sur en page(s) : "+this.getField(nomChamp).page,3);
}
Ici la table des pages est listée, donc les numéros sont basés sur 0 et peuvent être identiques…@+
😎bebarth
Maître des clésbonjour,
Voici quelques lignes que j’avais écrites il y a un certain temps et que j’utilise pour gérer les doublons d’une table.// Suppression des doublons
var laTable=["pomme","banane","orange","pomme","banane","pomme"];
console.println("laTable : "+laTable);
function sansDoublons(uneTable) {
return uneTable.filter((valeur,indice)=>uneTable.indexOf(valeur)===indice);
}
console.println("laTable sans doublons mais non triée : "+sansDoublons(laTable));
// Retour : laTable sans doublons mais non triée : pomme,banane,orange
// Suppression des doublons
var laTable=["pomme","banane","orange","pomme","banane","pomme"];
console.println("laTable : "+laTable);
function sansDoublons(uneTable){
var newArr=[];
for (var i=0; i<uneTable.length; i++) {
if (newArr.indexOf(uneTable)===-1) newArr.push(uneTable);
}
return newArr;
}
console.println("laTable sans doublons mais non triée : "+sansDoublons(laTable));
// Retour : laTable sans doublons mais non triée : pomme,banane,orange
// Tous les doublons
var laTable=["pomme","banane","orange","pomme","banane","pomme"];
console.println("laTable : "+laTable);
function lesDoublons(uneTable) {
return uneTable.filter((valeur,indice)=>uneTable.indexOf(valeur)!==indice);
}
console.println("Tous les doublons : "+lesDoublons(laTable));
// Retour : Tous les doublons : pomme,banane,pomme
// Tous les doublons uniques
var laTable=["pomme","banane","orange","pomme","banane","pomme"];
console.println("laTable : "+laTable);
function lesDoublonsUniques(uneTable){
var newArr=[];
for (var i=0; i<uneTable.length; i++) {
if (newArr.indexOf(uneTable)===-1 && uneTable.indexOf(uneTable)!==i) newArr.push(uneTable);
}
return newArr;
}
console.println("Tous les doublons : "+lesDoublonsUniques(laTable));
// Retour : Tous les doublons : pomme,banane
// Suppression des doublons et tri
var laTable=["pomme","banane","orange","pomme","banane","pomme"];
console.println("laTable : "+laTable);
function triSansDoublons(uneTable) {
return uneTable.sort().filter(function(valeur,indice,cetteTable) {
return !indice || valeur!=cetteTable[indice-1];
});
}
console.println("laTable sans doublons mais triée : "+triSansDoublons(laTable));
// Retour : laTable sans doublons mais triée : banane,orange,pomme
@+
😎bebarth
Maître des clésbonjour,
Voici ce que j’ai fait aujourd’hui. J’espère que cela te convient. Pour cacher les fichiers attaché on pourrait faire une tempo toutes les secondes par exemple, mais ça veut dire que le fichier est perpétuellement en calcul !Voici tous les scripts que j’ai utilisé. Si tu es débutant ça va peut-être un peu compliqué pour toi à comprendre : Il y a des scripts de document, des fonctions, une page modèle…
// Script de document
//
var nbDepart=0;
for (var i=0; i<this.numFields; i++) {
if (/^Départ\.\d+/.test(this.getNthFieldName(i))) nbDepart++;
}
var fichier=this.getDataObjectContents("Départ.csv");
var donnees=util.stringFromStream(fichier);
var lignes=donnees.split("\r\n");
var colonnes=new Array();
for (var i=0 ; i<lignes.length ; i++) colonnes=lignes.split(";");
var colonne0=[];
for (var j=0 ; j<colonnes.length ; j++) {
if (colonnes[j][0]) colonne0.push([colonnes[j][0]]);
}
for (var i=1; i<=colonne0.length; i++) {
eval("var colonne"+(i+1)+"=[];");
for (var j=0 ; j<colonnes.length ; j++) {
if (colonnes[j]) eval("colonne"+(i+1)).push(colonnes[j]);
}
}
colonne0[0].push(0);
for (var i=1; i<colonne0.length; i++) {
colonne0.push(eval("colonne"+(i+1)))
}
// Fichier "Départ Arrivée.csv"
var fichierDA=this.getDataObjectContents("Départ Arrivée.csv");
var donneesDA=util.stringFromStream(fichierDA);
var lignesDA=donneesDA.split("\r\n");
var colonnesDA=new Array();
for (var i=0 ; i<lignesDA.length ; i++) colonnesDA=lignesDA.split(";");
for (var i=1; i<=colonnesDA[0].length; i++) {
eval("var colonne"+(i+1)+"DA=[\"- Sélectionnez -\"];");
for (var j=1 ; j<colonnesDA.length ; j++) {
if (colonnesDA[j]) eval("colonne"+(i+1)+"DA").push(colonnesDA[j]);
}
}
//
var leCanal=this.getField("Canal").value;
this.getField("Canal").clearItems();
this.getField("Canal").setItems(colonne0);
this.getField("Canal").value=leCanal;
//
function menuCanal(laValeur) {
try {
for (var i=0; i<nbDepart; i++) {
this.getField("Départ."+i).clearItems();
this.getField("Arrivée."+i).clearItems();
}
if (laValeur!=0) {
var leMenu=laValeur.split(",");
var ind=leMenu[0].substr("Canal ".length);
leMenu[0]=["- Sélectionnez -",0];
for (var i=1; i<leMenu.length; i++) {
leMenu=[leMenu,eval("colonne"+(i+1)+"DA")];
}
for (var i=0; i<nbDepart; i++) {
this.getField("Départ."+i).clearItems();
this.getField("Départ."+i).setItems(leMenu);
}
}
} catch(e) {}
}
//
function menuDepart(ind,laValeur) {
this.getField("Arrivée."+ind).clearItems();
this.getField("Arrivée."+ind).setItems(laValeur.split(","));
}
function menuArrivee(leChamp) {
try {
var ind=leChamp.name.substring(leChamp.name.indexOf(".")+1);
var laTable=this.getField("Départ."+ind).value.split(",");
for (var i=0; i<nbDepart; i++) {
if (i==ind) continue;
for (j=0; j<leChamp.numItems; j++) {
if (this.getField("Départ."+i).getItemAt(this.getField("Départ."+i).currentValueIndices,false)==this.getField("Départ."+ind).getItemAt(this.getField("Départ."+ind).currentValueIndices,false) && this.getField("Arrivée."+i).value==laTable[j]) laTable.splice(j,1);
}
}
var lArrivee=leChamp.value;
leChamp.clearItems();
leChamp.setItems(laTable);
leChamp.value=lArrivee;
} catch(e) {}
}
// Script de touches personnalisé Menu "Canal"
if (!event.willCommit) menuCanal(event.changeEx);
// Script de touches personnalisé Menu "Départ"
if (!event.willCommit) menuDepart(event.target.name.substring(event.target.name.indexOf(".")+1),event.changeEx);
// Ajout Script de touches personnalisé de tous les Menus "Départ"
for (var i=0; i<30; i++) {
this.getField("Départ."+i).setAction("Keystroke","if (!event.willCommit) menuDepart(event.target.name.substring(event.target.name.indexOf(\".\")+1),event.changeEx);");
}
// Souris entrée de tous les Menus "Arrivée"
menuArrivee(event.target);
// Ajout Script Souris entrée de tous les Menus "Arrivée"
for (var i=0; i<30; i++) {
this.getField("Arrivée."+i).setAction("MouseEnter","menuArrivee(event.target);");
}
// Script d'ouverture de page
if (app.viewerType!="Exchange-Pro") this.viewState={overViewMode:2};
this.viewState={overViewMode:5}
// Script Affichage Page 2
var modeles=this.templates;
for (i=0; i<modeles.length; i++) {
if (modeles.name=="page2") {
modeles.hidden=(event.target.value=="Off");
break;
}
}
this.pageNum=0;
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésOn peut pas dupliquer le même choix de la liste déroulante (Départ) ou bien (Arrivée) de la page 1 sur les autre listes déroulante de la page 2. C’est-à-dire, si on sélectionne un choix (Départ et Arrivée) sur la page 1 pdf , les autres listes déroulantes de page 2 sera vide, afin qu’on aura la possibilité de sélectionner un autre choix diffèrent sur chaque liste déroulante (Départ et Arrivée) page2.
Ça demande réflexion… une chose est sûre c’est que ce n’est pas simple et que les différents noms de champs ne peuvent pas être identiques à ceux de la page 1. Je regarderai ça jeudi.
(page 2 c’est une page supplémentaire, c’est pour cela que je voudrais que cette page soit masquer et elle sera afficher si besoin via case à cocher non imprimable).
Pages 2 et 3 donc ! Ça ne devrait pas être compliqué, dès que le problème précédent sera résolu.
D’autre question s’ils vous plait, serait-il possible masquer les pièces jointes (excel.csv) pour que les autres utilisateurs de ce fichier pdf ne pourront pas accéder au pièces jointes, et ils n’auront donc pas la possibilité de les modifier?
Ça c’est une bonne question dont je n’ai pas encore la réponse. On pourra peut-être caché ce panneau pour les utilisateurs de Reader, par exemple… Faut essayer.
@Merlin : Tu as une idée ???@+
😎bebarth
Maître des clésbonjour,
Voici déjà un fichier pour la première partie. Les données doivent être en pièces jointes du fichier .pdf au format .csv. Il n’est donc pas possible d’avoir des onglets et il faut donc joindre 2 fichiers séparés.
Et les scripts utilisés dans ce fichier :
// Script de document
//
var fichier=this.getDataObjectContents("Départ.csv");
var donnees=util.stringFromStream(fichier);
var lignes=donnees.split("\r\n");
var colonnes=new Array();
for (var i=0 ; i<lignes.length ; i++) colonnes=lignes.split(";");
var colonne0=[];
for (var j=0 ; j<colonnes.length ; j++) {
if (colonnes[j][0]) colonne0.push([colonnes[j][0]]);
}
for (var i=1; i<=colonne0.length; i++) {
eval("var colonne"+(i+1)+"=[];");
for (var j=0 ; j<colonnes.length ; j++) {
if (colonnes[j]) eval("colonne"+(i+1)).push(colonnes[j]);
}
}
colonne0[0].push(0);
for (var i=1; i<colonne0.length; i++) {
colonne0.push(eval("colonne"+(i+1)))
}
//
var fichier1=this.getDataObjectContents("Départ Arrivée.csv");
var donnees1=util.stringFromStream(fichier1);
var lignes1=donnees1.split("\r\n");
var colonnes1=new Array();
for (var i=0 ; i<lignes1.length ; i++) colonnes1=lignes1.split(";");
for (var i=1; i<=colonnes1[0].length; i++) {
eval("var colonne"+(i+1)+"1=[\"- Sélectionnez -\"];");
for (var j=1 ; j<colonnes1.length ; j++) {
if (colonnes1[j]) eval("colonne"+(i+1)+"1").push(colonnes1[j]);
}
}
//
var leCanal=this.getField("Canal").value;
this.getField("Canal").clearItems();
this.getField("Canal").setItems(colonne0);
this.getField("Canal").value=leCanal;
// Script de touches personnalisé Menu "Canal"
if (!event.willCommit) {
this.getField("Départ").clearItems();
this.getField("Arrivée").clearItems();
if (event.changeEx!=0) {
var leMenu=event.changeEx.split(",");
var ind=leMenu[0].substr("Canal ".length);
leMenu[0]=["- Sélectionnez -",0];
for (var i=1; i<leMenu.length; i++) {
leMenu=[leMenu,eval("colonne"+(i+1)+"1")];
}
this.getField("Départ").clearItems();
this.getField("Départ").setItems(leMenu);
}
}
// Script de touches personnalisé Menu "Départ"
if (!event.willCommit) {
this.getField("Arrivée").clearItems();
if (event.changeEx!=0) {
this.getField("Arrivée").clearItems();
this.getField("Arrivée").setItems(event.changeEx.split(","));
}
}
Le reste des listes déroulantes de la page 2 du PDF seront alimentées séparément quand on sélectionnera un choix, et non pas toutes à la fois avec le même choix. Et serait-il possible que la deuxième page PDF soit masquée au besoin via une case à cocher non imprimable ?
Pour ça il me faudra quelques explications car je n’ai pas compris…
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésJe regarde ça dès que possible.
@+
😎bebarth
Maître des clésbonjour,
Moi je veux bien aider, mais il faudrait m’expliquer car je n’ai rien compris à ce que tu voulais faire…@+
😎bebarth
Maître des clésbonjour,
Comme indiqué précédemment, il faut utiliser “valueAsString” pour ces 2 fonctions :
function CorrQuest(ind) {
var q=this.getField("Q."+ind);
var r=this.getField("R."+ind);
if (event.target.value!="Off") {
var f=this.addField("tempo."+ind, r.type, q.page, q.rect);
for (var j in f) {
try {
if (typeof f[j]!="function" && j!="name" && j!="type" && j!="page" && j!="rect") f[j]=r[j];
} catch(e) {}
}
f.value=r.valueAsString.split("|")[0];
f.textSize=q.textSize;
q.display=display.hidden;
} else {
this.removeField("tempo."+ind);
q.display=display.visible;
q.readonly=false;
}
}
et
function corriger(ind) {
var a = this.getField("cAc."+ind+"."+0).value;
console.println("indice : " +ind);
var nCompt = 0;
for (var i = 0 ; i < this.numFields ; i++) {
var oChamp = this.getField(this.getNthFieldName(i));
if ((oChamp.type == "checkbox") && (/cAc./.test(oChamp.name))) {nCompt = nCompt + 1;}
}
var nbChamps=0;
for (var i=0; i<this.numFields; i++) {
if (this.getNthFieldName(i).indexOf("R."+ind+".")==0) nbChamps++;
}
for (b=1 ; b<=nbChamps ; b++) {
var q=this.getField("Q."+ind+"."+b);
var r=this.getField("R."+ind+"."+b);
if (a!="Off") {
var f=this.addField("tempo."+ind+"."+b, r.type, q.page, q.rect);
for (var j in f) {
try {
if (typeof f[j]!="function" && j!="name" && j!="type" && j!="page" && j!="rect") f[j]=r[j];
} catch(e) {}
}
f.value=r.valueAsString.split("|")[0];
f.textSize=q.textSize;
q.display=display.hidden;
this.getField("cAc."+ind+"."+b).value = 1;
} else {
this.removeField("tempo."+ind);
q.display=display.visible;
q.readonly=false;
this.getField("cAc."+ind+"."+b).value = "Off";
}
}
}
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Par contre si je sélectionne les 3 premières cases par exemple (cAc.3.1 à c.A.c.3.3), là tout va bien mais quand je décoche l’une de ces cases (par exemple c.A.c.3.2), alors les 2 champs Q.3.1 et Q.3.3 restent masqués alors que je voudrais qu’ils redeviennent visibles.
Lorsque tu supprimes le champ, il faut ajouter l’indice au nom du champ :
this.removeField("tempo."+ind);
L’autre truc que je n’arrive pas à faire, c’est la mise en place de la case : “Case.3” permettant de cocher ou décocher d’un seul coup toutes les cases c.A.c…..
Les “+” sont mal placés. Il faut écrire :
...this.getField("cAc."+ind+"."+b).value = "Off";...
et...this.getField("cAc."+ind+"."+b).value =1;...
Par contre cela coche ou décoche juste les cases mais n’affiche ou ne cache pas les réponses comme lorsque l’on coche les cases individuellement. pour cela il faudrait mettre cela en fonction puis faire une boucle pour rappeler ces fonctions.Je regarderai lundi si tu n’y arrives pas !
@+
😎bebarth
Maître des clésbonjour,
dans le cas ou plusieurs réponses sont acceptées (dans le champ R.a.b avec le séparateur | entre chaque réponse acceptable), j’aimerais que dans ce cas précis, seule la chaine de caractère se trouvant avant le 1er séparateur s’affiche.
Il faut rajouter cette ligne :
f.value=r.value.split("|")[0];
J’aimerais également que la taille de la police du champ R.a.b soit remplacée par celle du champ Q.a.b lorsque la case est cochée.
Et celle-ci :
f.textSize=q.textSize;
Ci-joint un nouveau fichier.
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésJe me suis posé la question à savoir s’il n’y avait qu’une seule ou plusieurs cases à cocher.
En fait, cela dépend de ce que tu veux faire exactement. Si il y a une case par question, il faut rajouter l’indice au nom du champ « tempo » créé (ex. : tempo.2.16 pour mon fichier).
@+
😎bebarth
Maître des clésbonjour,
Pour ma proposition je crée un champ temporaire identique au champ réponse à la position du champ question que je supprime lorsque la case est décochée. Le script de cet exemple pour la question/réponse 2.16 est :
var ind=event.target.name.substring(event.target.name.indexOf(".")+1);
var q=this.getField("Q."+ind);
var r=this.getField("R."+ind);
if (event.target.value!="Off") {
var f=this.addField("tempo", r.type, q.page, q.rect);
for (var j in f) {
try {
if (typeof f[j]!="function" && j!="name" && j!="type" && j!="page" && j!="rect") f[j]=r[j];
} catch(e) {}
}
q.display=display.hidden;
r.display=display.hidden;
} else {
this.removeField("tempo");
q.display=display.visible;
r.display=display.visible;
}
Juste une remarque au sujet du cartouche représenté : ne manque-t-il pas le symbole de disposition des vues (représenté par un cône et sa vue de gauche – à droite pour l’ISO) ? Indispensable pour la lecture des plans mécaniques…
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésIl faut utiliser « valueAsString » au lieu de « value ». « replace » fonctionne avec une chaîne de caractères mais pas avec un nombre.
123 est un nombre alors que 123|124 est une chaîne de caractères. « valueAsString » transforme le nombre en chaîne de caractères !
@+
😎bebarth
Maître des clésJ’ai fait ça de tête pour l’explication de la déclaration des variables… C’est même un peu plus complexe mais il faudrait que je reprenne mes notes pour expliquer plus en détail ! Par contre je ne sais pas si ce qu’est valable pour Acrobat l’est également pour ton logiciel. J’espère que oui !
@+
😎bebarth
Maître des clésC’est étrange !!!
En fait, la façon de déclarer les variables définie le “niveau de portée” des variables.- Une variable déclarée par “var” (var x=”toto”) à une portée limitée à l’environnement ou est déclarée cette variable : une fenêtre de document, une boite de dialogue,…
- Si il n’y a rien pour la déclarer (x=”toto”), sa portée est limitée à toutes les fenêtres ou boites de dialogue utilisées lors de l’exécution du script.
- Si elle est déclarée de façon globale (global.x=”toto”), sa portée est l’environnement total d’Acrobat. On peut fermer un fichier et en ouvrir un autre, la variable n’est pas perdue tant qu’on ne quitte pas Acrobat.
C’est pour cela que dans cet exemple, les variables qui seront utilisées lorsque la boite de dialogue est fermée doivent être déclarée sans “var”. D’où “le champ “undefined” n’existe pas”.
Dans le script que j’ai écris, je ne pensais pas l’utiliser depuis un bouton. Je l’ai testé directement depuis la console et il fonctionne bien. Par contre, depuis un bouton il faut retirer les privilèges et trustedFunction qui ne fonctionnent pas à ce niveau.
J’ai également modifié légèrement les lignes pour le repositionnement du champ qui ne fonctionnait pas bien avec ton document (pourquoi ???).Ci-joint un nouveau fichier qui fonctionne chez moi. Dis-moi si c’est OK pour toi.
@+
😎-
Cette réponse a été modifiée le il y a 10 mois par
bebarth.
Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Voici le script pour centrer un champ horizontalement en milieu de page.nbChamps=this.numFields;
if (nbChamps) {
var leChamp="- Liste des champs -";
var listeChamps="var listeChamps \= \{\""+leChamp+"\": "+(nbChamps+1)+",";
for (var i=0; i < nbChamps; i++) {
var nomChamp=this.getNthFieldName(i);
if (typeof this.getField(nomChamp).page!="object") {
listeChamps+="\""+nomChamp+"\": "+(-1*(i+1)).toString()+",";
} else {
for (var j=0; j<this.getField(nomChamp).page.length; j++) listeChamps+="\""+nomChamp+"."+j+"\": "+(-1*(i+1)).toString()+",";
}
}
var listeChamps=listeChamps.substring(0, listeChamps.length-1);
listeChamps+="\}";
eval(listeChamps);
var bDialogue={
initialize: function(bDialogue) {
this.loadDefaults(bDialogue);
},
loadDefaults: function(bDialogue) {
bDialogue.load({
LCha: listeChamps,
})
},
validate: app.trustedFunction(function(bDialogue) {
app.beginPriv();
var oRslt=bDialogue.store();
var elements=bDialogue.store()["LCha"];
var testOK=true;
for (var i in elements) {
if (elements>0) {
valeurListe=listeChamps;
nomListe=i;
}
}
if (valeurListe>0 && (oRslt["nmCh"]=="" || (/^\s+|\s+$/gm).test(oRslt["nmCh"]))) {
var txt="Veuillez sélectionner ou indiquer un nom de champ.";
var testOK=false;
} else {
if (valeurListe>0) nmChamp=oRslt["nmCh"];
else nmChamp=nomListe;
try {
laPage=getField(nmChamp).page;
} catch(e) {
var txt="Le champ \""+nmChamp+"\" n'existe pas.";
var testOK=false;
}
}
if (!testOK) app.alert(txt,3);
return testOK;
app.endPriv();
}),
description: {
name: "Centrer un champ",
elements: [
{
type: "view",
elements: [
{
type: "view",
alignment: "align_fill",
elements: [
{
type: "static_text",
name: "Nom du champ",
font: "dialog",
bold: true,
},
{
type: "static_text",
name: "Sélectionnez...",
},
{
type: "popup",
item_id: "LCha",
width: 150,
alignment: "align_fill",
},
{
type: "static_text",
name: "ou indiquez son nom :",
},
{
type: "edit_text",
item_id: "nmCh",
height: 20,
alignment: "align_fill",
},
]
},
{
type: "gap",
height: 5
},
{
type: "ok_cancel",
},
]
},
]
}
};
if("ok"==app.execDialog(bDialogue)){
var aRect=this.getField(nmChamp).rect;
aRect[0]=(this.getPageBox()[2]/2)-(aRect[2]/2);
aRect[2]=(this.getPageBox()[2]/2)+(aRect[2]/2);
this.getField(nmChamp).rect=aRect;
}
} else app.alert("Il n'y a pas de champ dans ce document.",3);
@+
😎bebarth
Maître des clésbonjour,
C’est possible, mais pour ma part la réponse sera lundi…
On pourra même faire un menu déroulant avec la liste de tous les champs !@+
😎bebarth
Maître des clésC’est étrange car le caractère | (ou) est utilisé dans les expressions régulières, et ça fonctionne chez moi…
Remarque, si tu es certain de ne pas utiliser ce caractère dans tes réponses il ne sera pas nécessaire !
@+
😎bebarth
Maître des clésbonjour,
Après avoir jeté un coup d’œil sur le script, je ne trouvais pas !!!
Puis, je me suis aperçu que si on mettait des valeurs simples dans les champs ça fonctionnait et que tous les champs qui ne fonctionnaient pas contenaient des parenthèses… Eurêka !!!Lorsqu’on crée l’expression régulière, il faut échapper certains caractères pour qu’ils soient interprétés correctement, donc :
var RegExTest=new RegExp("^"+this.getField("R."+n+"."+a).value.replace(/[.*+?^${}()|/\[\]\\]/g,"\\$&")+"$");
@+
😎PS : Le fichier ne passe pas, je te laisse donc faire la modification…
-
Cette réponse a été modifiée le il y a 10 mois et 1 semaine par
bebarth.
bebarth
Maître des clésbonjour,
Il faut écrire une expression régulière :
var lesMots=this.getField("R."+n+"."+a).value.replace(/###/g,"|");
var RegExTest=new RegExp("^"+lesMots+"$");
if (RegExTest.test(this.getField("Q."+n+"."+a).value))...
Et si tu sépares tes mots par une barre verticale “|” (clé|clef) tu peux directement écrire :
var RegExTest=new RegExp("^"+this.getField("R."+n+"."+a).value+"$");
if (RegExTest.test(this.getField("Q."+n+"."+a).value))...
@+
😎bebarth
Maître des clésbonjour,
Le fichier que j’ai partagé n’est qu’un exemple à partir de ton fichier pour montrer qu’on peut insérer des pages n’importe où dans le document et non uniquement au début ou à la fin.
Pour que l’on puisse afficher/supprimer des pages avec Reader, ces pages doivent être des pages modèle. Il faut donc indiquer les pages que tu veux cacher comme “Page Modèle” et modifier le script de sorte qu’elles soient cachées après sélection des menu déroulants !@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésOTAN pour moi, je viens de vérifier et j’ai barré ce qui ne fonctionne pas ci-dessus. D’où l’intérêt de toujours vérifier avant de poster
…et de vérifier correctement !!! La dernière fois avec l’exemple en GREP, j’avais bien testé avec un point, mais comme un point signifie n’importe quel caractère ça fonctionnait forcément !
@+
😎bebarth
Maître des clésMalgré tout je me force à m’en servir afin de mieux pouvoir la dompter le jour ou elle sera imposée par Adobe. (à regret)
C’est ce que je me suis dit un moment, puis je suis repassé à l’ancienne interface…
@+
😎bebarth
Maître des clésbonjour,
Effectivement si tu veux traiter tous les champs il n’y a pas besoin de mettre de condition sur la recherche du nom de champ !@+
😎bebarth
Maître des clésJ’ai lu en diagonale vite fait les scripts, et il y a quelque chose qui m’interpelle et que je ne comprends d’ailleurs pas pourquoi il n’y a pas d’erreur retournée.
Lorsque tu écris :
...
if (nomChamp.indexOf("Q.")==0) {
this.getField("Q.").readonly=false;
...
La première ligne signifie “si le nom du champ commence par Q.” (Q suivi d’un point quel que soit un indice à la suite). Si on avait voulu uniquement “Q.” on aurait écritif (nomChamp=="Q.")
et on n’aurait pas eu besoin de mettre cette ligne dans une boucle.La deuxième ligne devrait être
this.getField(nomChamp).readonly=false;
car il n’y a pas de champ qui se nomme uniquement “Q.” !
Ça peut également fonctionner avecthis.getField("Q").readonly=false;
(sans le point) pour exécuter le script sur l’ensemble des champs “Q” avec un indice.Et ce, plusieurs fois dans tous les scripts, et idem pour les champs qui commencent par “R.”
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésEn GREP le point tout seul signifie “n’importe quel caractère”, il faut donc l’échapper avec un antislash si on veut détecter le point.
Oups !!! J’ai modifié le post.
@+
😎bebarth
Maître des clésJ’avais compris qu’il fallait trouver l’indice n maxi qui n’est pas forcément le nombre d’indices… ni 1 le numéro mini d’ailleurs !
@+
😎bebarth
Maître des clésBonjour,
Je dirais même plus …/Verifier\./.test(oChamp.name)… avec le point (échappé à l’aide d’une barre oblique inversée ou backslash) pour être certain que le nom n’est que “Verifier” !Lorsqu’on veut vérifier les indices et que l’on compte le nombre de champs il faut être certain qu’ils sont tous consécutif.
Je dis ça car je me suis déjà fait avoir plusieurs fois pensant qu’ils l’étaient et qu’au final ils ne l’étaient pas.
Dans ce cas il faut mettre tous les indices dans une table puis les trier car ils ne sont pas forcément ajoutés dans la table dans le bon ordre…@+
😎-
Cette réponse a été modifiée le il y a 10 mois et 3 semaines par
bebarth.
bebarth
Maître des clésbonjour,
“color” est un objet, donc il faut écrire :
...
this.getField("Q."+n+"."+a).fillColor=eval("color."+colorErr);
...
pour que la valeur d’exportation du menu déroulant associée à “color” soit interprétée correctement.
@+
😎bebarth
Maître des clésPour récupérer a & b tu fais comme précédemment !
var nomChamp="Question.12.25";
var n1=nomChamp.indexOf(".");
var n2=nomChamp.lastIndexOf(".");
var a=Number(nomChamp.substring(n1+1,n2));
var b=Number(nomChamp.substring(n2+1));
console.println("a : "+a);
console.println("b : "+b);
@+
😎bebarth
Maître des clésMeni.5 est une case à cocher, if faut donc la mettre = “Off” et non =0.
… et ça fonctionne avec PDF XChange editor !Tu peux sortir l’initialisation des champs “Erreurs” et “Menu.5” de la boucle. Ça ne sert pas à grand chose que ces champs soient initialisés X fois…
@+
😎-
Cette réponse a été modifiée le il y a 10 mois et 4 semaines par
bebarth.
Attachments:
You must be logged in to view attached files.bebarth
Maître des clésPeut-être une commande JavaScript qui ne fonctionne pas avec PDF XChange editor !
Il faut les tester une à une…@+
😎bebarth
Maître des clésbonjour,
J’ai peut-être pas bien compris, mais ça a l’air de fonctionner…@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésque tous les champs “R.” soient cachés
if (nomChamp.indexOf("R.")==0) {this.getField(nomChamp).display=display.hidden;}
que la couleur de fond de tous les champs “Q.” soit transparent
if (nomChamp.indexOf("Q.")==0) {this.getField(nomChamp).fillColor=color.transparent;}
que tous les autres champs et boutons dont le 1er indice est supérieur à 1 soient cachés aussi
Il faut capturer le nombre entre le premier et deuxième point avec indexOf et si c’est un chiffre ou nombre supérieur à 1,
var n1=nomChamp.indexOf(".");
var n2=nomChamp.lastIndexOf(".");
if (Number(nomChamp.substring(n1+1,n2))>1) {this.getField(nomChamp).display=display.hidden;}
Essaye ça et tu mes dis !
@+
😎bebarth
Maître des clésbonjour,
Pour vérifier qu’une chaine de caractères commence par une autre chaine de caractères, personnellement j’utilise indexOf==0 :
if (nomChamp.indexOf("Menu")==0)...
Avant j’utilisais startsWith() mais il me semble me rappeler avoir eu des soucis (existe aussi avec endsWith()) :
if (nomChamp.startsWith("Menu")...
https://www.w3schools.com/jsref/jsref_startswith.aspSi tu souhaites supprimer tous les commentaires, ce n’est pas la peine de vérifier tous les types.
Tu peux simplement écrire :
var annots=this.getAnnots();
if (annots) for (var j=0; j<annots.length; j++) annots[j].destroy();
@+
😎bebarth
Maître des clésbonjour,
Pour “default”, essaye ça :
for (var i=0; i<this.numFields; i++) {
var nomChamp=this.getNthFieldName(i);
if (nomChamp.indexOf("Q.")==0) {
if (this.getField(nomChamp).type=="text") this.getField(nomChamp).defaultValue="";
else this.getField(nomChamp).value=this.getField(nomChamp).getItemAt(0,false);
}
}
et pour “EditReps” :
for (var i=0; i<this.numFields; i++) {
var nomChamp=this.getNthFieldName(i);
if (this.getField("Menu.5").value!="Off") {
if (nomChamp.indexOf("Q.")!=0) this.getField(nomChamp).readonly=false;
} else {
this.getField(nomChamp).readonly=true;
}
}
Mais là, même ton bouton sera en lecture seule !!! Il faudra l’exclure si tu ne veux pas.
Tu me dis…@+
😎bebarth
Maître des clésbonjour,
Comment pourrais-je faire pour supprimer les pages process B, C et D si l’utilisateur sélectionne process A. Ou supprimer les pages Process A, C et D s’il sélectionne le process B? Par supprimer je veux dire qu’il n’aura pas la visibilité sur ces pages car ça ne le concerne pas.
C’est bien se qui se passe dans le document que j’ai partagé, non !
Comment faire apparaître des pages formulaires à la sélection du process et non des pages avec seulement un titre. Par exemple, pourrais-je ajouter au document toutes les pages formulaires liées à tous les process (document global). Depuis la sélection du process, le document filtre et n’affiche que les pages en lien avec la sélection initiale.
Moi je dirai de la même façon que les autres pages, avec des pages modèles… mais je ne suis pas certain d’avoir bien compris !
@+
😎bebarth
Maître des clésbebarth
Maître des clésbonjour,
Ci-joint le fichier qui devrait répondre à ton attente, et ci-dessous les scripts utilisés :// Script de document
var listesFilles= {
"Product 1": [["- Please Choose -",0],"Process A1", "Process B1", "Process C1", "Process D1"],
"Product 2": [["- Please Choose -",0],"Process A2", "Process B2", "Process C2", "Process D2"],
"Product 3": [["- Please Choose -",0],"Process A3", "Process B3", "Process C3", "Process D3"],
"Product 4": [["- Please Choose -",0],"Process A4", "Process B4", "Process C4", "Process D4"],
};
var nbPages=4; // Nombre de pages sans les modèles
var apresPage=2; // No de page après laquelle insérer les modèles
function suppression() {
if (this.numPages>nbPages) {
this.deletePages({
nStart: apresPage,
nEnd: this.numPages-apresPage-1
});
}
}
// Script de touches personnalisé Product Type
if (!event.willCommit) {
suppression();
if (event.changeEx!=0) this.getField("ProcessType").setItems(listesFilles[event.changeEx]);
else this.getField("ProcessType").clearItems();
}
// Script de touches personnalisé Process Type
if (!event.willCommit) {
suppression();
if (event.changeEx!=0) {
var pagesModeles=this.templates;
for (var j=pagesModeles.length-1; j>=0; j--) {
if (pagesModeles[j].name.indexOf(event.changeEx)==0) pagesModeles[j].spawn(apresPage, true, false);
}
}
}
Est-ce que cela te convient ? N’hésite pas à demander pour des explications.
@+
😎PS : Changement de variable de i en j car il y a un problème d’affichage lorsque le i est entre crochets…
-
Cette réponse a été modifiée le il y a 11 mois et 1 semaine par
bebarth.
Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonsoir,
c’est faisable et la complexité dépend des connaissances en JavaScript!
Je regarde demain.
bonne soirée.
@+
😎bebarth
Maître des clésbonjour,
Je viens de commencer à regarder ton fichier.
Est-ce bien des liste mère/filles ? Est-ce que tous les éléments du menu “Process Type” diffèrent en fonction de chaque élément du menu “Product Type” ? Par exemple, pour “Product 1” on va avoir un menu “Process Type” avec les éléments “Process A1”, “Process B1″,”Process C1”, etc. et pour “Product 2” on va avoir un menu “Process Type” avec les éléments “Process A2”, “Process B2″,”Process C2”, etc. et ainsi de suite ?
Pour chaque sélection, ajoute-t-on une seule ou plusieurs pages ? En fin de document ou dans le milieu ?@+
😎bebarth
Maître des clésbonjour,
Ce serait possible de créer un script, mais manuellement se sera plus rapide.
Il existe une fonction Acrobat pour créer plusieurs copies. Comme tu en as besoin de 72 sur 3 pages, il faut d’abord les mettre tous sur une seule, puis les répartir.Plus de détails ce soir si tu n’y es pas arrivé…
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
De ce que je comprend, il faut combiner une liste mère-fille avec des pages modèles qui ne seront affichées qu’en fonction du choix.
Je ne sais pas si je pourrai regarder ton fichier cette semaine… mais je fais ça au plus vite ! Désolé si c’est urgent.@+
😎bebarth
Maître des clésbonsoir,
J’ai du formater la date en américain YYYY-MM-JJ pour supprimer les “/” et pour le classement dans l’explorateur.
Pour le classement, ce format est beaucoup plus adéquat que le format français…
@+
😎bebarth
Maître des clésbonjour,
Tu ajoutes un script à ton bouton “insertimage” :
this.getField("image").buttonImportIcon();
Par contre, ton champ “image” doit être un bouton ou un champ image mais pas un champ texte…
@+
Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
…et si cela te convient, voici le script à placer dans le répertoire JavaScipt d’Acrobat. Tu peux nommer ce fichier comme il te convient. Pour mon exemple je l’ai nommé SaveAs_tfx256.js
SaveAs_tfx256=app.trustedFunction(function(chemin) {
app.beginPriv();
this.saveAs({
cPath: chemin,
bCopy: true,
bPromptToOverwrite: true
});
app.endPriv();
})
Et voici le script du bouton d’enregistrement. Ici on ne vérifie que les champs ne sont pas vide, mais on peut également vérifier si le champ DATE est bien une date et si les autres champs contiennent bien certains caractères. A noter que si le champ DATE contient des barres obliques “/” il faudra les remplacer ou supprimer pour ne pas perturber le chemin du fichier.
if (this.getField("DATE").value!="" && this.getField("NOM").value!="" && this.getField("Prénom").value!="" && this.getField("Lieu").value!="") {
try {
SaveAs_tfx256(this.path.substr(0,this.path.lastIndexOf("/")+1)+this.getField("DATE").value+" # "+this.getField("NOM").value+" # "+this.getField("Prénom").value+" # "+this.getField("Lieu").value+".pdf");
this.resetForm();
} catch(e) {
this.getField("leScript").display=display.visible;
app.alert("Le fichier \"SaveAs_tfx256.js\" n'est pas installé sur cet ordinateur.");
}
} else app.alert("Les 4 champs doivent être remplis.",3);
this.dirty=false;
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Il faudrait voir exactement ton formulaire car de ce que je comprends ce ne sont pas exactement des listes mères-filles vu qu’il n’y a qu’un seul menu déroulant…@+
😎bebarth
Maître des clésPetite précision, il faut enregistrer ton fichier Excel au format .csv, avec séparateur point-virgule.
Voici un exemple avec un menu déroulant.
En script de document :
this.getField("Zone d'alarme").clearItems();
var p=this.getDataObject(this.dataObjects[0].name);
var fichier=this.getDataObjectContents(p.name);
var donnees=util.stringFromStream(fichier);
var rangees=donnees.split("\r\n");
var colonnes=new Array();
for (var i=0 ; i
var cellule=[[“Sélectionnez”,0]]`
for (var j=1 ; j
this.getField(“Zone d’alarme”).setItems(cellule);`
Et en script de touches personnalisé du menu déroulant :
if (!event.willCommit) {
if (event.changeEx!=0) {
var lesValeurs=event.changeEx.split(";");
this.getField("Catégorie").value=lesValeurs[0];
this.getField("Libellé").value=lesValeurs[1];
} else {
this.getField("Catégorie").value="";
this.getField("Libellé").value="";
}
}
Pour info, il faut éviter d’indiquer des noms de champs avec des caractères accentués qui peuvent perturber le calcul des scripts.
@+
😎-
Cette réponse a été modifiée le il y a 12 mois par
bebarth.
Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Pour pouvoir remplir automatiquement certains champs il faut forcément en remplir au moins un…
Ton champ “Zone d’alarme” est de type “Zone de liste”. Veux-tu le remplir automatiquement avec la liste indiquée dans le champ Excel ? Si il y a 3000 référence ça ne va pas être très pratique d’utilisation. Idem si c’est un menu déroulant…@+
😎bebarth
Maître des clésbonjour,
Écrire un élément d’un menu déroulant sur plusieurs lignes n’est possible qu’avec un script, par exemple :
this.getField("nomChamp").setItems(["Élément 1\rsur 2 lignes","Élément 2","Élément 3","Élément 4\rsur 2 lignes","Élément 5"]);
Tu colles ce script dans la console vide, puis tu sélectionnes tout ce script et touche ENTER du clavier numérique.
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonsoir,
Voici un script pour calculer la date de fin de projet pour ton document (fichier Essai_calcul_date_sur_masque_BB).
try {
var n=event.target.name.indexOf(".");
var nomChamp=event.target.name.substr(0,n)+".FLECHAGE.103a_DebutTravaux";
if (this.getField("103c_DureeMois").value!="" && this.getField(nomChamp).value!="") {
var laDate=this.getField(nomChamp).value;
var objetDate=util.scand("dd/mm/yyyy",laDate);
objetDate.setMonth(objetDate.getMonth()+this.getField("103c_DureeMois").value);
event.value=util.printd("dd/mm/yyyy",objetDate);
} else event.value="";
} catch(e) {}
Si lorsque que tu génères la page tu indiques de ne pas renommer les champs de la page modèle (si tu n’as besoin de générer qu’une seule page) cela simplifie le script (fichier Essai_calcul_date_sur_masque_BB1).
Pour générer la page sans renommer les champs :
this.getTemplate("FLECHAGE").spawn(this.numPages, false, false);
Le script réduit :
if (this.getField("103c_DureeMois").value!="" && this.getField("103a_DebutTravaux").value!="") {
var laDate=this.getField("103a_DebutTravaux").value;
var objetDate=util.scand("dd/mm/yyyy",laDate);
objetDate.setMonth(objetDate.getMonth()+this.getField("103c_DureeMois").value);
event.value=util.printd("dd/mm/yyyy",objetDate);
} else event.value="";
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Effectivement, il faut que chaque page soit une page modèle puis qu’elle soit générée depuis Acrobat (Reader), comme dans l’exemple joint.
Voici le script pour cet exemple.
var noPage=event.target.name.substr(4);
var modeles=this.templates;
if (event.target.value!="Off") {
for (i=0; i<modeles.length; i++) {
if (modeles.name==noPage) modeles.spawn(this.numPages,false);
}
} else {
var lesPages=this.getField("Page "+noPage).page;
this.deletePages(lesPages[1]);
}
this.pageNum=0;
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Curieusement il fonctionne pour les champs réponse mais ne fonctionne pas pour les champs question (sans que la console ne renvoie d’erreur).
Ça fait un peu juste pour trouver le pourquoi ça ne fonctionne pas !
Pour la numérotation des champs, je trouvais plus simple comme ça plutôt qu’avoir 2 indices en fin de nom de champ
OK ! Pour moi i était l’indice du champ et pour modifier tous les champs on ne devait pas mettre le point (par exemple this.getField(“question”).fillColor pour modifier tous les champs de même nom sans indiquer les indices) mais je viens de vérifier et avec le point ça fonctionne également…
@+
😎bebarth
Maître des clésbonjour,
Voici une version pour “simplifier” l’écriture du script :
function CoulQ() {
switch (this.getField("Menu.3").value) {
case "Jaune":
var Coul=color.yellow;
break;
case "Vert":
var Coul=color.green;
break;
case "Bleu":
var Coul=color.blue;
break;
case "Rouge":
var Coul=color.red;
break;
default:
var Coul=color.transparent;
}
for (var i=2; i<6; i++) this.getField(i+"question.").fillColor=Coul;
}
Juste une question : dans la boucle finale, la position de la variable “i” me parait étrange ! Ne serait-ce pas plutôt :
... this.getField("question."+i).fillColor ...
@+
😎bebarth
Maître des clésbonjour,
Comme ce script ne fonctionne me semble-t-il que sur une page,
Le script est effectivement écrit pour fonctionner sur une seule page. On pourrait l’adapter pour une utilisation sur plusieurs pages mais il faut définir avant ce que l’on veut exactement car ça complique un peu…
@+
😎bebarth
Maître des clésbonjour,
je ne pourrai regarder que demain…
@+
😎bebarth
Maître des clésbonjour,
Tu peux utiliser ce script soit depuis la console ou en utilisant une action.
Si tu ne l’utilise qu’une ou quelques fois je te conseille la console sinon si tu penses l’utiliser fréquemment, privilégie l’action.
Et si tu ne sais pas comment ça se passe, tu demandes !@+
😎bebarth
Maître des clésbonjour,
2 façons de faire :for (var i=0; i<this.numFields; i++) {
if (this.getNthFieldName(i).indexOf("ABC")==0) {
...
}
}
ou
for (var i=0; i<this.numFields; i++) {
if (/^ABC/.test(this.getNthFieldName(i))) {
...
}
}
@+
😎bebarth
Maître des clésVoici le script expliqué :
var indMax=0;
for (var i=0; i<this.numFields; i++) { // numFields = Nombre de champs dans le document
if (this.getNthFieldName(i).indexOf("question.")==0) indMax++; // Si le nom du champ commence par "question." on incrémente indMax
// this.getNthFieldName(i) = Nom du champ d'indice i
// indexOf("question.") = Recherche la chaine de caractères "question."
// si le résultat est -1 la chaine de caractères n'a pas été trouvée
// sinon indique la position de cette chaine de caractères
// donc ==0 signifie que le nom du champ commence par "question."
}
for (var a=0; a<indMax; a++) { // strictement inférieur car "question." basé sur 0
...
}
Tu devrais trouver beaucoup d’explication en consultant :
https://opensource.adobe.com/dc-acrobat-sdk-docs/library/jsapiref/JS_API_AcroJS.html
pour les propriétés ou méthodes, ou en anglais
https://www.w3schools.com/jsref/default.asp
ou en français
https://developer.mozilla.org/fr/docs/Web/JavaScript/Guide/Introduction
pour le JavaSCript@+
😎bebarth
Maître des clésbonjour,
Voici un script qui compte le nombre de chqmps dont le nom commence par “question.”.
var indMax=0;
for (var i=0; i<this.numFields; i++) {
if (this.getNthFieldName(i).indexOf("question.")==0) indMax++;
}
for (var a=0; a<indMax; a++) { // strictement inférieur
...
}
Avec ce script il faut que tous les indices soient consécutifs en partant de zéro sinon il faut mettre les noms des champs (ou juste les indices) dans une table et utiliser la longueur de la table en indMax;
@+
😎bebarth
Maître des clésJ’ai écris un utilitaire il y a quelques temps, mais il ne sera pas très utile à Michel car il se place en script d’application et je ne sais pas si et comment ça fonctionne avec son logiciel.
Je partage le fichier .txt (à renommer en .js) si ça intéresse quelqu’un.
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
https://opensource.adobe.com/dc-acrobat-sdk-docs/library/jsapiref/JS_API_AcroJS.html#id602
La position d’un champ est définie dans une table de 4 éléments qui indique les positions x et y dans la feuille du point supérieur gauche et du point inférieur droit [x supérieur gauche, y supérieur gauche, x inférieur droit, y inférieur droit].@+
😎bebarth
Maître des clésVoici ce que je te disais avec la méthode fieldfull.
if (event.fieldFull) {
app.alert("Le champ texte est plein.\rNous allons augmenter sa hauteur pour pouvoir continuer à frapper.");
var nomChamp=event.target.name;
this.resetForm([nomChamp]); // Reset field to lose focus
var aRect=event.target.rect;
aRect[3]=aRect[3]-event.target.textSize*1.16;
event.target.rect=aRect;
event.change=event.changeEx;
this.getField(nomChamp).setFocus();
}
Par contre :
- Je n’arrive pas à re-frapper directement. Il faut re-cliquer dans le champ.
- Impossible de revenir directement à un champ plus petit si on supprime du texte.
@+
😎-
Cette réponse a été modifiée le il y a 1 année et 1 mois par
bebarth.
Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Voici ce que je t’ai fait ! Les champs ne sont visibles que si la question et la réponse correspondante ne sont pas hors page.
Ce n’est pas très compliqué. Tu me dis ce que tu ne comprends pas.// Script de document
var hauteurChamp=7.5;
var corps=9.5;
var interligne=corps*1.16;
var margeBas=0;
var mm2pt=72/25.4;
margeBas*=mm2pt;
function reglage(champ,rect) {
champ.delay=true;
champ.rect=rect;
champ.delay=false;
}
function reglageChamps(ind) {
for (var i=ind; i<10; i++) {
var f=this.getField("question."+i);
var fRect=f.rect;
var haut=fRect[1];
var ff=this.getField("nbQ."+i);
var ffRect=ff.rect;
var g=this.getField("reponse."+i);
var gRect=g.rect;
var gg=this.getField("nbR."+i);
var ggRect=gg.rect;
if (i==ind) {
if (event.target.name.indexOf("nbQ")==0) {
var originale=fRect[3];
var finale=fRect[1]-hauteurChamp*mm2pt-(Number(event.changeEx)-1)*interligne;
} else {
var originale=gRect[3];
var finale=gRect[1]-hauteurChamp*mm2pt-(Number(event.changeEx)-1)*interligne;
}
var delta=originale-finale;
if (event.target.name.indexOf("nbQ")==0) {
fRect[3]=finale;
reglage(f,fRect);
gRect[1]-=delta;
ggRect[1]-=delta;
ggRect[3]-=delta;
}
gRect[3]-=delta;
var bas=gRect[3];
reglage(g,gRect);
reglage(gg,ggRect);
} else {
fRect[1]-=delta;
fRect[3]-=delta;
reglage(f,fRect);
ffRect[1]-=delta;
ffRect[3]-=delta;
reglage(ff,ffRect);
gRect[1]-=delta;
gRect[3]-=delta;
var bas=gRect[3];
reglage(g,gRect);
ggRect[1]-=delta;
ggRect[3]-=delta;
reglage(gg,ggRect);
}
if (haut>=margeBas && bas>=margeBas) {
f.display=display.visible;
ff.display=display.visible;
g.display=display.visible;
gg.display=display.visible;
} else {
f.display=display.hidden;
ff.display=display.hidden;
g.display=display.hidden;
gg.display=display.hidden;
}
}
}
// Script de touches personnalisé
if (!event.willCommit) {
reglageChamps(event.target.name.substring(event.target.name.lastIndexOf(".")+1));
}
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clés…et si le ou les premiers champs ont beaucoup de lignes, que deviennent les derniers champs qui deviennent hors page ? Il sont supprimés ? Doit-il être possible de revenir en arrière en diminuant le nombre de lignes d’un champ ?
@+
😎bebarth
Maître des clésbonjour,
Je ne suis pas dispo aujourd’hui, mais regarde si tu peux faire quelque chose avec la méthode fieldFull.@+
😎bebarth
Maître des clésC’est le plus simple…
@+
😎bebarth
Maître des clésbonjour & Merci pour tous ces compliments…
Quand on est passionné, on fait ça avec plaisir ! Je n’ai qu’un petit regret c’est qu’il n’y a pas plus de problèmes posés sur ce forum car ils sont généralement bien plus intéressants (JavaScriptement parlant :-)) que ceux posés sur le forum Adobe.Oui, je me demandais si ça pouvais marcher à partir d’un bouton en désactivant le code permettant de créer une nouvelle page.
Pour cela il faudrait connaitre le nombre de lignes et pour connaitre le nombre de lignes, la seule solution que j’ai trouvé est celle proposée avec ajout/suppression de pages.
@+
😎bebarth
Maître des clésbonjour,
// En script d'application (extension du fichier .js)
if (app.formsVersion>=8) {
ajoutPage=app.trustedFunction(function(cettePage,largeur,hauteur) {
app.beginPriv();
this.newPage(cettePage,largeur,hauteur);
app.endPriv();
});
suppressionPage=app.trustedFunction(function(cettePage) {
app.beginPriv();
this.deletePages(cettePage);
app.endPriv();
});
}
Comme indiqué, cette partie doit être placée en script d’application dans un fichier .js, mais avec PDF XChange editor je ne sais pas si c’est possible, et si ça l’est je ne sais pas ou il faut placer le fichier.
Sans les privilèges, tu ne pourras pas ajouter une page ou la supprimer depuis un script déclenché depuis un bouton ! Tu ne pourras le faire qu’à partir de la console ou d’une action.
@+
😎-
Cette réponse a été modifiée le il y a 1 année et 1 mois par
bebarth.
bebarth
Maître des clésLorsque tu auras trouvé si on peut placer des scripts d’application, voici un nouveau fichier qui devrait fonctionner avec un bouton.
J’ai supprimé le calcul des nombres de paragraphes, mots et caractères et le script est en pièce jointe au fichier au format txt.// En script d'application (extension du fichier .js)
if (app.formsVersion>=8) {
ajoutPage=app.trustedFunction(function(cettePage,largeur,hauteur) {
app.beginPriv();
this.newPage(cettePage,largeur,hauteur);
app.endPriv();
});
suppressionPage=app.trustedFunction(function(cettePage) {
app.beginPriv();
this.deletePages(cettePage);
app.endPriv();
});
}
// En script de calcul du bouton
console.show();
console.clear();
// Variables
var p=this.numPages;
var g=this.getField("champTexte");
var gRect=g.rect;
var hautChamp=gRect[1];
var basChamp=gRect[3];
var paragraphes=g.value.split("\r");
var nbParagraphes=paragraphes.length;
var toutLeTexte=g.value;
var nbCaracteres=toutLeTexte.length;
var texteEntier=g.value;
var nbLignesTexte=0;
var nbLignes=0;
var deltaLignes=0;
var aRect=this.getPageBox("Crop");
var laPage=0;
if (toutLeTexte.length) {
// Boucle si texte débordant de la page
while (toutLeTexte.length) {
// Nouvelle page
ajoutPage(p, aRect[2], aRect[1]);
//this.newPage(p, aRect[2], aRect[1]);
var basMot=hautChamp;
// Copie du champ
var f=this.addField("autreChamp", "text", p, g.rect);
for (var j in g) {
try {
if (typeof g[j]!="function" && j!="name" && j!="type" && j!="page" && j!="rect") f[j]=g[j];
} catch(e) {}
}
f.value=toutLeTexte;
// Aplatissement
this.flattenPages(p);
// Nombre de mots
var nbMots=this.getPageNumWords(p);
for (var i=0; i<nbMots; i++) {
var leMot=this.getPageNthWord(p, i, true);
var q=this.getPageNthWordQuads(p, i);
m=(new Matrix2D).fromRotated(this,p);
mInv=m.invert();
r=mInv.transform(q);
r=r.toString();
r=r.split(",");
if (Number(r[5])>basChamp) {
if (Number(r[5])<basMot) {
var basMot=Number(r[5]);
if (!laPage) nbLignesTexte++;
nbLignes++;
}
if (!laPage) {
if (i==0) {
var hautTexte=Number(r[1]);
var premiereLigne=basMot;
var deltaV=hautChamp-hautTexte;
}
if (nbLignes==2 && !deltaLignes) var deltaLignes=premiereLigne-Number(r[5]);
}
var toutLeTexte=toutLeTexte.substr(toutLeTexte.indexOf(leMot)+leMot.length)
var toutLeTexte=toutLeTexte.replace(/[\"\”\*\-\_\,\.\;\:!?\'\(\)\{\}\[\]\«\»]$/, "").replace(/\s+$/, "");
} else break;
}
laPage++;
suppressionPage(p);
//this.deletePages(p);
}
// Redimensionnement
var champBas=premiereLigne-(deltaLignes*(nbLignes-1))-deltaV;
if (champBas<=0) var champBas=0;
gRect[3]=champBas;
g.rect=gRect;
g.value=texteEntier;
// Texte Alerte et Console
var leTexte="Le texte du champ \""+this.getField("champTexte").name+"\" est écrit sur "+nbLignes+" ligne";
if (nbLignes>1) leTexte+="s";
leTexte+=". ";
if (champBas!=basChamp) leTexte+="\r\rLe champ a été redimensionné.\rIl comportait "+nbLignesTexte+" lignes visibles entièrement.";
if (champBas<basChamp) {
if (champBas>0) leTexte+="\r\rToutes les lignes sont maintenant visibles.";
else leTexte+="\r\rLe champ n'est pas assez haut pour afficher tout le texte avec ce corps.";
}
console.println(leTexte);
app.alert(leTexte,3);
console.hide();
//this.dirty=false;
} else {
app.alert("Il faut écrire un texte dans ce champ pour pouvoir le redimensionner !",3);
}
@+
😎-
Cette réponse a été modifiée le il y a 1 année et 1 mois par
bebarth.
Attachments:
You must be logged in to view attached files.bebarth
Maître des clésJ’ai réussi à faire fonctionner le script via un émulateur PC sur Acrobat et PDF XChange editor.
Sur PDF XChange editor l’espace en bas de champ est un peu plus important… Je n’ai pas trouvé où on pouvait placer des scripts d’application !
S’il y a un support client ou un forum tu peux peut-être te renseigner, mais je n’ai pas l’impression que c’est possible ! Idem pour les actions…@+
😎-
Cette réponse a été modifiée le il y a 1 année et 1 mois par
bebarth.
-
Cette réponse a été modifiée le il y a 1 année et 1 mois par
bebarth.
Attachments:
You must be logged in to view attached files.bebarth
Maître des clésPar-contre même depuis la Console il n’ajoute pas de page, mais sans retourner de message d’erreur, et le message de résultat précise bien que tout le texte n’est pas affiché.
…du coup ça ne fonctionne pas ???
@+
😎bebarth
Maître des clésJ’ai placé ce script en script de document au départ, dans une fonction que j’ai appelé Redim et que j’appelle via un bouton par la commande Redim(); et ça ne fonctionne pas.
Ce n’est pas en script de document mais en script d’Application qu’il faut le placer !
PDF : les différents niveaux d’utilisation des scripts JavaScript
Je regarde pour ton logiciel plus tard…
@+
😎-
Cette réponse a été modifiée le il y a 1 année et 1 mois par
bebarth.
bebarth
Maître des clésbonjour,
De mon coté, le script fonctionne depuis la console
Ça me réconforte de savoir que ça ne fonctionne pas uniquement chez moi !
mais je n’arrive pas à le faire tourner à partir d’un bouton
Comme je l’ai dis précédemment il n’est possible d’exécuter ce script à partir d’un bouton uniquement si le (ou une partie du) script est placé en script d’application. Avec Acrobat il y a un répertoire JavaScript où l’on place ces scripts qui sont exécutés à l’ouverture d’Acrobat.
A mon avis, il doit y avoir aussi un répertoire JavaSript pour ton logiciel (lequel est-ce déjà ?).
Tu mes dis !
@+
😎bebarth
Maître des clésEt avec ton texte d’origine qui déborde largement ça retourne ce message d’erreur : NotAllowedError: Security settings prevent access to this property or method. Doc.newPage:35:Field champTexte:Format Voudrais tu donner raison à ma première réponse ?
Je ne comprends pas, moi ça fonctionne sur mes 2 Mac ?
Je vais essayer de trouver un PC pour essayer le script !@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbebarth : on ne peut ni lire ni extraire la pièce jointe, c’est un fichier .js !
J’ai changé la pièce jointe en .txt, je joints également le fichier.
C’est étrange car avec mes Mac je peux ouvrir les fichiers .js attachés !Est il possible d’exécuter ce script grâce à un bouton?
Pour que ça fonctionne depuis un bouton il faut mettre un script d’application pour Acrobat, avec ton logiciel je ne sais pas !
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésIdem que Merlin ! …et avec celui de la pièce attachée au fichier, c’est pareil ???
Effectivement lorsqu’on copie/colle le script du post, cela ne fonctionne plus !!!
@+
😎bebarth
Maître des clésEffectivement, le script collé dans le post ne fonctionne pas, mais celui en pièce attaché au fichier est correct !
Je donne ici le script qui marche. Je vous invite à modifier les dimensions du champ ou la taille des caractères pour voir la différence.console.show();
console.clear();
// Variables
...
} else {
app.alert("Il faut écrire un texte dans ce champ pour en connaître les détails !",3);
}
@+
😎-
Cette réponse a été modifiée le il y a 1 année et 2 mois par
bebarth.
Attachments:
You must be logged in to view attached files.bebarth
Maître des clésÇa ne fonctionne pas : TypeError: lesMots.replace is not a function 21:Field:Validate
Ah !!! J’ai pourtant vérifié plusieurs fois avant de partager…
Je vérifie cet après-midi !@+
😎bebarth
Maître des clésbonjour,
J’avais écris un script il y a déjà quelques temps qui comptait le nombre de lignes d’un champ même si elles n’apparaissaient pas toutes :Compter des lignes dans un champ multignes sans caractères de retour à la ligne
Je m’en suis donc inspiré pour l’adapter et pouvoir redimensionner le champ.
La réponse longue est oui, il faut compter le nombre de caractères saisis en temps réel et aussi ceux qui sont supprimés. Ça requiert donc une usine à gaz en JavaScript assez longue à développer et ça impose d’utiliser une police à chasse fixe (Courier), et dont le corps ne doit pas varier.
C’est effectivement une usine à gaz, mais de cette manière mais la police n’a pas besoin d’une chasse fixe !
Et voici le script à exécuter depuis la console ou en action (également en pièce jointe dans le fichier) :
console.show();
console.clear();
// Variables
var p=this.numPages;
var g=this.getField("champTexte");
var gRect=g.rect;
var hautChamp=gRect[1];
var basChamp=gRect[3];
var paragraphes=g.value.split("\r");
var nbParagraphes=paragraphes.length;
var toutLeTexte=g.value;
var nbCaracteres=toutLeTexte.length;
var texteEntier=g.value;
var nbLignesTexte=0;
var nbLignes=0;
var deltaLignes=0;
var aRect=this.getPageBox("Crop");
var laPage=0;
// Fonction
function calculMots(lesMots) {
var lesMots=lesMots.replace(/[\'\-\’]/g, " ");
var lesMots=lesMots.replace(/[\"\”\*\_\,\.\;\:\!\?\(\)\{\}\[\]\«\»]/g, "");
var lesMots=lesMots.replace(/\s+/g, " ");
var lesMots=lesMots.replace(/^\s+|\s+$/g, "");
var lesMots=lesMots.replace(/\s+/g, " ");
var enTable=lesMots.split(" ");
motsParagraphe.push(enTable.length);
}
var motsParagraphe=[];
for (var i=0; i<nbParagraphes; i++) calculMots(paragraphes);
if (paragraphes[0].length) {
// Boucle si texte débordant de la page
while (toutLeTexte.length) {
// Nouvelle page
this.newPage(p, aRect[2], aRect[1]);
var basMot=hautChamp;
// Copie du champ
var f=this.addField("autreChamp", "text", p, g.rect);
for (var j in g) {
try {
if (typeof g[j]!="function" && j!="name" && j!="type" && j!="page" && j!="rect") f[j]=g[j];
} catch(e) {}
}
f.value=toutLeTexte;
// Aplatissement
this.flattenPages(p);
// Nombre de mots
var nbMots=this.getPageNumWords(p);
for (var i=0; i<nbMots; i++) {
var leMot=this.getPageNthWord(p, i, true);
var q=this.getPageNthWordQuads(p, i);
m=(new Matrix2D).fromRotated(this,p);
mInv=m.invert();
r=mInv.transform(q);
r=r.toString();
r=r.split(",");
if (Number(r[5])>basChamp) {
if (Number(r[5])<basMot) {
var basMot=Number(r[5]);
if (!laPage) nbLignesTexte++;
nbLignes++;
}
if (!laPage) {
if (i==0) {
var hautTexte=Number(r[1]);
var premiereLigne=basMot;
var deltaV=hautChamp-hautTexte;
}
if (nbLignes==2 && !deltaLignes) var deltaLignes=premiereLigne-Number(r[5]);
}
var toutLeTexte=toutLeTexte.substr(toutLeTexte.indexOf(leMot)+leMot.length)
var toutLeTexte=toutLeTexte.replace(/[\"\”\*\-\_\,\.\;\:!?\'\(\)\{\}\[\]\«\»]$/, "").replace(/^\s+$/, "");
} else break;
}
laPage++;
this.deletePages(p);
}
// Redimensionnement
var champBas=premiereLigne-(deltaLignes*(nbLignes-1))-deltaV;
if (champBas<=0) var champBas=0;
gRect[3]=champBas;
g.rect=gRect;
g.value=texteEntier;
// Texte Alerte et Console
var leTexte="Le texte du champ \""+this.getField("champTexte").name+"\" est écrit sur "+nbLignes+" ligne";
if (nbLignes>1) leTexte+="s";
leTexte+=". ";
var nbMots=0;
for (var i=0; i<motsParagraphe.length; i++) nbMots+=motsParagraphe;
leTexte+="Il est composé de "+nbMots+" mot";
if (nbMots>1) leTexte+="s";
if (nbParagraphes>1) leTexte+=" et divisé";
if (nbMots>1) {
leTexte+=" en "+nbParagraphes+" paragraphe";
if (nbParagraphes>1) leTexte+="s";
}
leTexte+=".\nIl y a "+nbCaracteres+" caractères au total.";
if (nbParagraphes>1) {
for (var i=0; i<motsParagraphe.length; i++) {
leTexte+="\n• Paragraphe "+(i+1)+" : "+motsParagraphe+" mot";
if (motsParagraphe>1) leTexte+="s";
leTexte+=" ("+paragraphes.length+" caractères).";
}
}
if (champBas!=basChamp) leTexte+="\r\rLe champ a été redimensionné.\rIl comportait "+nbLignesTexte+" lignes visibles entièrement.";
if (champBas<basChamp) {
if (champBas>0) leTexte+="\r\rToutes les lignes sont maintenant visibles.";
else leTexte+="\r\rLe champ n'est pas assez haut pour afficher tout le texte avec ce corps.";
}
console.println(leTexte);
app.alert(leTexte,3);
console.hide();
//this.dirty=false;
} else {
app.alert("Il faut écrire un texte dans ce champ pour en connaître les détails !",3);
}
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Les champs a, b et c que tu importes avec la nouvelle pages existent déjà en pages 56, 57…
A mon avis il suffirait de les renommer (sans oublier de changer les noms dans les scripts).@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Si tu veux utiliser la méthode est(), en ligne 7 et 8 il faut écrire :
...
if (/-/.test(numerateur)) var signeNum = 1;
if (/-/.test(denominateur)) var signeDen = 1;
...
Sinon avec indexOf :
...
if (numerateur.indexOf("-")>-1) var signeNum = 1;
if (denominateur.indexOf("-")>-1) var signeDen = 1;
...
@+
😎bebarth
Maître des clésbonjour,
Voici un fichier permettant de faire les calculs selon le nombre de côtés et d’angles connus.
Le mieux aurait été de faire ça sur une seule page en indiquant les données connues, mais ça demande un peu de réflexion…Voic les scripts pour les 2 pages ajoutées :
//
event.value=Math.pow(this.getField("a1").value,2)+Math.pow(this.getField("b1").value,2)-(2*this.getField("a1").value*this.getField("b1").value*Math.cos(this.getField("C1").value*Math.PI/180));
event.value=Math.sqrt(this.getField("c1Carre").value);
//
event.value=Math.pow(this.getField("a11").value,2)+Math.pow(this.getField("c11").value,2)-(2*this.getField("a11").value*this.getField("c11").value*Math.cos(this.getField("B11").value*Math.PI/180));
event.value=Math.sqrt(this.getField("c1Carre").value);
//
event.value=Math.pow(this.getField("b111").value,2)+Math.pow(this.getField("c111").value,2)-(2*this.getField("b111").value*this.getField("c111").value*Math.cos(this.getField("A111").value*Math.PI/180));
event.value=Math.sqrt(this.getField("a111Carre").value);
//
event.value=this.getField("a2").value*Math.sin(this.getField("B2").value*Math.PI/180)/Math.sin((this.getField("B2").value+this.getField("C2").value)*Math.PI/180);
event.value=this.getField("a2").value*Math.sin(this.getField("C2").value*Math.PI/180)/Math.sin((this.getField("B2").value+this.getField("C2").value)*Math.PI/180);
event.value=180-(this.getField("B2").value+this.getField("C2").value);
//
event.value=this.getField("b22").value*Math.sin(this.getField("A22").value*Math.PI/180)/Math.sin((this.getField("A22").value+this.getField("C22").value)*Math.PI/180);
event.value=this.getField("b22").value*Math.sin(this.getField("C22").value*Math.PI/180)/Math.sin((this.getField("A22").value+this.getField("C22").value)*Math.PI/180);
event.value=180-(this.getField("A2").value+this.getField("C2").value);
//
event.value=this.getField("c222").value*Math.sin(this.getField("A222").value*Math.PI/180)/Math.sin((this.getField("A222").value+this.getField("B222").value)*Math.PI/180);
event.value=this.getField("c222").value*Math.sin(this.getField("B222").value*Math.PI/180)/Math.sin((this.getField("A222").value+this.getField("B222").value)*Math.PI/180);
event.value=180-(this.getField("A222").value+this.getField("B222").value);
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
On peut également utiliser la méthode “indexOf” :
// MISE EN VARIABLE
str = this.getField("num").value;
// SI LA VARIABLE CONTIENT "-"
if (str.indexOf("-") > -1) {
// code à exécuter
}
Pas de préférence à priori !
@+
😎bebarth
Maître des clésben on peut faire à peu près la même chose si on a 2 côtés et un angle on un seul côté et 2 angles !
@+
😎bebarth
Maître des clésbonjour,
Voici ce que je t’ai fait pour calculer les angles si on a tous les côtés.
Tu me dis si ça t’intéresse et je te ferai le reste !//
event.value=(Math.pow(this.getField("b").value,2)+Math.pow(this.getField("c").value,2)-Math.pow(this.getField("a").value,2))/(2*this.getField("b").value*this.getField("c").value);
event.value=(Math.acos(this.getField("cosA").value)*180/Math.PI).toFixed(2);
//
event.value=(Math.pow(this.getField("a").value,2)+Math.pow(this.getField("c").value,2)-Math.pow(this.getField("b").value,2))/(2*this.getField("a").value*this.getField("c").value);
event.value=(Math.acos(this.getField("cosB").value)*180/Math.PI).toFixed(2);
//
event.value=(Math.pow(this.getField("a").value,2)+Math.pow(this.getField("b").value,2)-Math.pow(this.getField("c").value,2))/(2*this.getField("a").value*this.getField("b").value);
event.value=(Math.acos(this.getField("cosC").value)*180/Math.PI).toFixed(2);
//
event.value=(this.getField("A").value+this.getField("B").value+this.getField("C").value).toFixed(1)+"°";
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésSi tu dois effectuer le script régulièrement il vaut mieux le mettre en action, et si tes fichiers sont très gros et que tu as l’impression que ça plante il faut ajouter au script un affichage de l’avancement.
Tu me dis…@+
😎bebarth
Maître des clésbonjour,
Voici un script que tu pourras exécuter soit à partir de la console ou d’une action.
var papierA=app.newDoc();
var papierB=app.newDoc();
var papierC=app.newDoc();
for (var i=0; i<this.numPages; i+=4) {
papierA.insertPages ({
nPage: papierA.numPages-1,
cPath: this.path,
nStart: i
});
papierB.insertPages ({
nPage: papierB.numPages-1,
cPath: this.path,
nStart: i+1,
nEnd: i+2
});
papierC.insertPages ({
nPage: papierC.numPages-1,
cPath: this.path,
nStart: i+3
});
}
papierA.deletePages(0);
papierB.deletePages(0);
papierC.deletePages(0);
papierA.viewState={overViewMode:2};
papierB.viewState={overViewMode:2};
papierC.viewState={overViewMode:2};
papierA.saveAs({
cPath: this.path.replace(/.pdf$/i," (Impression papier A).pdf"),
});
papierB.saveAs({
cPath: this.path.replace(/.pdf$/i," (Impression papier B).pdf"),
});
papierC.saveAs({
cPath: this.path.replace(/.pdf$/i," (Impression papier C).pdf"),
});
@+
😎bebarth
Maître des clésAutre question : La différence entre les 2 premières pages à extraire (1,4 -> ∆=3) et les autres (4,8 ou 8,12 -> ∆=4) n’est pas la même.
Est-ce bien correct ?@+
😎bebarth
Maître des clésbonjour,
Ce n’est pas trop compliqué, je te fait ça dans l’après-midi.
Par contre, les pages imprimées sur papier C (4, 8, …) le sont déjà sur le papier A ! Correct ???
Veux-tu un script uniquement pour imprimer les pages ou pour les extraire dans un autre fichier afin de les imprimer ?@+
😎bebarth
Maître des clésbonjour & Bonne Année à tous !
Avec ton fichier il n’y a pas de raison pour que le résultat s’efface…
Voici une autre version où les 2 champs sont formatés en “Nombre” et le résultat avec virgule.this.getField("IMC").value = imc.toFixed(1).toString().replace(/[.]/,",");
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Tu peux écrire (non vérifié) :
var numerateur=this.getField("num").value;
var denominateur=this.getField("den").value;
if (denominateur.indexOf("-")==0) {
if (numerateur.indexOf("-")==0) {
var numerateur=numerateur.substr(1);
var denominateur=denominateur.substr(1);
} else {
var numerateur="-"+numerateur;
var denominateur=denominateur.substr(1);
}
}
this.getField("help.3").value="Décomposition du numérateur : "+numerateur+"\n"+"Décomposition du dénominateur : "+denominateur;
@+
😎bebarth
Maître des clésbonjour,
Rien que sur cette feuille il y a 86 champs avec des calculs. Ce qui provoque la latence avant affichage des champs !
Il faudrait connaitre la totalité des calculs pour voir ce qui est possible de faire, mais déjà as-tu besoin de remplir/calculer toutes les lignes ? Elles ne sont certainement pas toutes remplies à chaque fois !@+
😎 -
Cette réponse a été modifiée le il y a 9 mois et 2 semaines par
-
AuteurRéponses