Toutes mes réponses sur les forums
-
AuteurRéponses
-
bebarth
Maître des clésPeux tu m’expliquer les quelques lignes qui permettent d’afficher une question aléatoirement mais avec une plus grande fréquence pour les réponses erronées.
Lorsque l’on crée le menu déroulant depuis la table “reponses”, la valeur d’exportation de chaque élément est mise à 0. Cette valeur représente le nombre de réponses exactes pour cette question et est incrémentée lorsque la réponse est correcte.
var moyenne=0;
for (var i=1; i<nb; i++) moyenne+=reponses[1];
moyenne/=(reponses.length-1);
signifie que l’on fait la moyenne de toutes ces valeurs d’exportation, et “for (var i=1…” et non i=0 car on ne tient pas compte de la première ligne “-/-“. Idem pour “…length-1);
var aleatoire=Math.floor(Math.random()*nb);
Bon ben ça c’est un nombre aléatoire sur le nombre d’éléments de la table “reponses”.
while (reponses[aleatoire][1]>moyenne || laQuestion=="-") {
var aleatoire=Math.floor(Math.random()*nb);
var laQuestion=lesReponses[aleatoire][0];
var laReponse=lesReponses[aleatoire][1];
}
…et ça c’est une boucle. Tant que le deuxième élément ([1]) de l’élément à la position [aleatoire] de la table “reponses” est supérieure à la moyenne, ou si laQuestion==”-“, on recommence le tirage d’un nombre aléatoire.
L’explication est un peu compliquée je suppose… J’espère que tu as compris !@+
😎-
Cette réponse a été modifiée le il y a 1 année et 3 mois par
bebarth.
bebarth
Maître des clésbonjour,
Je viens de constater qu’il y a encore des doublons pour les réponses sous forme de liste.
J’ai essayé mais je ne trouve pas de doublons !
De plus lors de la création de la liste par ordre alphanumérique, est il possible d’avoir le 10 après le 9 et non entre le 1 et le 2 ou c’est trop complexe?
C’est possible mais ça va compliquer le script. Ici les questions (ex. : “3×10”) sont des chaines de caractères. Pour les trier comme tu le souhaite il faudrait transformer chaque chaine en table coupée au “x” (ex. : [3,10]) puis trier sur le deuxième élément de la table et finir par retransformer la table en chaine de caractères .toString() et remplacer la virgule par un “x”.
Ce n’est pas très compliqué, mais le script sera différent si tu veux changer les questions par des soustractions, divisions ou additions…@+
😎bebarth
Maître des clésbonjour,
Pour la liste de réponse, est il possible d’éliminer les doublons dans la liste de réponse et de classer les éléments de la liste par ordre alphanumérique ?
J’avais écris une fonction il y a quelques années… Je l’ai donc adaptée pour ton script !
Dans l’exemple j’ai ajouté plusieurs doublons pour montrer ce que ça donne.Pour les réponses type Champ Texte, comme la vérification est en action de frappe, si la réponse saisie contient plusieurs caractères, cela va afficher le message d’erreur dès la frappe du 1er caractère.
Vu que pour le type de champ Liste le script est en script de touches personnalisé, il n’est exécuté que lorsque l’évènement vient de ce champ liste. Si On utilise un champ Texte pour indiquer la réponse, il faut d’abord vérifier que l’évènement vient de ce champ (cf. le script de calcul “Rep”).
Dernier souci, j’ai remarqué que lorsque je génère les questions, cela fonctionne seulement si je sauvegarde, ferme puis ouvre le document.
Ça c’est normal vu que l’initialisation du champ se fait avec le bouton démarrer par “if (!reponses.length)” et qu’en script de document on a “var reponses=[];”
Avec ton bouton “generateur” on peut maintenant réinitialiser la liste.Pour le bonton “vérifier” j’ai retire le message “Erreur…” car il est déjà affiché directement si la réponse n’est pas correcte que ce soit via une liste ou un champ texte.
Voici les scripts :
// Script de document
var reponses=[];
var nbQuestions=0;
var nbReponses=0;
this.getField(“Reponse”).setItems([“-“]);
this.getField(“Question”).value=””;
this.getField(“Score”).value=””;
this.getField(“Score”).value=””;// Script de calcul “Démarrer”
if (!reponses.length) {
var lesReponses=this.getField(“entreesListe”).value.split(“\r”);
function triSansDoublons(uneTable) {
return uneTable.sort().filter(function(valeur, indice, cetteTable) {
return !indice || valeur!=cetteTable[indice-1];
});
}
var lesReponses=triSansDoublons(lesReponses);
this.getField(“entreesListe”).value=lesReponses.toString().replace(/[,]/g,”\r”);
var nb=lesReponses.length;
var reponses=[];
for (var i=0; i<nb; i++) {
lesReponses=lesReponses.split(“\/”);
reponses.push([lesReponses[1],0]);
}
}
var moyenne=0;
for (var i=1; i<nb; i++) moyenne+=reponses[1];
moyenne/=(reponses.length-1);
var aleatoire=Math.floor(Math.random()*nb);
var laQuestion=”-“;
while (reponses[aleatoire][1]>moyenne || laQuestion==”-“) {
var aleatoire=Math.floor(Math.random()*nb);
var laQuestion=lesReponses[aleatoire][0];
var laReponse=lesReponses[aleatoire][1];
}
this.getField(“Reponse”).setItems(reponses);
this.getField(“Question”).value=laQuestion;
this.getField(“Score”).value=””;// Script de touches personnalisé “Reponse”
if (!event.willCommit) {
nbQuestions++;
if (event.change!=laReponse) app.alert(“Erreur !!!\rLa bonne réponse est : “+laReponse,3);
else {
reponses[aleatoire][1]=Number(event.changeEx)+1;
this.getField(“Reponse”).setItems(reponses);
nbReponses++;
}
}// Script de calcul “Rep”
if (event.source && event.source.name==event.target.name) {
nbQuestions++;
if (event.value!=laReponse) app.alert(“Erreur !!!\rLa bonne réponse est : “+laReponse,3);
else {
reponses[aleatoire][1]=reponses[aleatoire][1]+1;
nbReponses++;
}
}// Script de calcul “vérifier”
if (reponses.length) this.getField(“Score”).value=” • Nombre de bonnes réponses : ” +nbReponses+”\r”+” • Nombre d’erreurs : ” +(nbQuestions-nbReponses)+”\r”+” • Nombre de questions : ” +nbQuestions+”\r”+” • Taux de réussite : ” +(Math.round((100*nbReponses/nbQuestions) * 100) / 100).toString().replace(/[.]/,”,”)+” %”;// Script de calcul “geberateur”
var lesReponses=this.getField(“entreesListe”).value.split(“\r”);
function triSansDoublons(uneTable) {
return uneTable.sort().filter(function(valeur, indice, cetteTable) {
return !indice || valeur!=cetteTable[indice-1];
});
}
var lesReponses=triSansDoublons(lesReponses);
this.getField(“entreesListe”).value=lesReponses.toString().replace(/[,]/g,”\r”);
var nb=lesReponses.length;
var reponses=[];
for (var i=0; i<nb; i++) {
lesReponses=lesReponses.split(“\/”);
reponses.push([lesReponses[1],0]);
}@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Concernant ton dernier fichier, j’ai l’impression de répéter toujours la même chose !- Tu parles de trigonométrie circulaire (cos) et dans ta formule tu utilises la trigonométrie hyperbolique (cos).
- Si tu recherche le cosinus (cos) il ne faut pas utiliser l’argument (acos).
- Les angles doivent être indiqués en radians et non en degrés.
- La syntaxe JavaScript n’est pas correct pour le script de calcul personnalisé.
Il ne faut donc pas écrire :
Text1/Math.acosh(Text2)
mais :
event.value=this.getField("Text1").value/Math.cos(this.getField("Text2").value*Math.PI/180);
Cf. fichier joint.
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Je vois ! En fait j’ai rajouté le script de document à la dernière minute avant d’envoyer le fichier et sans le tester… Erreur de débutant lol
Du coup, la table “reponses” est déclarée à l’ouverture du document et if (reponses==null) n’est plus vrai.
J’ai donc modifié légèrement les scripts :// Script de document
var reponses=[];
var nbQuestions=0;
var nbReponses=0;
this.getField("Reponse").setItems(["-"]);
this.getField("Question").value="";
this.getField("Score").value="";
// Script de calcul "Démarrer"
if (!reponses.length) {
var lesReponses=this.getField("entreesListe").value.split("\r");
var nb=lesReponses.length;
var reponses=[];
for (var i=0; i<nb; i++) {
lesReponses=lesReponses.split("\/");
reponses.push([lesReponses[1],0]);
}
}
var moyenne=0;
for (var i=1; i<nb; i++) moyenne+=reponses[1];
moyenne/=(reponses.length-1);
var aleatoire=Math.floor(Math.random()*nb);
var laQuestion="-";
while (reponses[aleatoire][1]>moyenne || laQuestion=="-") {
var aleatoire=Math.floor(Math.random()*nb);
var laQuestion=lesReponses[aleatoire][0];
var laReponse=lesReponses[aleatoire][1];
}
this.getField("Reponse").setItems(reponses);
this.getField("Question").value=laQuestion;
// Script de touches personnalisé "Reponse"
if (!event.willCommit) {
nbQuestions++;
if (event.change!=laReponse) app.alert("Erreur !!!\rLa bonne réponse est : "+laReponse,3);
else {
reponses[aleatoire][1]=Number(event.changeEx)+1;
this.getField("Reponse").setItems(reponses);
nbReponses++;
}
}
// Script de calcul "vérifier"
if (reponses.length) this.getField("Score").value=nbReponses+"/"+nbQuestions;
… et ce coup ci c’est testé !
Il y a juste à voir comment se compte le nombre de question. Dans mon script il est incrémenté par la réponse (correcte ou mauvaise). Si l’utilisateur clique plusieurs fois sur “Démarrer” sans répondre, le nombre de question n’augmente pas.
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonsoir,
Désolé mais je n’ai pas encore eu le temps… En fait je pensais reprendre depuis le début car ton fichier possède beaucoup de champs répétés. Lorsqu’on a le nez dedans on les connais par coeur, mais quand on reprend des scripts et/ou formules dont on est pas l’auteur c’est un peu plus compliqué à se mettre dedans.
Tous ça pour dire que ça va me prendre un peu de temps que je n’ai pas ces jours-ci.Je vais quand même regarder vite fait juste pour ta formule !
@+
😎bebarth
Maître des clésbonsoir,
Voici les différents script pour rester dans le même principe.// Script de document
var reponses=[];
var nbQuestions=0;
var nbReponses=0;
this.getField("Reponse").setItems(["-"]);
this.getField("Question").value="";
this.getField("Score").value="";
// Script de calcul "Démarrer"
if (reponses==null) {
var lesReponses=this.getField("entreesListe").value.split("\r");
var nb=lesReponses.length;
var reponses=[];
for (var i=0; i<nb; i++) {
lesReponses=lesReponses.split("\/");
reponses.push([lesReponses[1],0]);
}
}
var moyenne=0;
for (var i=1; i<nb; i++) moyenne+=reponses[1];
moyenne/=(reponses.length-1);
var aleatoire=Math.floor(Math.random()*nb);
var laQuestion="-";
while (reponses[aleatoire][1]>moyenne || laQuestion=="-") {
var aleatoire=Math.floor(Math.random()*nb);
var laQuestion=lesReponses[aleatoire][0];
var laReponse=lesReponses[aleatoire][1];
}
this.getField("Reponse").setItems(reponses);
this.getField("Question").value=laQuestion;
// Script de touches personnalisé "Reponse"
if (!event.willCommit) {
nbQuestions++;
if (event.change!=laReponse) app.alert("Erreur !!!\rLa bonne réponse est : "+laReponse,3);
else {
reponses[aleatoire][1]=Number(event.changeEx)+1;
this.getField("Reponse").setItems(reponses);
nbReponses++;
}
}
// Script de calcul "vérifier"
if (reponses!=null) this.getField("Score").value=nbReponses+"/"+nbQuestions;
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Il faut écrire :
listeDeroulante.setItems([["tata",1], ["titi",2],["toto",3]]);
@+
😎bebarth
Maître des clésbonjour,
Voici ce que je te propose.
On met les questions et réponses dans un champ liste ce qui permet de n’avoir qu’un champ au lieu de 2. On pourrait également définir une table dans le script avec les questions et les réponses.Donc, pour répondre aux 2 points indiqués en rouge :
// Script de calcul "Button1"
var f=this.getField("entreesListe");
var nb=f.numItems;
if (reponses==null) {
var reponses=[];
for (var i=0; i<nb; i++) reponses.push([f.getItemAt(i,true),0]);
}
var moyenne=0;
for (var i=0; i<nb; i++) moyenne+=reponses[1];
moyenne/=reponses.length;
var aleatoire=Math.floor(Math.random()*nb);
while (reponses[aleatoire][1]>moyenne) var aleatoire=Math.floor(Math.random()*nb);
var laQuestion=f.getItemAt(aleatoire,false);
var laReponse=f.getItemAt(aleatoire,true);
this.getField("Reponse").setItems(reponses);
this.getField("Question").value=laQuestion;
// Script de touches personnalisé "Reponse"
if (!event.willCommit) {
if (event.change!=laReponse) app.alert("Erreur !!!\rLa bonne réponse est : "+laReponse,3);
else {
reponses[aleatoire][1]=Number(event.changeEx)+1;
this.getField("Reponse").setItems(reponses);
}
}
@+
😎-
Cette réponse a été modifiée le il y a 1 année et 3 mois par
bebarth.
Attachments:
You must be logged in to view attached files.bebarth
Maître des clés… Erreur lors de la conversion radians en degrés ! Il faut écrire :
event.value=Math.acos(this.getField("RESULLIGNBC").value)*180/Math.PI;
@+
😎bebarth
Maître des clésbonjour,
acosh est la fonction inverse cosinus hyperbolique qui d’ailleurs comme indiqué dans un autre post ne fonctionne pas !
Dans ton cas if faut utiliser acos ! Si elle ne fonctionne pas, il doit y avoir une erreur… Y a-t-il un mesage dans la console ?@+
😎bebarth
Maître des clésbonjour,
Voici un script avec lequel il n’est pas possible de cocher la case si la somme était supérieure à 6000 une fois cette case cochée.
var somme=this.getField("VT").value;
var ind=event.target.name.substr(1);
if (event.target.value!="Off") {
if (somme+event.target.value<6000) {
this.getField("VT").value+=event.target.value;
this.getField("v"+ind).value=event.target.value;
} else event.target.value="Off";
} else {
this.getField("VT").value-=event.target.exportValues;
this.getField("v"+ind).value=0;
}
Dans le fichier exemple j’ai mis ce script en fonction pour éviter de le recopier 6 fois !
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésIl n’y a pas de messagerie sur ce forum !
Tu peux m’envoyer un mail à bebarth arobase sfr point fr et je te répondrai !@+
😎bebarth
Maître des clésbonjour,
Quel OS ? As-tu essayé en open source ?
https://sourceforge.net/directory/ocr/Ci-joint le résultat avec un “pas gratuit” ! Il faut dire que le scan n’est pas terrible…
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Il y a beaucoup d’erreurs de syntaxe. En JavaScript il ne suffit pas d’indiquer le nom du champ (comme on le fait en notation simplifiée) pour récupérer la valeur du champ. Il faut donc écrire par exemple :
event.value=Math.acos(this.getField("cosABC").value)*(180/Math.PI);
Il y a également encore des inverses hyperboliques (asinh) au lieu de circulaires (asin)…
@+
😎bebarth
Maître des clésbonjour,
J’ai voulu commencer à regarder ce soir, mais malheureusement je ne comprends pas les questions !Bonjour, Voila je suis presque arrivé a la fin, mais je n’arrive pas a mettre en relation 3 choses (si deja c’est possible !)
• 1 la cote de 180° est ce que c’est possible de pouvoir calculer sur un triangle rectangle voir sur un triangle quelconque
• 2 Je n’arrive pas a aller au bout du cadre bleu avec les inverses tan, cos ou sinus !
• 3 je pense que c’est impossible de tout mettre en relation ?, si pas en deux groupes c’est possible ?- Il est normalement possible de calculer tous les angles d’un triangle vu qu’on sait que la somme est de 180°.
Pour rappel, la somme des angles d’un polygone est égale à (n-2)*180° (où n est le nombre de côtés). - Je ne comprends pas ce qu’est “le cadre bleu” (et quel fichier).
- Normalement si ! Si on connait la formule générique pour calculer le côté opposé d’un triangle quelconque ABC : C<sup>2</sup>=A<sup>2</sup>+B<sup>2</sup>-2AB*cos(c)
Merci de me donner les détails pour pouvoir continuer.
@+
😎bebarth
Maître des clésbonjour,
Bien ton fichier ! Je regarde la trigo, mais je ne te promets pas quand…@+
😎bebarth
Maître des clésbonjour,
Bravo ! Je me doutais de quelque chose comme ça mais je n’ai pas trouvé où.
C’est pourquoi je préfère personnellement mettre ce genre de script en script de touches personnalisé, pour éviter ce “problème”.
@+
😎bebarth
Maître des clésbonjour,
Dans ton script de format (qui est exécuté à l’ouverture du document), tu dois récupérer la valeur de ton champ “dependentDropdown” avant le reste du script avant de la rappeler en fin de script.var valeurDependentDropdown=this.getField("dependentDropdown").value;
...
...
this.getField("dependentDropdown").value=valeurDependentDropdown;
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
…ainsi j’aurai pu mette ce que j’ai créé ou d’autre personne, la j’ai créé grâce a vous un aide mémoire auto pour tout les formule de mathématique que toute personne peux utiliser dans la vie de tout les jours !, mais c’est vrai que je l’ai orienté plus conception métallerie…
Moi, tout m’intéresse et en plus je suis un ancien chaudronnier/soudeur ! Donc si tu veux partager via un lien, je regarderai.
@+
😎bebarth
Maître des clésbecause,
Non, ça ce n’est pas possible !
@+
😎bebarth
Maître des clésEn trigonométrie circulaire il faut juste écrire :
event.value=Math.sin(this.getField("Text2").value*Math.PI/180);
C’est le même principe pour toutes les fonctions circulaires sin, cos et tan et leurs fonctions inverses.
@+
Attachments:
You must be logged in to view attached files.bebarth
Maître des clésBonjour,
je suis un peu perdu ! Parles-tu de fonctions trigonométriques circulaires ou hyperboliques.
Les fonctions JavaSript Math. ne fonctionnent pas avec Acrobat JavaScript juste pour les fonctions hyperboliques mais fonctionnent correctement avec les fonctions circulaires. Dans ce cas, les angles doivent être indiqués en radians et non en degrés.
…et que veux-tu dire dans tes fichiers par “et avec une seule fonction” ???
@+
😎-
Cette réponse a été modifiée le il y a 1 année et 4 mois par
bebarth.
bebarth
Maître des clésbonjour,
Sur ton document la formule écrite est 52/cos(24) et non 52/acosh(24) !Si c’est effectivement l’argument cosinus hyperbolique que tu souhaite utiliser, je ne sais pas pourquoi (mais je vais essayer de me renseigner) Math.acosh() ne fonctionne pas en Acrobat JavaScript…
Par contre on peut recréer cette fonction, et il faut donc écrire :
function acosh(x) {
return Math.log(x+Math.sqrt(x*x-1));
}
event.value=this.getField(“Text1”).value/acosh(this.getField(“Text2”).value);@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonsoir,
… c’était donc plutôt “demain soir” !!! Je suis un retraité overbooké comme tous les retraité ! 😉
Voici les différents scripts pour ton document et le fichier en pièce jointe. Je te laisse les étudier et n’hésite pas à me demander ce que tu ne comprends pas. J’ai choisi de mettre les différents prix dans une table de tables “tarifs”. Je pense que l’option pour un fichier .csv en pièce jointe aurait été plus appropriée si on avait eu beaucoup plus de données.
Tu vérifies si tout se passe comme tu le souhaites et tu me dis.// init en Script de document
var tarif=[
[ // N&B
[10,15,25,35], // Carte d'affaire
[15,25,35,45], // 1/4 de page
[25,40,55,80], // 1/3 de page
[40,70,100,130], // 1/2 page
[100,150,200,250] // Pleine page
],
[ // Quadri
[20,30,40,60], // Carte d'affaire
[30,50,70,90], // 1/4 de page
[50,80,110,160], // 1/3 de page
[80,140,200,275], // 1/2 page
],
];
function options(indice) {
for (var i=0; i<=4; i++) {
if (i!=indice) this.getField("option."+i).value="Off";
}
}
// totalPrix
var couleur=-1;
if (this.getField("couleur.gris").value!="Off") var couleur=0;
else if (this.getField("couleur.couleur").value!="Off") var couleur=1;
var format=-1;
for (var i=0; i<=4; i++) {
if (this.getField("option."+i).value!="Off") {
var format=i;
break;
}
}
var nb=0;
for (var i=0; i<=3; i++) {
if (this.getField("mois."+i).value!="Off") nb++;
}
this.getField("total.parutions").value=nb;
if (couleur>-1 && format>-1 && nb) event.value=tarif[couleur][format][nb-1];
else event.value=0;
if (this.getField("Mois").value!="Off") event.value=Number(event.value)+this.getField("Mois").value*25;
if (event.value==0) event.value="";
// couleur.gris
if (event.target.value!="Off") {
this.getField("couleur.couleur").value="Off";
this.getField("option.4").display=display.visible;
}
// couleur.couleur
if (event.target.value!="Off") {
this.getField("couleur.gris").value="Off";
this.getField("option.4").value="Off";
this.getField("option.4").display=display.hidden;
} else this.getField("option.4").display=display.visible;
// option
options(event.target.name.substr(event.target.name.indexOf(".")+1));
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésJe regarde ça ce soir ou demain…
@+
😎bebarth
Maître des clésbonjour,
On peut récupérer les tarifs avec effectivement soit une table ou un fichier .csv en pièce jointe. J’hésite quelle est la meilleure solution…
Si je comprends bien le tarif, les pages intérieures obligatoirement en niveaux de gris tandis que la couleur est réservée enpremière et quatrième de couverture ! Correct ?Sur ton fichier, on peut choisir plusieurs formats pour une parution, c’est normal ? Si non, du coup il faudrait plutôt mettre des boutons radio. Idem pour “256 tons GRIS” et “COULEUR”…
La première page est-elle automatiquement une pleine page ??? et pour la quatrième de couverture, y a-t-il différents formats ?@+
😎J’avais pas bien lu !
-
Cette réponse a été modifiée le il y a 1 année et 4 mois par
bebarth.
bebarth
Maître des clésAvec ma méthode, la fonction ne sert plus, et la variable Reponse est une opération Numerateur/Denominateur;
Il faut donc juste écrire :
Reponse=Numerateur/Denominateur;
if (Reponse ==eval (RepUser)) {
app.alert({cMsg:"Bravo.", nIcon:2});this.getField("Neq").value++;
MessEqOk();
console.println("RepUser="+RepUser+" ; Reponse="+Reponse);
} else {
app.alert({cMsg:"La fraction est insufisament simplifiée, ou fausse.", nIcon:2});
erreurs++;
console.println("RepUser="+RepUser+" ; Reponse="+Reponse);
}
@+
😎-
Cette réponse a été modifiée le il y a 1 année et 4 mois par
bebarth.
Attachments:
You must be logged in to view attached files.bebarth
Maître des clésMerci, 2 questions cependant : pourquoi appelle-t-on 2 fois la fonction ?
nbAleatoires();
while (b*f-e*c<=0 || a*f-c*d<=0) nbAleatoires();
En créant une fonction on peut se passer de déclarer les variables avec la valeur 0 ?Une première fois, cela déclare les variables avec un nombre aléatoire au lieu d’un zéro, et si les 2 conditions requises ne sont pas obtenues on effectue la boucle while jusqu’à qu’elles le soient.
La fonction évite d’écrire 2 fois les lignes des nombres aléatoires.
@+
😎bebarth
Maître des clésbonjour,
Je ne sais pas si j’ai bien compris, mais sinon ça me parait bien compliqué !
Pour moi il suffit d’écrire :
if (this.getField ("RepEt.2b").value/this.getField ("RepEt.1b").value==eval(this.getField("RepEt.3").value)) app.alert("Bravo.",2);
else app.alert("La fraction est insufisament simplifiée, ou fausse.",2);
ou avec des variables :
var Numerateur=this.getField ("RepEt.2b").value;
var Denominateur=this.getField ("RepEt.1b").value;
var RepUser=this.getField("RepEt.3").value;
if (Numerateur/Denominateur==eval(RepUser)) app.alert("Bravo.",2);
else app.alert("La fraction est insufisament simplifiée, ou fausse.",2);
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Le plus simple est effectivement de déclarer toutes les variables en les mettant à 0.
Par contre, les conditions ne sont pas correctes. Il faut écrire :
var a=0;
var b=0;
var c=0;
var d=0;
var e=0;
var f=0;
while (b*f-e*c<=0 || a*f-c*d<=0) {
var a=Math.round(Math.random()*7)+2;
var b=Math.round(Math.random()*9)+1;
var c=Math.round(Math.random()*8)+1;
var d=Math.round(Math.random()*9)+1;
var e=Math.round(Math.random()*8)+1;
var f=Math.round(Math.random()*9)+1;
}
Sinon, tu peux également définir une fonction :
function nbAleatoires() {
var a=Math.round(Math.random()*7)+2;
var b=Math.round(Math.random()*9)+1;
var c=Math.round(Math.random()*8)+1;
var d=Math.round(Math.random()*9)+1;
var e=Math.round(Math.random()*8)+1;
var f=Math.round(Math.random()*9)+1;
}
nbAleatoires();
while (b*f-e*c<=0 || a*f-c*d<=0) nbAleatoires();
@+
😎bebarth
Maître des clésbonjour,
Pas exactement.
Tu as tout à fait raison, mais ce que je voulais dire c’est que dans ce cas le résultat est identique que l’on mette le + ou pas avec le g.
Ici on aurait pu écrire /\s/g car le global détecte toutes les espaces (consécutives ou non) alors que /\s+/g détecte tous les “au moins une” espaces consécutives. En théorie c’est plus rapide puisqu’il peu y avoir moins d’occurences !
Lorsque on met le signe + (un ou plus) avec le g (global) le + est donc redondant pour moi, ce qui n’est plus vrai à partir de {2,} (2 ou plus). Mais je le laisse car l’expression est plus parlante à mon avis.@+
😎bebarth
Maître des clésC’est bien ça ?
C’est ça, exactement !
+ signifie : présent une ou plusieurs fois.
g signifie qu’on veut une recherche globale, c’est à dire une recherche qui ne s’arrête pas à la première occurrence trouvée mais qui les cherche toutes.Dans ce cas, ces 2 signes sont redondants, mais ce n’est pas grave de les mettre ensemble.
@+
😎21 novembre 2023 à 12:46 en réponse à : Champs adresses remplis après sélection nom dans liste #73567bebarth
Maître des clésbonjour,
Désolé pour cette réponse tardive, je pensais avoir répondu !j’ai un problème avec le script “veto” le nom du veto disparaît lors de l’enregistrement du document
Ça ce n’est pas compliqué, il suffit de récupérer la valeur du menu déroulant à l’ouverture du document et de redonner cette valeur après lecture des données de la pièce jointe dans le script de document.
var leCabinet=this.getField("nomCabinet").value;
...
this.getField("nomCabinet").value=leCabinet;
Moins grave, si je veux ajouter une info après le cabinet sélectionné comme (un nom par exemple), l’adresse s’efface … As-tu une idée ?
Ça c’est plus compliqué et je ne sais pas si c’est une bonne idée… Je vais réfléchir !
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Une petite erreur…Ici, la notation équivaut à var num=c+(b*d) ou var num=c-(b*d)
Il faut donc écrire :
...
while (c-b*d==0 || c+b*d==0) {
...
Même si “c+b*d==0” avec des nombres aléatoires ne doit pas être fréquent !
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clés…sinon tu peux réduire un peu le script :
var OpAl=Math.round(Math.random()*1)+1;
var a=0;
var b=0;
var c=0;
var d=0;
while (c==0 || b==0 || d==0) {
var a=Math.round(Math.random()*7)+2;
var b=Math.round(Math.random()*9)+1;
var c=Math.round(Math.random()*8)+1;
var d=Math.round(Math.random()*9)+1;
}
if (OpAl==1) var num=(c-b*d);
else var num=(c+b*d);
var den=(a*d);
this.getField("numOk").value=num;
this.getField("denOk").value=den;
this.getField("NB.1").value=a;
this.getField("NB.2").value=b;
this.getField("NB.3").value=c;
this.getField("NB.4").value=d;
Ici, la notation équivaut à var num=c+(b*d) ou var num=c-(b*d)
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésDans un premier temps, il faut initialiser tes variables a, b, c et d avant d’effectuer la première boucle “while” !
Tu me dis si ça fonctionne ensuite…
@+
😎bebarth
Maître des clésDésolé, mais toi tu es dans ton script et tu connais certainement par cœur les variables et ce que tu veux faire, mais à moins de déchiffrer tous tes scripts je suis un peu perdu !!!
Quand la variable “diff” est-elle incrémentée et devient-elle égale à 6 ?
Que souhaites-tu faire exactement avec ce script ?@+
😎bebarth
Maître des clésbonjour,
Bonjour, pas testé cette dernière version mais la précédente marchait bien il me semble
Il fonctionne mais également pour des réponses incorrectes. Ce script vérifie que les 2 nombres vC2 et vC3 sont présents et qu’il y a un signe de multiplication (x ou *) entre 2 nombres. Mais si par exemple la réponse correcte est 3×5, il valide également 35 x 11 car il y a bien un 3, un 5 et un signe entre 2 nombres…
Sinon, je reconnais que je ne comprend pas cette ligne :
var RepUser2=this.getField("RepUser2").valueAsString.replace(/\s+/g,"").replace(/[x]/,"*").split("*");
Ici la variable RepUser2 va être transformée en une table de 1 ou 2 cellules selon la réponse (un nombre ou une opération).
replace(/\s+/g,"")
On supprime tous les espaces.
replace(/[x]/,"*")
On remplace l’éventuel signe de multiplication “x” en “*”.
split("*")
On transforme la chaine de caractères en table avec “*” comme séparateur de cellules.Et celle-ci :
if (RepUser2.length==2 && ((vC2==RepUser2[0] &&
vC3==RepUser2[1]) || (vC2==RepUser2[1] && vC3==RepUser2[0])))
OK++;
if (RepUser2.length==2...
Si la table à 2 valeurs c’est que le résultat est une opération (si elle en a qu’une c’est le résultat de l’opération)
&& ((vC2==RepUser2[0] && vC3==RepUser2[1]) vC2)
est égale à la première cellule de ta table et vC3 à la seconde…
|| (vC2==RepUser2[1] && vC3==RepUser2[0]))
ou l’inverse…
) OK++;
la variable “OK” (initialement 0) est incrémentée.J’ai un autre souci avec ce fichier…
Je regarde plus tard !
@+
😎bebarth
Maître des clésbonjour,
Voici donc une version qui devrait correspondre à ce que tu cherches à faire :
var vC2=this.getField("NB.2").valueAsString;
var vC3=this.getField("NB.3").valueAsString;
var RepUser2=this.getField("RepUser2").valueAsString.replace(/\s+/g,"").replace(/[x]/,"*").split("*");
var OK=0;
if (RepUser2.length==2 && ((vC2==RepUser2[0] && vC3==RepUser2[1]) || (vC2==RepUser2[1] && vC3==RepUser2[0]))) OK++;
else if (RepUser2.length==1 && RepUser2==Number(vC2)*Number(vC3)) OK++;
if (OK) app.alert({cMsg:"Bravo !", nIcon:2});
else app.alert({cMsg:"Erreur !", nIcon:2});
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésÇa fonctionne si on indique le résultat mais pas si on écrit la multiplication.
Voici un script qui vérifie tous les cas :
var vC2=this.getField("NB.2").valueAsString;
var ReGex2=new RegExp(vC2);
var vC3=this.getField("NB.3").valueAsString;
var ReGex3=new RegExp(vC3);
var RepUser2=this.getField("RepUser2").valueAsString;;
if ((ReGex2.test(RepUser2) && ReGex3.test(RepUser2) && /^\d+\s*([*]|[x])\s*\d+$/.test(RepUser2)) || RepUser2==Number(vC2)*Number(vC3)) app.alert({cMsg:"Bravo !", nIcon:2});
else app.alert({cMsg:"Erreur !", nIcon:2});
@+
😎En fait cette version fonctionne lorsque le résultat est correct mais également avec de mauvaises réponses lorsqu’on indique l’opération.
Le script vérifie que les 2 nombres vC2 et vC3 sont présents dans le résultat et qu’il y a bien un signe pour la multiplication, mais si un des nombres est composé des 2 valeurs vC2 et vC3 et que le second nombre est incorrect il indique la réponse comme bonne… alors que ce n’est pas le cas !-
Cette réponse a été modifiée le il y a 1 année et 4 mois par
bebarth.
Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Je vois 2 erreurs :
var RepUser2 = this.getField("RepUser<span style="color: #ff9900;">2</span>").valueAsString;
...
if (RepUser2 == (vC2 + ("×" || "*" || " × " || " * ") + vC3) || <span style="color: #ff9900;">RepUser2 ==</span> (vC3 + ("×" || "*" || " × " || " * ") + vC2) || <span style="color: #ff9900;">RepUser2 ==</span> (Number(vC2) * Number(vC3))<span style="color: #ff0000;"><del> && vC1</del></span>)...
Ici j’ai retiré “&& vC1” car je ne sais pas ce que tu veux vérifier…
Tu testes et tu me dis !@+
😎15 novembre 2023 à 20:57 en réponse à : Champs adresses remplis après sélection nom dans liste #73523bebarth
Maître des clésMerci pour ta réponse ! C’est ok mais j’ai un problème avec mon dernier script for (var i = 0; i < colonnes.length; i++) { if (event.value == colonnes[2]) { this.getField(“43 Deplacement”).value = colonnes[6]; break; } } j’ai un message d’erreur car le format du champ 43 est nombre monétaire
Essaye :
...
this.getField("43 Deplacement").value = Number(colonnes[6]);
...
En supposant que “colonnes[6]” (la septième colonne numérotée basée sur 0) est bien un nombre !
@+
😎-
Cette réponse a été modifiée le il y a 1 année et 4 mois par
bebarth.
15 novembre 2023 à 20:55 en réponse à : Champs adresses remplis après sélection nom dans liste #73522bebarth
Maître des clésDésolé, existe-t-il une autre méthode que vous pouvez utiliser pour saisir et mettre à jour des données avec le lecteur gratuit ? peccato, nessun altro metodo da poter utilizzare per inserire e aggiornare dati con il lettore gratuito?
Je ne pense pas !
@+
😎15 novembre 2023 à 18:08 en réponse à : Champs adresses remplis après sélection nom dans liste #73516bebarth
Maître des clésBonjour Bebarth J’ai réussi à importé et modifier les scripts avec adresses sans problème par contre pour les NPA j’ai qqch qui beug ! Même en reprenant le NPA du fichier avec les adresses afin d’avoir qu’un seul csv … Une case efface l’autre !? Je souhaite utiliser le script dans chaque case du formulaire avec ville et adresse il me suffit de copier ton script dans les actions des cases en question ? for (var i=0; i<colonnes.length; i++) { if (event.value==colonnes[3]) { this.getField(“npaCabinet”).value=colonnes[2]; break; } } J’ai loupé qqch ? Il me semple que c’est les colonnes 3 et 4 Non ? Pas 2 et 3 ? J’ai essayé de remplacer “npaCabinet” par “06 NPA” et villeCabinet par “07 ville” qui corresponde au champs de mon document mais cela ne fonctionne pas Je souhaite aussi ajouter une colonne dans mon csv ( N°7 frais de déplacements) avec un montant et le reprendre dans une case plus loin dans le formulaire en fonction en fonction du NPA ajouté dans le champs ” 06 NPA”
Il faudrait partager ton fichier car comme ça je ne comprends pas !
@+
😎15 novembre 2023 à 18:06 en réponse à : Champs adresses remplis après sélection nom dans liste #73515bebarth
Maître des clésSalut, en faisant les tests j’ai vu que ça marche sur Acrobat 2020 (je mets à jour le livre) alors qu’avec le lecteur Adobe gratuit, ça ne marche pas. (il ne le met pas à jour pour moi) Existe-t-il un moyen pour que le lecteur gratuit mette à jour le fichier Excel ? Merci
Le message retourné par la console avec Adobe Reader est :
NotAllowedError: Les paramètres de protection interdisent l’accès à cette propriété ou à cette méthode.
Doc.setDataObjectContents:27:Field addAbook.4:Mouse UpDonc pas possible…
@+
😎15 novembre 2023 à 14:23 en réponse à : Champs adresses remplis après sélection nom dans liste #73510bebarth
Maître des clésbonjour,
Si je comprends bien, tu veux alimenter le fichier .csv à partir de données entrées dans le pdf !
Si c’est cela, il y a un post où j’avais répondu :
…et le fichier correspondant en pièce jointe.N’hésite pas à demander pour des informations complémentaires.
@+
😎Attachments:
You must be logged in to view attached files.14 novembre 2023 à 10:34 en réponse à : Champs adresses remplis après sélection nom dans liste #73486bebarth
Maître des clésbonjour,
C’est possible ! Il faut donc appeler chaque fichier csv plutôt par son nom que sa position…...
//
var fichier=this.getDataObjectContents("NPA.csv");
var donnees=util.stringFromStream(fichier).replace(/\r/g,"");
var rangees=donnees.split("\n");
var NPA=new Array();
for (var i=0; i<rangees.length; i++) NPA=rangees.split(";");
// Script champ "npaCabinet" désactivé
if (event.value) {
for (var i=0; i<NPA.length; i++) {
if (event.value==NPA[1]) {
this.getField("villeCabinet").value=NPA[0];
break;
}
this.getField("villeCabinet").value="";
}
} else this.getField("villeCabinet").value="";
// Script champ "villeCabinet" désactivé
if (event.value) {
for (var i=0; i<NPA.length; i++) {
if (event.value.toUpperCase()==NPA[0].toUpperCase()) {
this.getField("npaCabinet").value=NPA[1];
event.target.value=NPA[0];
break;
}
this.getField("npaCabinet").value=""
}
} else this.getField("npaCabinet").value="";
@+
😎-
Cette réponse a été modifiée le il y a 1 année et 4 mois par
bebarth.
13 novembre 2023 à 15:38 en réponse à : Champs adresses remplis après sélection nom dans liste #73458bebarth
Maître des clésTu peux écrire ceci :
// Script champ "npaCabinet" désactivé
for (var i=0; i<colonnes.length; i++) {
if (event.value==colonnes[2]) {
this.getField("villeCabinet").value=colonnes[3];
break;
}
}
// Script champ "villeCabinet" désactivé
for (var i=0; i<colonnes.length; i++) {
if (event.value==colonnes[3]) {
this.getField("npaCabinet").value=colonnes[2];
break;
}
}
@+
Attachments:
You must be logged in to view attached files.13 novembre 2023 à 14:03 en réponse à : Champs adresses remplis après sélection nom dans liste #73456bebarth
Maître des clés??? Je ne comprends pas les questions !
Tu veux un menu déroulant pour “ville” et “NPA” ?@+
13 novembre 2023 à 12:58 en réponse à : Champs adresses remplis après sélection nom dans liste #73452bebarth
Maître des clésbonjour,
Voici les scripts à indiquer :
// Script de document
this.getField("nomCabinet").clearItems();
var p=this.getDataObject(this.dataObjects[0].name);
var fichier=this.getDataObjectContents(p.name);
var donnees=util.stringFromStream(fichier);
var rangees=donnees.split("\n");
var colonnes=new Array();
for (var i=0; i<rangees.length; i++) colonnes=rangees.split(";");
var cellule=new Array();
for (var j=0; j<colonnes.length; j++) cellule[j]=[colonnes[j][0],j];
cellule[0][0]="";
this.getField("nomCabinet").setItems(cellule);
// Script de touches personnalisé du menu déroulant
if (!event.willCommit) {
if (event.changeEx!=0) {
this.getField("adresseCabinet").value=colonnes[event.changeEx][1];
this.getField("npaCabinet").value=colonnes[event.changeEx][2];
this.getField("villeCabinet").value=colonnes[event.changeEx][3];
this.getField("telephoneCabinet").value=colonnes[event.changeEx][4];
this.getField("emailCabinet").value=colonnes[event.changeEx][5];
} else {
this.getField("adresseCabinet").value="";
this.getField("npaCabinet").value="";
this.getField("villeCabinet").value="";
this.getField("telephoneCabinet").value="";
this.getField("emailCabinet").value="";
}
}
…et si tu as des caractères accentués, il faut absolument enregistrer ton fichier .csv en UTF-8.
@+
-
Cette réponse a été modifiée le il y a 1 année et 4 mois par
bebarth.
Attachments:
You must be logged in to view attached files.bebarth
Maître des clésCadeau !
Affichage dans différents formats :
if (this.getField("NB.1").value) {
function decomposition(nombre) {
nbPremiers=[];
while (nombre%2==0) {
nbPremiers.push(2);
nombre=nombre/2;
}
for (var i=3; i<=Math.sqrt(nombre); i=i+2) {
while (nombre%i==0) {
nbPremiers.push(i);
nombre=nombre/i;
}
}
if (nombre>2) nbPremiers.push(nombre);
return nbPremiers;
}
this.getField("Resultat").value=decomposition(this.getField("NB.1").value).toString().replace(/[,]/g," x ");
//
var nbEtExposant=[[nbPremiers[0],1]];
for (var i=1; i<nbPremiers.length; i++) {
if (nbEtExposant[nbEtExposant.length-1][0]==nbPremiers) nbEtExposant[nbEtExposant.length-1][1]++;
else nbEtExposant.push([nbPremiers,1])
}
for (var i=0; i<nbEtExposant.length; i++) {
if (nbEtExposant[1]==1) nbEtExposant=nbEtExposant.toString().replace(/,1$/,"");
else nbEtExposant=nbEtExposant.toString().replace(/,/,"^");
}
this.getField("Resultat1").value=nbEtExposant.toString().replace(/[,]/g," x ");
//
var f=this.getField("Resultat2");
f.textSize=16;
spans=new Array();
var j=0;
for (var i=0; i<nbEtExposant.length; i++) {
var XX=nbEtExposant.split("^");
spans=new Object();
spans.text=XX[0];
j++;
if (XX.length>1) {
spans=new Object();
spans.text=XX[1];
spans.superscript=true;
j++;
}
if (i<nbEtExposant.length-1) {
spans=new Object();
spans.text=" x ";
spans.textSize=f.textSize-4;
j++;
}
}
f.richValue=spans;
} else {
this.getField("Resultat").value="";
this.getField("Resultat1").value="";
this.getField("Resultat2").value="";
}
@+
Attachments:
You must be logged in to view attached files.11 novembre 2023 à 14:17 en réponse à : Champs adresses remplis après sélection nom dans liste #73441bebarth
Maître des clésbonjour,
Pouvez-vous m’expliquer comment le mettre en place dans le formulaire (Est-ce dans action du champ liste ?)
Le code est placé en “Script de touches personnalisé” du menu déroulant (cf. copie d’écran).
Est-ce que le fichier Excel peut-être masqué ou invisible pour les utilisateur ?
Le fichier Excel peut-être masqué si on cache les volets de navigation… On peut peut-être essayer qu’il ne soit pas possible à afficher !
Est-ce que le système marchera avec le lecteur pdf ou uniquement la version pro ?
Ça fonctionnera sur ordinateur PC/Mac avec Acrobat Reader ou Pro (ou autres lecteurs pdf) mais pas avec les téléphones et tablettes dont les readers sont allergiques au JavaScript.
Si tu veux plus d’aide, merci de partager un fichier (en messagerie privée si tu le souhaites).
@+
Attachments:
You must be logged in to view attached files.10 novembre 2023 à 20:52 en réponse à : Champs adresses remplis après sélection nom dans liste #73438bebarth
Maître des clésDu coup, voici un script pour un autre post que j’avais écris il y a quelques années (déjà) !
// Script de document
var id=this.getField(“ID”).value;
var studentName=this.getField(“Name”).value;
var parentName=this.getField(“Parent_Name”).value;
var address=this.getField(“Address”).value;
var phoneNumber=this.getField(“Phone_Number”).value;
var email=this.getField(“E-mail”).value;
// Initialisation liste déroulante
this.getField(“ID”).clearItems();
// Importer l’unique PJ sans la nommer
var p=this.getDataObject(this.dataObjects[0].name);
var fichier=this.getDataObjectContents(p.name);
var donnees=util.stringFromStream(fichier);
// Séparation des rangées (saut de ligne)
var rangees=donnees.split(“\n”);
// Séparation des colonnes (TAB)
var colonnes=new Array();
for (var i=0; i<rangees.length; i++) colonnes=rangees.split(“;”);
var cellule=new Array();
for (var j=0; j<colonnes.length; j++) cellule[j]=[colonnes[j][0], j];
// Remplissage de la liste déroulante
this.getField(“ID”).setItems(cellule); // champ liste déroulante
// Re-remplissage des champs
this.getField(“ID”).value=id;
this.getField(“Name”).value=studentName;
this.getField(“Parent_Name”).value=parentName;
this.getField(“Address”).value=address;
this.getField(“Phone_Number”).value=phoneNumber;
this.getField(“E-mail”).value=email;// Script de touches personnalisé du menu déroulant
if (!event.willCommit) {
try {
var studentName=colonnes[event.changeEx][1];
} catch(e) {
var studentName=””;
}
try {
var parentName=colonnes[event.changeEx][2];
} catch(e) {
var parentName=””;
}
try {
var address=colonnes[event.changeEx][3];
} catch(e) {
var address=””;
}
try {
var phoneNumber=colonnes[event.changeEx][4];
} catch(e) {
var phoneNumber=””;
}
try {
var email=colonnes[event.changeEx][5];
} catch(e) {
var email=””;
}
this.getField(“Name”).value=studentName;
this.getField(“Parent_Name”).value=parentName;
this.getField(“Address”).value=address;
this.getField(“Phone_Number”).value=phoneNumber;
this.getField(“E-mail”).value=email;
}@+
Attachments:
You must be logged in to view attached files.10 novembre 2023 à 18:19 en réponse à : Champs adresses remplis après sélection nom dans liste #73436bebarth
Maître des clésbonjour,…
var excelFilePath = « /chemin/fichier.xlsx »; //
var selectedName = this.getField(« nomMenuDeroulant »).value;
var excelData = app.Excel.importDataObjects(excelFilePath);Ça ce n’est pas possible !
Ton fichier .csv doit être en pièce jointe de ton pdf.@+
bebarth
Maître des clésTu veux que je développe ?
😉
bebarth
Maître des clésbonjour,
J’avais fait ça il y a quelques temps…
Voici le script adapté à ton exemple :
function decomposition(nombre) {
var nbPremiers=[];
while (nombre%2==0) {
nbPremiers.push(2);
nombre=nombre/2;
}
for (var i=3; i<=Math.sqrt(nombre); i=i+2) {
while (nombre%i==0) {
nbPremiers.push(i);
nombre=nombre/i;
}
}
if (nombre>2) nbPremiers.push(nombre);
return nbPremiers;
}
this.getField("Resultat").value=decomposition(this.getField("NB.1").value).toString().replace(/[,]/g," x ");
@+
Attachments:
You must be logged in to view attached files.9 novembre 2023 à 22:41 en réponse à : Champs adresses remplis après sélection nom dans liste #73422bebarth
Maître des clésbonsoir,
Le sujet a déjà été traité plusieurs fois, dont :
et ci-joint le script associé :
// Importation de l'unique pièce jointe sans la nommer
var pj=this.getDataObject(this.dataObjects[0].name);
var fichier=this.getDataObjectContents(pj.name);
var donnees=util.stringFromStream(fichier);
// Suppression du fichier
this.removeDataObject(pj.name);
// Suppression du champ "script"
this.removeField("script");
// Séparation des lignes de la feuille de calcul (saut de ligne)
var lignes=donnees.split("\r\n");
// Séparation des cellules de chaque ligne de la feuille de calcul (TAB)
cellules=new Array();
for (var i=1; i<lignes.length; i++) {
// i est le numéro de la ligne et on commence par la deuxième ligne : i=1
cellules=lignes.split(";");
this.getField("Nom").value=cellules[0]; // Cellule 0 de la ligne i, donc Nom
this.getField("Prenom").value=cellules[1]; // Cellule 1 de la ligne i, donc Prénom
this.getField("Adresse").value=cellules[2]; // etc.
this.getField("Telephone").value=cellules[3];
this.getField("e-mail").value=cellules[4];
var nomFichier="Fichier "+cellules[0]+" "+cellules[1]+".pdf";
if (i!=lignes.length-1) this.saveAs({cPath: nomFichier,bCopy: true});
else this.saveAs({cPath: nomFichier});
}
…et le fichier en pièce jointe.
@+
Attachments:
You must be logged in to view attached files.bebarth
Maître des clés…et si tu veux utiliser une fonction pour indiquer les bornes, tu peux écrire :
function getRandomIntInclusive(min,max) {
return Math.ceil(Math.random()*(max-min+1)+min-1);
}
for (var i=1; i<=100; i++) console.println(i+" : "+getRandomIntInclusive(-20,20));
@+
bebarth
Maître des clésbonjour,
Le ∆ étant de 40 et vu qu’avec “Math.ceil” on arrondi à l’entier supérieur, personnellement j’écrierais simplement :
var Nb2=Math.ceil(Math.random()*41-21);
Si tu lances une boucle dans la console pour 100 nombres aléatoires :
for (var i=1; i<=100; i++) console.println(i+" : "+Math.ceil(Math.random()*41-21));
Tu vois que ça fonctionne.@+
bebarth
Maître des clésbonjour,
En script de calcul du champ Val1 tu écris :
for (var i=1; i<=6; i++) {
this.getField("c"+i).display=display.visible;
if (event.value<3000 && this.getField("c"+i).value=="Off") this.getField("c"+i).display=display.hidden;
}
@+
Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Voici un script :
for (var i=1; i<=27; i++) this.getField("M"+i).value="Off";
@+
bebarth
Maître des clésbonjour,
Il faudrait peut-être déclarer et initialiser les variables avant la boucle while !@+
Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Personnellement je placerais tes lignes dans une boucle while :
while (Nb1*Nb6 == Nb3*Nb4) {
var Nb1=Math.round(Math.random()*7)+2;
var Nb2=Math.round(Math.random()*9)+1;
var Nb3=Math.round(Math.random()*9)+1;
var Nb4=Math.round(Math.random()*8)+1;
var Nb5=Math.round(Math.random()*8)+1;
var Nb6=Math.round(Math.random()*9)+1;
}
@+
bebarth
Maître des clésbonjour,
Tu pourrais combiner les 2 scripts en ajoutant une alerte entre !
Du coup, vu que le dernier fichier sélectionné avec l’interface le reste (du moins sur Mac), l’utilisateur n’a pas à re-naviguer pour le trouver…
Dans l’exemple, j’ai mis le bouton “PJ” invisible car on a besoin de sa position dans le script.@+
Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Non, ce n’est pas possible pour des raisons de sécurité. Avec les pièces jointes on ne peut manipuler via JavaSript que celles importées manuellement. Celles importées par script sont invisibles.@+
bebarth
Maître des clés…et ici, à la place de “if (annots != null…” on peut même juste écrire “if (annots…”.
Donc :
...
if (annots && annots[j].type == "FreeText") {annots[j].destroy();}
@+
bebarth
Maître des clésbonjour,
Tu as l’api reference en ligne où tu pourras trouver tous les types d’annotations :
https://opensource.adobe.com/dc-acrobat-sdk-docs/library/jsapiref/JS_API_AcroJS.html#annotation-types
Mais je pense que lorsqu’on programme régulièrement c’est pas mal de télécharger une version pdf.@+
bebarth
Maître des clésBonjour,
tu peux utiliser l’exemple de l’api référence :
var annots = this.getAnnots({ nPage:0 }); for (var j = 0; j < annots.length; j++) if (annots[j].type == "FreeText") annots[j].destroy();
À la place de « FreeText » tu indiques le type d’annotation que tu veux supprimer.
@+
Attention : J’ai changé la variable i en j à cause du problème d’affichage lorsque i est entre crochets.
Pour exécuter le script sur tout le document il faut écrire : var annots = this.getAnnots();
bebarth
Maître des clésbonsoir,
Ça se fait avec la méthode « destroy » des annotations.
@+
bebarth
Maître des clésbonjour,
C’est un copier/coller du script dans cette fenêtre.@+
bebarth
Maître des clésbonjour,
Voici maintenant le lien d’une vidéo pour créer une action puis l’exécuter sur plusieurs fichiers.
https://we.tl/t-YdvFt48Twx-
Cette réponse a été modifiée le il y a 1 année et 6 mois par
bebarth.
bebarth
Maître des clésÀ ce moment là il faut créer une action.
Je te fait une vidéo demain !
@+
😎bebarth
Maître des clésbonjour,
Voici une petite vidéo pour la façon d’exécuter le script à partir de la console.
https://we.tl/t-47Z3Y2wHXP@+
😎bebarth
Maître des clésbonjour,
Essaye ce script en validation du champ “DATE DE SIGNATURE_1” :
f=this.getField("DATE_DU_JOUR");
g=this.getField("DATE DE SIGNATURE_1");
if (g.value!="") {
var dateDuJour=util.scand("dd/mm/yyyy", f.value).getTime();
var dateSignature=util.scand("dd/mm/yyyy", g.value).getTime();
if (dateSignature<dateDuJour) {
app.alert("Merci de ne pas antidater ce document",3);
event.rc=false;
}
}
@+
😎bebarth
Maître des clésLe fichier verso fermé, tu ouvres une fiche pui la console que tu vides et tu colles le script, puis tout sélectionner et Enter du clavier numérique.
Les 2 fichiers doivent être dans le même répertoire.@+
😎
-
Cette réponse a été modifiée le il y a 1 année et 6 mois par
bebarth.
bebarth
Maître des clésJ’ai retiré le lien de ton précédent message mais je n’ai pas pu retiré les fichiers !
@Merlin : Il faut une autorisation spéciale que je n’ai pas ?@+
😎bebarth
Maître des clésPour faire simple, tu n’ouvres pas le fichier VersoPage.pdf mais uniquement l’autre.
Si tu veux ajouter les 2 pages il faut modifier un peu le script et indiquer nEnd au lieu de nStart pour insertPage que ce soit avec la console ou avec une action :
var Chemin=this.path;
var nomDocument=this.documentFileName;
var repertoire=Chemin.substring(0,Chemin.length-nomDocument.length);
this.insertPages ({
nPage: this.numPages-1,
cPath: repertoire+"VersoPage.pdf",
nEnd: 1
});
this.saveAs({
cPath: Chemin,
bPromptToOverwrite: false,
});
Attention au droit à l’image refusé ! Il vaudrait mieux retirer le fichier.
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Tu utilises le script avec le fichier VersoPage.pdf qui est le fichier dont tu ajoutes la page…
Es-tu certain que ça ne fonctionne pas, car ce fichier à maintenant 4 pages au lieu d’une initialement !@+
😎Attachments:
You must be logged in to view attached files.30 septembre 2023 à 11:17 en réponse à : Action automatisée pour ajouter une page à une autre #73312bebarth
Maître des clésIl faut activer la console JavaScript, puis ctrl J pour l’afficher.
Dans la console vide tu colles le script, puis sélectionne tout (ctrl A) et ENTER du clavier numérique (et pas la touche Return).
Le script s’exécute…@+
😎Attachments:
You must be logged in to view attached files.30 septembre 2023 à 10:28 en réponse à : Action automatisée pour ajouter une page à une autre #73309bebarth
Maître des clésbonjour,
On peut lancer le script soit par une action ou directement depuis la console.@+
😎bebarth
Maître des clésbebarth
Maître des clésbonjour,
En script de calcul du champ Mht01 :
this.getField("Mht02").value="";
if (this.getField("QLigne01").value!=0) {
event.value=this.getField("QLigne01").value*950;
if (this.getField("CC.0").value!="Off") this.getField("Mht02").value=event.value*1.1;
}
else event.value="";
J’ai modifié les formats des 2 champs pour qu’ils soient identiques.
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Tu crée une fonction “verif()” en script de document :
function verif() {
var nbCases=0;
for (var i=0; i<21; i++) {
if (this.getField("CC1."+i).value!="Off") nbCases++;
if (nbCases>3) {
this.getField("CC1."+i).value="Off";
app.alert("Vous ne pouvez pas cocher plus de 3 cases.",3);
break;
}
}
}
Et pour chaque case à cocher une action qui appelle cette fonction en souris relâchée :
verif();
Pour écrire ce script pour toutes les cases à cocher, tu lances celui-ci à partir de la console :
for (var i=0; i<21; i++) {
this.getField("CC1."+i).setAction("MouseUp", "verif();");
}
@+
😎Attachments:
You must be logged in to view attached files.29 septembre 2023 à 18:18 en réponse à : Action automatisée pour ajouter une page à une autre #73295bebarth
Maître des clésbonjour,
Pour ajouter la page du fichier “VersoPage.pdf” après la dernière page, il faut écrire :
var Chemin=this.path;
var nomDocument=this.documentFileName;
var repertoire=Chemin.substring(0,Chemin.length-nomDocument.length);
this.insertPages ({
nPage: this.numPages-1,
cPath: repertoire+"VersoPage.pdf",
nStart: 0
});
this.saveAs({
cPath: Chemin,
bPromptToOverwrite: false,
});
@+
😎bebarth
Maître des clés…et si tu as besoin pour vérifier que les champs nécessaires sont bien remplis dans la boite de dialogue, n’hésite pas !
@+
😎bebarth
Maître des clésbonjour,
J’ai passé pas mal de temps à étudier les tampons et boites de dialogue, donc si je peux me permettre, voici un script un peu “simplifié”.
S’il n’y a rien à initialiser ou rien à vérifier, pas besoin des fonctions “initialize” et “validate” dans le script.
Par contre, si on veut qu’il y ait au moins une case cochée et tous les champs textes remplis, ce serait peut-être bon de les vérifier…
Et si on met les valeurs de la boite de dialogue en variables, autant s’en servir lorsqu’on les rappelle pour remplir les champs !///////////////////////////////////
// Acrobat JavaScript Dialog
//////////////////////////////////
var oJSDlg={
DoDialog: function(){return app.execDialog(this);},
commit: function (oJSDlg) {
var oRslt=oJSDlg.store();
// Lorsqu'on a plusieurs lignes semblables on peut simplifier
for (var i=1; i<=4; i++) eval("bChk"+i+"=oRslt[\"Chk"+i+"\"];");
for (var i=1; i<=3; i++) eval("text"+i+"=oRslt[\"Txt"+i+"\"];");
},
description: {
name: "Conformité",
elements: [{
type: "view",
width: 362,
height: 200,
elements: [
{
type: "check_box",
item_id: "Chk1",
name: "Vu",
},
{
type: "check_box",
item_id: "Chk2",
name: "Vu avec annotation(s)",
},
{
type: "check_box",
item_id: "Chk3",
name: "Corriger tel qu’annoté",
},
{
type: "check_box",
item_id: "Chk4",
name: "Refusé",
},
{
type: "edit_text",
item_id: "Txt1",
width: 300,
height: 20,
name: "Text Field 1",
},
{
type: "static_text",
name: "Description for Text Field 1",
},
{
type: "edit_text",
item_id: "Txt2",
width: 300,
height: 20,
name: "Text Field 2",
},
{
type: "static_text",
name: "Description for Text Field 2",
},
{
type: "edit_text",
item_id: "Txt3",
width: 300,
height: 20,
name: "Text Field 3",
},
{
type: "static_text",
name: "Description for Text Field 3",
},
{
type: "ok",
},
],
}],
},
};
if (event.source.forReal && event.source.stampName=="#VBC") {
if ("ok"==oJSDlg.DoDialog()) {
// On pourrait également simplifier
this.getField("Chk1").checkThisBox(0,bChk1);
this.getField("Chk2").checkThisBox(0,bChk2);
this.getField("Chk3").checkThisBox(0,bChk3);
this.getField("Chk4").checkThisBox(0,bChk4);
this.getField("Text1").value=text1;
this.getField("Text2").value=text1;
this.getField("Text3").value=text1;
}
}
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésOups, je n’avais pas la réponse Thom Parker lorsque j’ai répondu. Désolé !
@+
😎bebarth
Maître des clésbonjour,
je n’ai que mon téléphone avec moi et je ne peux donc pas essayer, mais les noms des « ID » ne doivent contenir que 4 caractères !
A essayer donc…
@+
😎bebarth
Maître des clésbonjour,
Tu peux stocker des variables dans des champs invisibles que tu mets en page 1 ou les enregistrer en script de document.@+
😎bebarth
Maître des clésbonjour,
Sauf erreur, ça fonctionne dans ce fichier joint !@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésAvant de rendre un calque visible, ils faut les rendre tous non visibles, sinon si on choisi un calque sur un plan avant ça fonctionne mais si il est sur un plan arrière ça ne fonctionne pas.
Il faudrait donc écrire pour rester dans son style :
if(event.willCommit) {
this.getOCGs().some(function(a){return a.state = false};);
this.getOCGs().some(function(a){return a.state = (a.name==event.value);});
}
@+
😎bebarth
Maître des clésbonjour,
Voici mon script à moi ! 😉
if (!event.willCommit) {
var lesCalques=this.getOCGs();
for (var ii=0; ii<lesCalques.length; ii++) lesCalques[ii].state=false;
for (var ii=0; ii<lesCalques.length; ii++) {
if (lesCalques[ii].name==event.changeEx) {
lesCalques[ii].state=true;
break;
}
}
}
@+
😎PS : Indice ii au lieu de i à cause d’un problème d’affichage losque i est entre crochets…
-
Cette réponse a été modifiée le il y a 1 année et 6 mois par
bebarth.
Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Tu peux utiliser l’indice du préfixe de la page dupliquée !@+
😎bebarth
Maître des clésIl suffit d’une petite modification pour l’affichage du nom dans le popup:
var aParams=[];
for (var d=0; d<this.dataObjects.length; d++) aParams.push({cName: this.dataObjects[d].name.substr(0,this.dataObjects[d].name.lastIndexOf(".")), cReturn: d.toString()});
var cChoice=app.popUpMenuEx.apply(app, aParams);
if (cChoice!=null) this.exportDataObject({cName: this.dataObjects[cChoice].name, nLaunch:2});
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
En script d’action souris entrée :
var aParams=[];
for (var d=0; d<this.dataObjects.length; d++) aParams.push({cName: this.dataObjects[d].name, cReturn: d.toString()});
var cChoice=app.popUpMenuEx.apply(app, aParams);
if (cChoice!=null) this.exportDataObject({cName: this.dataObjects[cChoice].name, nLaunch:2});
@
😎-
Cette réponse a été modifiée le il y a 1 année et 7 mois par
bebarth.
Attachments:
You must be logged in to view attached files.bebarth
Maître des clésOups ! Je n’avais pas vu le dernier post… Je regarde demain !
@+
😎bebarth
Maître des clésbonjour,
En script d’action souris entrée :
var aParams=[
{cName: "OUVRE PDF2", cReturn: "1"},
{cName: "OUVRE html2", cReturn: "2"},
];
var cChoice=app.popUpMenuEx.apply(app, aParams);
if (cChoice!=null) {
switch (cChoice) {
case "1":
this.exportDataObject({cName: "PDF2.pdf", nLaunch:2});
break;
case "2":
this.exportDataObject({cName: "html2.html", nLaunch:2});
}
}
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Avec ton script :
...
this.insertPages ({
nPage: 0,
cPath: repertoire+"Verso.pdf",
nStart: 0
});
...
Tu insères la première page du fichier “Verso.pdf” après la première page de ton fichier.
Ça n’a de sens que si ton fichier n’est pas le fichier “Verso.pdf” !@+
😎 -
Cette réponse a été modifiée le il y a 1 année et 3 mois par
-
AuteurRéponses