Toutes mes réponses sur les forums
-
AuteurRéponses
-
bebarth
Maître des clésSi je trouve, je te dirai pourquoi ça ne fonctionne pas en fonction, mais pour l’instant je ne sais pas !!!
@+
😎bebarth
Maître des clés…comme ça je ne comprends pas pourquoi cela ne fonctionne pas !
Dans un premier temps tu peux mettre ce script sur tous tes boutons “AjouT”.var ind=event.target.name.substring(event.target.name.indexOf(".")+1);
var nomBoutons=[];
for (var k=0; k<10; k++) nomBoutons.push(this.getField("LinkT."+ind+"."+k).buttonGetCaption());
for (var k=0; k<10; k++) {
if (this.getField("LinkT."+ind+"."+k).buttonGetCaption()=="...") break;
}
if (k==10) app.alert("Tous les boutons renvoient à une URL.",3);
lesElements=[0,1,2,3,4,5,6,7,8,9];
var laListe="- Indices -";
var listeElements="var listeElements \= \{\""+laListe+"\": "+(lesElements.length+1)+",";
for (var i=0; i<lesElements.length; i++) {
if (i!=k) var par=-1;
else var par=1;
listeElements+="\""+lesElements+"\": "+(par*(i+1)).toString()+",";
}
var listeElements=listeElements.substring(0, listeElements.length-1);
listeElements+="\}";
eval(listeElements);
//
var bDialogue={
initialize: function(bDialogue) {
this.cbInit=true;
bDialogue.enable({url0: true});
this.loadDefaults(bDialogue);
},
loadDefaults: function(bDialogue) {
bDialogue.load({
cb00: false,
rd00: true,
url0: "http://www.",
menu: listeElements,
});
},
cb00: function(bDialogue) {
this.cbInit=!this.cbInit;
bDialogue.enable({init: this.cbInit});
},
quelBtRd: function (oRslt) {
for (var i=0; i<=1; i++) {
if (oRslt["rd0"+i]) {
switch (i) {
case 0:
resBtRd="Non";
break;
case 1:
resBtRd="Oui";
}
}
};
return resBtRd;
},
validate: function(bDialogue) {
var oRslt=bDialogue.store();
var elements=bDialogue.store()["menu"];
for (var i in elements) {
if (elements>0) indice=i;
}
if (indice=="- Indices -") {
app.alert("Veuillez sélectionner l'indice d'un champ;.",3);
return false;
} else {
initialiser=oRslt["cb00"];
if (initialiser) {
texteBouton="...";
texteURL="";
return true;
} else {
texteBouton=oRslt["nmbt"];
var testOK0=true;
if (!/^(\w|\W)+( (\w|\W)+)*$/.test(texteBouton)) var testOK0=false;
var testOK1=true;
texteURL=oRslt["url0"];
if (!/^(https?:\/\/)?([\w-]+(\.[\w-]+)+)(:\d+)?(\/[^\s]*)?$/i.test(texteURL)) var testOK1=false;
cAc=this.quelBtRd(oRslt);
if (nomBoutons[indice]!="...") {
if (cAc=="Non") {
app.alert("Le bouton \"LinkT."+ind+"."+indice+"\" est déjà renseigné.",3);
return false;
} else {
var reponse=app.alert("Le bouton \"LinkT."+ind+"."+indice+"\" est déjà renseigné.\rSouhaitez-vous réellement le modifier ?",3,2);
if (reponse==3) return false;
}
}
if (!testOK0) app.alert("Veuillez indiquer un nom pour le bouton.",3);
else if (!testOK1) app.alert("Veuillez renseigner une URL correcte.",3);
var testOK=testOK0 && testOK1;
return testOK;
}
}
},
description: {
name: "Bouton vers URL",
first_tab: "cb00",
elements: [
{
type: "cluster", //
elements: [
{
type: "static_text",
name: "Indice du bouton",
font: "dialog",
bold: true,
},
{
type: "popup",
item_id: "menu",
alignment: "align_fill",
//width: 150,
},
{
type: "check_box",
alignment: "align_center",
item_id: "cb00",
name: " Réinitialiser le bouton",
},
{
type: "gap",
height: 5
},
{
type: "cluster",
item_id: "init",
elements: [
{
type: "static_text",
name: "Texte pour le bouton",
font: "dialog",
bold: true,
},
{
type: "edit_text",
item_id: "nmbt",
alignment: "align_fill",
},
{
type: "gap",
height: 5
},
{
type: "static_text",
name: "URL à atteindre",
font: "dialog",
bold: true,
},
{
type: "edit_text",
item_id: "url0",
alignment: "align_fill",
},
{
type: "gap",
height: 5
},
{
type: "static_text",
name: "Modifier le bouton si renseigné ?",
font: "dialog",
bold: true,
},
{
type: "view",
alignment: "align_center",
align_children: "align_row",
elements: [
{
type: "radio",
group_id: "gr00",
item_id: "rd00",
name: " Non",
},
{
type: "radio",
group_id: "gr00",
item_id: "rd01",
name: " Oui",
},
]
},
]
},
{
type: "gap",
height: 5
},
{
type: "ok_cancel",
},
]
},
]
}
};
if("ok"==app.execDialog(bDialogue)){
if (initialiser) {
this.getField("LinkT."+ind+"."+indice).setAction("MouseUp","//");
this.getField("LinkT."+ind+"."+indice).buttonSetCaption("...");
this.getField("LinkT."+ind+"."+indice).fillColor=color.ltGray;
} else {
this.getField("LinkT."+ind+"."+indice).setAction("MouseUp","app.launchURL(\""+texteURL+"\");");
this.getField("LinkT."+ind+"."+indice).buttonSetCaption(texteBouton);
this.getField("LinkT."+ind+"."+indice).fillColor=color.green;
}
}
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésJ’ai fait une version qui fonctionne apparemment avec PDF Expert !
A vérifier quand même…Il y avait une erreur que j’ai modifié (dans les 2 fichiers);
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésPDF Expert gère nativement les boites de dialogue (AcroDialog).
Je n’avais pas vérifié avec PDF Expert et effectivement :
- Il ne trouve pas le premier indice disponible
- Il ne comprend pas “insertSeparatorEntryInList”
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésVoici ton fichier corrigé.
Normalement ça fonctionne !!!@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
c’est plus complexe que je ne le pensais
C’est pas le plus simple dans le Javascript Acrobat… Il y a quelques exemples dans l’API Reference (https://opensource.adobe.com/dc-acrobat-sdk-docs/library/jsapiref/JS_API_AcroJS.html#execdialog) ou sur ce fichier de Thom Parker (page : https://www.pdfscripting.com/public/ACRODIALOGS-OVERVIEW.cfm, fichier : http://www.windjack.com/resources/Examples/DialogUses.pdf).
Si cela t’intéresse de créer des boites de dialogue je peu de donner quelques exemples simples.Voilà ce que j’ai fait. Je pense l’avoir testé, mais dis-moi s’il y a des erreurs.
J’en ai profité pour faire un peu de pub à ma fille !!!Voici le script :
var nomBoutons=[];
for (var k=0; k<10; k++) nomBoutons.push(this.getField("LinkT.1."+k).buttonGetCaption());
for (var k=0; k<10; k++) {
if (this.getField("LinkT.1."+k).buttonGetCaption()=="...") break;
}
if (k==10) app.alert("Tous les boutons renvoient à une URL.",3);
//
var bDialogue={
initialize: function(bDialogue) {
this.cbInit=true;
bDialogue.enable({url0: true});
this.loadDefaults(bDialogue);
},
loadDefaults: function(bDialogue) {
bDialogue.load({
cb00: false,
rd00: true,
url0: "http://www.",
});
bDialogue.insertEntryInList({"menu":{"- Indices -": 0}});
bDialogue.insertSeparatorEntryInList("menu");
for (var i=0; i<10; i++) {
if (i!=k) var par=-1;
else var par=1;
eval("bDialogue.insertEntryInList({\"menu\":{\""+i+"\": "+(par*(i+1))+"}});");
}
},
cb00: function(bDialogue) {
this.cbInit=!this.cbInit;
bDialogue.enable({init: this.cbInit});
},
quelBtRd: function (oRslt) {
for (var i=0; i<=1; i++) {
if (oRslt["rd0"+i]) {
switch (i) {
case 0:
resBtRd="Non";
break;
case 1:
resBtRd="Oui";
}
}
};
return resBtRd;
},
validate: function(bDialogue) {
var oRslt=bDialogue.store();
var elements=bDialogue.store()["menu"];
for (var i in elements) {
if (elements>0) indice=i;
}
if (indice=="- Indices -") {
app.alert("Veuillez sélectionner l'indice d'un champ;.",3);
return false;
} else {
initialiser=oRslt["cb00"];
if (initialiser) {
texteBouton="...";
texteURL="";
return true;
} else {
texteBouton=oRslt["nmbt"];
var testOK0=true;
if (!/^(\w|\W)+( (\w|\W)+)*$/.test(texteBouton)) var testOK0=false;
if (!testOK0) app.alert("Veuillez indiquer un nom pour le bouton.",3);
var testOK1=true;
texteURL=oRslt["url0"];
if (!/^(https?:\/\/)?([\w-]+(\.[\w-]+)+)(:\d+)?(\/[^\s]*)?$/i.test(texteURL)) var testOK1=false;
if (!testOK1) app.alert("Veuillez renseigner une URL correcte.",3);
cAc=this.quelBtRd(oRslt);
if (nomBoutons[indice]!="...") {
if (cAc=="Non") {
app.alert("Le bouton d'indice \""+indice+"\" est déjà renseigné.",3);
return false;
} else {
var reponse=app.alert("Le bouton d'indice \""+indice+"\" est déjà renseigné.\rSouhaitez-vous réellement le modifier ?",3,2);
if (reponse==3) return false;
}
}
var testOK=testOK0 && testOK1;
return testOK;
}
}
},
description: {
name: "Bouton vers URL",
first_tab: "cb00",
elements: [
{
type: "cluster", //
elements: [
{
type: "static_text",
name: "Indice du bouton",
font: "dialog",
bold: true,
},
{
type: "popup",
item_id: "menu",
alignment: "align_fill",
//width: 150,
},
{
type: "check_box",
alignment: "align_center",
item_id: "cb00",
name: " Réinitialiser le bouton",
},
{
type: "gap",
height: 5
},
{
type: "cluster",
item_id: "init",
elements: [
{
type: "static_text",
name: "Texte pour le bouton",
font: "dialog",
bold: true,
},
{
type: "edit_text",
item_id: "nmbt",
alignment: "align_fill",
},
{
type: "gap",
height: 5
},
{
type: "static_text",
name: "URL à atteindre",
font: "dialog",
bold: true,
},
{
type: "edit_text",
item_id: "url0",
alignment: "align_fill",
},
{
type: "gap",
height: 5
},
{
type: "static_text",
name: "Modifier le bouton si renseigné ?",
font: "dialog",
bold: true,
},
{
type: "view",
alignment: "align_center",
align_children: "align_row",
elements: [
{
type: "radio",
group_id: "gr00",
item_id: "rd00",
name: " Non",
},
{
type: "radio",
group_id: "gr00",
item_id: "rd01",
name: " Oui",
},
]
},
]
},
{
type: "gap",
height: 5
},
{
type: "ok_cancel",
},
]
},
]
}
};
if("ok"==app.execDialog(bDialogue)){
if (initialiser) {
this.getField("LinkT.1."+indice).setAction("MouseUp","//");
this.getField("LinkT.1."+indice).buttonSetCaption("...");
this.getField("LinkT.1."+indice).fillColor=color.ltGray;
} else {
this.getField("LinkT.1."+indice).setAction("MouseUp","app.launchURL(\""+texteURL+"\");");
this.getField("LinkT.1."+indice).buttonSetCaption(texteBouton);
this.getField("LinkT.1."+indice).fillColor=color.green;
}
}
…et le fichier où j’ai rajouté une ligne pour en avoir 10 (de 0 à 9).
@+
😎-
Cette réponse a été modifiée le il y a 3 jours et 2 heures par
bebarth.
Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Je regarde rapidement…@+
😎bebarth
Maître des clésbonjour,
D’ici là je vais chercher pour voir si j’y arrive.
As-tu réussi à faire quelque chose ?
Je m’y attelle dès ce soir. “Normalement” ça ne devrait pas être trop long. la boite de dialogue n’est pas très compliquée, mais lorsqu’on n’en fait pas depuis un certain temps il faut se remettre dans le bain.
Je te tiens au courant…@+
😎bebarth
Maître des clésbonjour,
L’expression régulière vérifie les chaines de caractères strictement !
UNEF 1.11/16 – – 32 – Pas 1.720 n’est donc pas la même chose que UNEF 1 11/16 – 32 – Pas 1.720 (sans point et avec un simple tiret). La première chaine testée est donc fausse alors que la seconde est vraie.@+
😎bebarth
Maître des clésil y a 2 valeurs que je ne sais pas entrer ( 1.11/16-18 Pas 1,720 Perage 44,45 — 2″-18 Pas 1,971 Perçage 50.8)
C’est compliqué de modifier toujours l’énoncé du problème. Il faut réadapter à chaque fois l’expression régulière… Maintenant elle en est à :
var filetageRegEx=/^UNE?(C|F)[ ]*(\d{0,2}["]?[ ]*(\d+[/]\d+)?)[ ]*-[ ]*(\d{1,2})[ ]*-[ ]*\w*[ ]*(\d{1,2}[.,]\d{1,3})$/;
Tu devrais maintenant pouvoir entrer tes nouvelles valeurs.
@+
😎-
Cette réponse a été modifiée le il y a 1 semaine par
bebarth.
Attachments:
You must be logged in to view attached files.bebarth
Maître des clésEt sur une page que j’ai recréé “UNEF”
Il ne faut pas écrire :
var filetageRegEx=/^UN(C|EF)[ ]*(\d?["]?[ ]*(\d[/]\d+)?)[ ]*-[ ]*(\d{1,2})[ ]*-[ ]*\w*[ ]*(\d{1,2}[.,]\d{1,3})$/;
mais
var filetageRegEx=/^UNE?(C|F)[ ]*(\d?["]?[ ]*(\d[/]\d+)?)[ ]*-[ ]*(\d{1,2})[ ]*-[ ]*\w*[ ]*(\d{1,2}[.,]\d{1,3})$/;
@+
😎bebarth
Maître des clésbonjour,
la page PG Beug, pourquoi aucune idée §
Tout le monde aura remarqué (lol) qu’avec cette expression régulière :
var filetageRegEx=/^(W|(BSF)|(PG)|(NPT))[ ]*(\d?["]?[ ]*(\d[/]\d+)?)[ ]*-[ ]*\w*[ ]*(\d{1,2}[.,]\d{1,3})$/;
il n’est possible d’indiquer qu’un seul chiffre pour le diamètre. pour qu’il soit possible d’en indiquer 2, il faut écrire :
var filetageRegEx=/^(W|(BSF)|(PG)|(NPT))[ ]*(\d{1,2}["]?[ ]*(\d[/]\d+)?)[ ]*-[ ]*\w*[ ]*(\d{1,2}[.,]\d{1,3})$/;
et comme je viens de m’apercevoir de la possibilité d’une décimale, l’expression régulière devient :
var filetageRegEx=/^(W|(BSF)|(PG)|(NPT))[ ]*(\d{1,2}[.]?\d?["]?[ ]*(\d[/]\d+)?)[ ]*-[ ]*\w*[ ]*(\d{1,2}[.,]\d{1,3})$/;
Dans mon fichier de retour j’ai mis en fonction une parie du script ce qui permet de ne l’écrire qu’une seule fois dans le fichier et juste d’appeler cette fonction avec le menu déroulant.
// Script de document
function filetages() {
for (var i=0; i<event.target.numItems; i++) {
if (event.changeEx==event.target.getItemAt(i,true)) break;
}
var lesValeurs=event.target.getItemAt(i,false);
//
var vis="";
var pas="";
var filetageRegEx=/^M[ ]*(\d{1,2})[ ]*-[ ]*\w*[ ]*(\d{1,2}[.,]\d{1,3})$/;
if (filetageRegEx.test(lesValeurs)) {
var visPas=lesValeurs.replace(filetageRegEx,"$1-$2".replace(/,/g,"."));
var vis=visPas.split("-")[0];
var pas=visPas.split("-")[1];
} else {
var filetageRegEx=/^(W|(BSF)|(PG)|(NPT))[ ]*(\d{1,2}[.]?\d?["]?[ ]*(\d[/]\d+)?)[ ]*-[ ]*\w*[ ]*(\d{1,2}[.,]\d{1,3})$/;
if (filetageRegEx.test(lesValeurs)) {
var visPas=lesValeurs.replace("\""," ").replace(/[ ]+/g," ").replace(filetageRegEx,"$5-$7".replace(/,/g,"."));
var laVis=visPas.split("-")[0].split(/[ ]/);
if (laVis.length==1) {
var vis=(Number(laVis[0].split("/")[0])/Number(laVis[0].split("/")[1]))*25.4;
} else {
if (laVis[1]) var vis=(Number(laVis[0])+(Number(laVis[1].split("/")[0])/Number(laVis[1].split("/")[1])))*25.4;
else var vis=Number(laVis[0])*25.4;
}
var pas=visPas.split("-")[1];
} else {
var filetageRegEx=/^UN(C|F)[ ]*(\d{1,2}["]?[ ]*(\d[/]\d+)?)[ ]*-[ ]*(\d{1,2})[ ]*-[ ]*\w*[ ]*(\d{1,2}[.,]\d{1,3})$/;
if (filetageRegEx.test(lesValeurs)) {
var visPas=lesValeurs.replace("\""," ").replace(/[ ]+/g," ").replace(filetageRegEx,"$2-$4-$5".replace(/,/g,"."));
var laVis=visPas.split("-")[0].split(/[ ]/);
if (Number(visPas.split("-")[1])>=28 && /[^"]/.test(lesValeurs) && Number(visPas.split("-")[0])<=12) {
var UN=[1.524,1.854,2.184,2.515,2.845,3.175,3.505,"-",4.166,"-",4.826,"-",5,486];
var vis=UN[Number(visPas.split("-")[0])];
} else if (laVis.length==1) {
var vis=(Number(laVis[0].split("/")[0])/Number(laVis[0].split("/")[1]))*25.4;
} else {
var vis=(Number(laVis[0])+(Number(laVis[1].split("/")[0])/Number(laVis[1].split("/")[1])))*25.4;
}
var pas=visPas.split("-")[2];
} else {
var filetageRegEx=/^G[ ]*(\d{1,2}["]?[ ]*(\d[/]\d+)?)[ ]*-[ ]*\w*[ ]*(\d{1,2}[.,]\d{1,3})$/;
if (filetageRegEx.test(lesValeurs)) {
var visPas=lesValeurs.replace("\""," ").replace(/[ ]+/g," ").replace(filetageRegEx,"$1-$3".replace(/,/g,"."));
var laVis=visPas.split("-")[0].split(/[ ]/);
var filetageGaz=[["1/16",7.723],["1/8",9.728],["1/4",13.157],["3/8",16.662],["1/2",20.955],["5/8",22.911],["3/4",26.441],["7/8",30.201],["1",33.249],["1 1/8",37.897],["1 1/4",41.91],["1 1/2",47.803],["1 3/4",53.746],["2",59.614],["2 1/4",65.71],["2 1/2",75.184],["2 3/4",81.534],["3",87.884],["3 1/2",100.33],["4",125.73],["4 1/2",125.73],["5",138.43],["5 1/2",151.13],["6",163,83]];
if (laVis.length>1 && laVis[1]) var filetage=laVis[0]+" "+laVis[1];
else var filetage=laVis[0];
for (var j=0; j<filetageGaz.length; j++) {
if (filetageGaz[j][0]==filetage) {
var vis=filetageGaz[j][1];
break;
}
}
if (j==filetageGaz.length) app.alert("Filetage incorrect",3);
else var pas=visPas.split("-")[1];
} else app.alert("Filetage incorrect",3);
}
}
}
return [vis, pas]
}
// Script de touches personnalisé
if (!event.willCommit) {
var visETpas=filetages();
try {
/*
console.println("vis : "+vis);
console.println("pas : "+pas);
this.getField("Text5").value=vis;
this.getField("Text6").value=pas;
*/
this.getField("FiltagePGR").value=visETpas[0];
this.getField("PasPGconv").value=visETpas[1];
} catch(e) {
app.alert("Filetage incorrect",3);
}
}
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Je n’arrive pas à savoir comment faire pour avoir tout ceci dans la même boite de dialogue…
C’est un petit boulot, mais si tu n’es pas trop pressé je te fais ça en fin de semaine…
@+
😎bebarth
Maître des clésJ’ai voulu modifier le script car j’ai vu ou etait les diametres, je les mis mais le script sonne, je ne vois pas l’erreur
Je regarderai lundi car ce ne sera pas possible ce weekend !
Quelles sont les lignes modifiées ? Ça m’évitera de chercher trop longtemps…
@+
😎-
Cette réponse a été modifiée le il y a 1 semaine et 3 jours par
bebarth.
bebarth
Maître des clésCette ligne correspond a quoi ? : var UN=[1.524,1.854,2.184,2.515,2.845,3.175,3.505,”-“,4.166,”-“,4.826,”-“,5,486];
Cette ligne est une table de correspondance des petites vis UNC/UNF dont le numéro de 0 à 12 n’indique pas le diamètre.
Attention, le dernier élément de la table doit être 5.486 (avec un point).
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésEt juste pour savoir, c’est normal que l’exportation de valeurs perçage ne se fait plus ?
Il faut cocher la case du menu déroulant “Valider la valeur sélectionnée immédiatement”.
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Voici ma proposition qui devrait correspondre à ce que tu demandes :
var i=event.target.name.substr(6);
var j=this.getField("NoLieT."+i).value;
if (this.getField("LinkT."+i+"."+j).buttonGetCaption()!="....") {
app.alert("Ce bouton renvoie déjà à une url.",3);
} else {
var leLien=this.getField("LaT."+i).value;
if (j!="-" && /^(https?:\/\/)?([\w-]+(\.[\w-]+)+)(:\d+)?(\/[^\s]*)?$/i.test(leLien)) {
this.getField("LinkT."+i+"."+j).setAction("MouseUp","app.launchURL(\""+leLien+"\");");
var texteBouton="";
while ((!/^(\w|\W)+( (\w|\W)+)*$/.test(texteBouton) && texteBouton!=null) || texteBouton=="Exemple") {
var texteBouton=app.response({
cQuestion: "Quel nom souhaitez-vous attribuer à ce bouton ?",
cTitle: "Nom du bouton",
cLabel: "Nom :",
cDefault: "Exemple"
});
}
if (texteBouton!=null) {
this.getField("LinkT."+i+"."+j).buttonSetCaption(texteBouton);;
this.getField("LinkT."+i+"."+j).fillColor=color.green;
this.getField("LaT."+i).value="";
for (var k=0; k<10; k++) {
if (this.getField("LinkT."+i+"."+k).buttonGetCaption()=="....") {
this.getField("NoLieT."+i).value=k;
break;
}
}
if (k==10) app.alert("Tous les boutons renvoient à une url",3);
}
}
else if (j=="-") app.alert("Veuillez choisir un numéro d'indice",3);
else app.alert("L'url indiquée n'est pas correcte",3);
}
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Voici un nouveau script ou les diamètres pour les filetages gaz sont indiqués dans une table.
Pour info, j’ai retiré de ta liste le modèle 1″3/8 qui n’existe pas et que je prenais en exemple… ce qui m’a perturbé un moment car bien entendu il n’était pas dans la table !
if (!event.willCommit) {
for (var i=0; i<event.target.numItems; i++) {
if (event.changeEx==event.target.getItemAt(i,true)) break;
}
var lesValeurs=event.target.getItemAt(i,false);
//
var vis="";
var pas="";
var filetageRegEx=/^M[ ]*(\d{1,2})[ ]*-[ ]*\w*[ ]*(\d{1,2}[.,]\d{1,3})$/;
if (filetageRegEx.test(lesValeurs)) {
var visPas=lesValeurs.replace(filetageRegEx,"$1-$2".replace(/,/g,"."));
var vis=visPas.split("-")[0];
var pas=visPas.split("-")[1];
} else {
var filetageRegEx=/^(W|(BSF)|(PG)|(NPT))[ ]*(\d?["]?[ ]*(\d[/]\d+)?)[ ]*-[ ]*\w*[ ]*(\d{1,2}[.,]\d{1,3})$/;
if (filetageRegEx.test(lesValeurs)) {
var visPas=lesValeurs.replace("\""," ").replace(/[ ]+/g," ").replace(filetageRegEx,"$5-$7".replace(/,/g,"."));
var laVis=visPas.split("-")[0].split(/[ ]/);
if (laVis.length==1) {
var vis=(Number(laVis[0].split("/")[0])/Number(laVis[0].split("/")[1]))*25.4;
} else {
if (laVis[1]) var vis=(Number(laVis[0])+(Number(laVis[1].split("/")[0])/Number(laVis[1].split("/")[1])))*25.4;
else var vis=Number(laVis[0])*25.4;
}
var pas=visPas.split("-")[1];
} else {
var filetageRegEx=/^UN(C|F)[ ]*(\d?["]?[ ]*(\d[/]\d+)?)[ ]*-[ ]*(\d{1,2})[ ]*-[ ]*\w*[ ]*(\d{1,2}[.,]\d{1,3})$/;
if (filetageRegEx.test(lesValeurs)) {
var visPas=lesValeurs.replace("\""," ").replace(/[ ]+/g," ").replace(filetageRegEx,"$2-$4-$5".replace(/,/g,"."));
var laVis=visPas.split("-")[0].split(/[ ]/);
if (Number(visPas.split("-")[1])>=28 && /[^"]/.test(lesValeurs) && Number(visPas.split("-")[0])<=12) {
var UN=[1.524,1.854,2.184,2.515,2.845,3.175,3.505,"-",4.166,"-",4.826,"-",5.486];
var vis=UN[Number(visPas.split("-")[0])];
} else if (laVis.length==1) {
var vis=(Number(laVis[0].split("/")[0])/Number(laVis[0].split("/")[1]))*25.4;
} else {
var vis=(Number(laVis[0])+(Number(laVis[1].split("/")[0])/Number(laVis[1].split("/")[1])))*25.4;
}
var pas=visPas.split("-")[2];
} else {
var filetageRegEx=/^G[ ]*(\d?["]?[ ]*(\d[/]\d+)?)[ ]*-[ ]*\w*[ ]*(\d{1,2}[.,]\d{1,3})$/;
if (filetageRegEx.test(lesValeurs)) {
var visPas=lesValeurs.replace("\""," ").replace(/[ ]+/g," ").replace(filetageRegEx,"$1-$3".replace(/,/g,"."));
var laVis=visPas.split("-")[0].split(/[ ]/);
var filetageGaz=[["1/16",7.723],["1/8",9.728],["1/4",13.157],["3/8",16.662],["1/2",20.955],["5/8",22.911],["3/4",26.441],["7/8",30.201],["1",33.249],["1 1/8",37.897],["1 1/4",41.91],["1 1/2",47.803],["1 3/4",53.746],["2",59.614],["2 1/4",65.71],["2 1/2",75.184],["2 3/4",81.534],["3",87.884],["3 1/2",100.33],["4",125.73],["4 1/2",125.73],["5",138.43],["5 1/2",151.13],["6",163.83]];
if (laVis.length>1 && laVis[1]) var filetage=laVis[0]+" "+laVis[1];
else var filetage=laVis[0];
for (var j=0; j<filetageGaz.length; j++) {
if (filetageGaz[j][0]==filetage) {
var vis=filetageGaz[j][1];
break;
}
}
if (j==filetageGaz.length) app.alert("Filetage incorrect",3);
else var pas=visPas.split("-")[1];
} else app.alert("Filetage incorrect",3);
}
}
}
try {
console.println("vis : "+vis);
console.println("pas : "+pas);
this.getField("Text5").value=vis;
this.getField("Text6").value=pas;
} catch(e) {
app.alert("Filetage incorrect",3);
}
}
Attention, le dernier élément de la table filetageGaz doit être [“6”,163.83] (avec un point).
@+
😎-
Cette réponse a été modifiée le il y a 1 semaine et 2 jours par
bebarth.
Attachments:
You must be logged in to view attached files.bebarth
Maître des clésComme indiqué sur la page “la lettre G suivi de la taille (qui, pour rappel, n’a aucun rapport avec le diamètre)“.
Il me semble que pour le gaz la taille indiquée correspond au diamètre intérieur du tube, alors que le diamètre correspondant est son diamètre extérieur.
Il faudra donc utiliser une table pour indiquer ces diamètres car le rapport intérieur/extérieur n’est pas constant. Je regarde plus tard…@+
😎-
Cette réponse a été modifiée le il y a 1 semaine et 4 jours par
bebarth.
-
Cette réponse a été modifiée le il y a 1 semaine et 4 jours par
bebarth.
Attachments:
You must be logged in to view attached files.bebarth
Maître des clés<p style=”text-align: left;”>bonjour,
J’ai fait une petite modification du script :
if (!event.willCommit) {
for (var i=0; i<event.target.numItems; i++) {
if (event.changeEx==event.target.getItemAt(i,true)) break;
}
var lesValeurs=event.target.getItemAt(i,false);
//
var filetageRegEx=/^M[ ]*(\d{1,2})[ ]*-[ ]*\w*[ ]*(\d{1,2}[.,]\d{1,3})$/;
if (filetageRegEx.test(lesValeurs)) {
var visPas=lesValeurs.replace(filetageRegEx,"$1-$2".replace(/,/g,"."));
var vis=visPas.split("-")[0];
var pas=visPas.split("-")[1];
} else {
var filetageRegEx=/^(W|(BSF)|G|(PG)|(NPT))[ ]*(\d?["]?[ ]*(\d[/]\d+)?)[ ]*-[ ]*\w*[ ]*(\d{1,2}[.,]\d{1,3})$/;
if (filetageRegEx.test(lesValeurs)) {
var visPas=lesValeurs.replace("\""," ").replace(/[ ]+/g," ").replace(filetageRegEx,"$5-$7".replace(/,/g,"."));
var laVis=visPas.split("-")[0].split(/[ ]/);
if (laVis.length==1) {
var vis=(Number(laVis[0].split("/")[0])/Number(laVis[0].split("/")[1]))*25.4;
} else {
if (laVis[1]) var vis=(Number(laVis[0])+(Number(laVis[1].split("/")[0])/Number(laVis[1].split("/")[1])))*25.4;
else var vis=Number(laVis[0])*25.4;
}
var pas=visPas.split("-")[1];
} else {
var filetageRegEx=/^UN(C|F)[ ]*(\d?["]?[ ]*(\d[/]\d+)?)[ ]*-[ ]*(\d{1,2})[ ]*-[ ]*\w*[ ]*(\d{1,2}[.,]\d{1,3})$/;
if (filetageRegEx.test(lesValeurs)) {
var visPas=lesValeurs.replace("\""," ").replace(/[ ]+/g," ").replace(filetageRegEx,"$2-$4-$5".replace(/,/g,"."));
var laVis=visPas.split("-")[0].split(/[ ]/);
if (Number(visPas.split("-")[1])>=28 && /[^"]/.test(lesValeurs) && Number(visPas.split("-")[0])<=12) {
var UN=[1.524,1.854,2.184,2.515,2.845,3.175,3.505,"-",4.166,"-",4.826,"-",5.486];
var vis=UN[Number(visPas.split("-")[0])];
} else if (laVis.length==1) {
var vis=(Number(laVis[0].split("/")[0])/Number(laVis[0].split("/")[1]))*25.4;
} else {
var vis=(Number(laVis[0])+(Number(laVis[1].split("/")[0])/Number(laVis[1].split("/")[1])))*25.4;
}
var pas=visPas.split("-")[2];
} else app.alert("Filetage incorrect",3);
}
}
try {
console.println("vis : "+vis);
console.println("pas : "+pas);
this.getField("Text5").value=vis;
this.getField("Text6").value=pas;
} catch(e) {
app.alert("Filetage incorrect",3);
}
}
</p>
@+
😎-
Cette réponse a été modifiée le il y a 1 semaine et 2 jours par
bebarth.
Attachments:
You must be logged in to view attached files.bebarth
Maître des clésJe te propose ce script valable (sauf erreur) pour toutes tes formes d’écritures.
Si tu as un fichier terminé avec tous les différents filetages, Je te conseille de mettre ce script en fonction et de l’appeler par tous les menus déroulants.
if (!event.willCommit) {
for (var i=0; i<event.target.numItems; i++) {
if (event.changeEx==event.target.getItemAt(i,true)) break;
}
var lesValeurs=event.target.getItemAt(i,false);
//
var filetageRegEx=/^M[ ]*(\d{1,2})[ ]*-[ ]*\w*[ ]*(\d{1,2}[.,]\d{1,3})$/;
if (filetageRegEx.test(lesValeurs)) {
var visPas=lesValeurs.replace(filetageRegEx,"$1-$2".replace(/,/g,"."));
var vis=visPas.split("-")[0];
var pas=visPas.split("-")[1];
} else {
var filetageRegEx=/^(W|(BSF)|G|(PG)|(NPT))[ ]*(\d?["]?[ ]*(\d[/]\d+)?)[ ]*-[ ]*\w*[ ]*(\d{1,2}[.,]\d{1,3})$/;
if (filetageRegEx.test(lesValeurs)) {
var visPas=lesValeurs.replace(filetageRegEx,"$5-$7".replace(/,/g,"."));
var laVis=visPas.split("-")[0].split(/[ "]/);
if (laVis.length==1) {
var vis=(Number(laVis[0].split("/")[0])/Number(laVis[0].split("/")[1]))*25.4;
} else {
var vis=(Number(laVis[0])+(Number(laVis[1].split("/")[0])/Number(laVis[1].split("/")[1])))*25.4;
}
var pas=visPas.split("-")[1];
} else {
var filetageRegEx=/^UN(C|F)[ ]*(\d?["]?[ ]*(\d[/]\d+)?)[ ]*-[ ]*(\d{1,2})[ ]*-[ ]*\w*[ ]*(\d{1,2}[.,]\d{1,3})$/;
if (filetageRegEx.test(lesValeurs)) {
var visPas=lesValeurs.replace(filetageRegEx,"$2-$4-$5".replace(/,/g,"."));
var laVis=visPas.split("-")[0].split(/[ "]/);
if (Number(visPas.split("-")[1])>=28 && /[^"]/.test(lesValeurs) && Number(visPas.split("-")[0])<=12) {
var UN=[1.524,1.854,2.184,2.515,2.845,3.175,3.505,"-",4.166,"-",4.826,"-",5.486];
var vis=UN[Number(visPas.split("-")[0])];
} else if (laVis.length==1) {
var vis=(Number(laVis[0].split("/")[0])/Number(laVis[0].split("/")[1]))*25.4;
} else {
var vis=(Number(laVis[0])+(Number(laVis[1].split("/")[0])/Number(laVis[1].split("/")[1])))*25.4;
}
var pas=visPas.split("-")[2];
} else app.alert("Filetage incorrect",3);
}
}
try {
console.println("vis : "+vis);
console.println("pas : "+pas);
this.getField("Text5").value=vis;
this.getField("Text6").value=pas;
} catch(e) {
app.alert("Filetage incorrect",3);
}
}
@+
😎-
Cette réponse a été modifiée le il y a 1 semaine et 2 jours par
bebarth.
bebarth
Maître des clésbonjour,
Pour passer de pouces à millimètres il faut multiplier par 25,4.
Exemple 5/8″ = 5*25.4/8 = 15.875 mm@+
😎PS : Je n’avais pas vu sur ton fichier : 1″1/4 = 1.25″ = 1.25*25.4 = 31.75 mm
-
Cette réponse a été modifiée le il y a 1 semaine et 5 jours par
bebarth.
bebarth
Maître des clésbonjour,
Ça a l’air de fonctionner !@+
😎bebarth
Maître des clésbonjour,
Voici un script pour ajouter un lien aux boutons :
var i=event.target.name.substr(6);
var j=this.getField("NoLien."+i).value;
var leLien=this.getField("LaC."+i).value;
if (j!="-" && /^(https?:\/\/)?([\w-]+(\.[\w-]+)+)(:\d+)?(\/[^\s]*)?$/i.test(leLien)) {
this.getField("Links."+i+"."+j).setAction("MouseUp","app.launchURL(\""+leLien+"\");");
this.getField("LaC."+i).value="";
}
else if (j=="-") app.alert("Veuillez choisir un numéro d'indice",3);
else app.alert("L'url indiquée n'est pas correcte",3);
On trouve différentes expressions régulières sur internet qui correspondent à une url, celle-ci en est une !Pour la proposition de Merlin, on peut comme dans un post précédent lancer directement le lien depuis le menu déroulant en utilisant un script de touches personnalisé :
if (!event.willCommit) {
try {
app.launchURL(event.changeEx);
} catch(e) {}
}
On met le “try” au cas où la valeur d’exportation ne soit pas une url…@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clés…reste a trouver les autres !
On doit bien trouver les formules sur internet !
@+
😎https://www.h7g6.fr/data/article/37/memento-des-types-filetages (Par exemple – A vérifier).
bebarth
Maître des clésOui mais je n’ai trouvé que les formules pour le pas métrique pour l’instant (je cherche les autres, a moins que cela fonction sur d’autre filetage ?
Dire que j’avais tout ça et que je m’en suis séparé il n’y a pas très longtemps…
@+
😎bebarth
Maître des clésça affichait la valeur précédemment sélectionnée dans le tableau
Le premier fichier que j’ai partagé n’était pas le bon… mais le script est correct.
J’ai maintenant remplacé le fichier. Ça évite d’avoir un bouton !@+
😎bebarth
Maître des clésbonjour,
Je te propose un script de touches personnalisé :
if (!event.willCommit) {
for (var i=0; i<event.target.numItems; i++) {
if (event.changeEx==event.target.getItemAt(i,true)) break;
}
var lesValeurs=event.target.getItemAt(i,false).split(" - Pas ");
this.getField("Text5").value=lesValeurs[0];
this.getField("Text6").value=lesValeurs[1];
}
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clés…et si tu veux écrire sur tous tes champs “Vol.” en script de calcul, tu exécutes :
for (var i=0; i<126; i++) {
this.getField("Vol."+i).setAction("Calculate", "var INDICE=event.target.name.substr(4);\revent.value=this.getField(\"JSerie.\"+INDICE).value*this.getField(\"JReps.\"+INDICE).value*this.getField(\"JCharge.\"+INDICE).value;");
}
@+
😎bebarth
Maître des clésbonjour,
Dans un premier temps il faut récupérer l’indice :
var INDICE=event.target.name.substr(4);
puis il faut écrire :
this.getField("Vol."+INDICE).value=this.getField("JSerie."+INDICE).value*this.getField("JReps."+INDICE).value*this.getField("JCharge."+INDICE).value;
@+
😎bebarth
Maître des clésbonjour,
Il est important de noter que l’exécution d’un tel script n’est pas permise sur un bouton.
Ce n’est pas tout à fait vrai. C’est possible en plaçant une partie en script d’application pour élargir les privilèges. Mais c’est donc compliqué car il faut placer ce script en local dans le répertoire JavaScript d’Acrobat (ou Reader) de chaque ordinateur. Si ça t’intéresse tu me dis et je te fais un exemple.
Pour les tablettes, tu oublies…
@+
😎-
Cette réponse a été modifiée le il y a 2 semaines et 6 jours par
bebarth.
bebarth
Maître des clésAvec event.change (en script de touches personnalisé) on peut détecter la plupart des touches appuyées sauf pour les tabulations, les flèches, …
@+
😎bebarth
Maître des clésbonjour,
Les valeurs retournées sont de 0 à 2 :
0 — La valeur n’a pas été validée (par exemple, la touche Échap a été enfoncée).
1 — La valeur a été validée en raison d’un clic en dehors du champ à l’aide de la souris.
2 — La valeur a été validée en raison d’un appui sur la touche Entrée.
3 — La valeur a été validée en appuyant sur la touche Tab pour accéder à un nouveau champ.@+
😎bebarth
Maître des clésLa discussion a été très rapide !
@+
😎bebarth
Maître des clésAh oui, c’est vrai… mais mois je suis toujours retourné directement à l’interface “classique”.
@+
😎bebarth
Maître des clésÇa donne envie !
Et c’est prévu pour quand ?@+
😎bebarth
Maître des clésils ne sont pas compatibles avec la “nouvelle expérience” de l’interface d’Acrobat.
C’est quoi cette nouvelle expérience ?
@+
😎bebarth
Maître des clésbonjour,
Si tu utilises mon utilitaire “Propriétés d’un champs” dans les abracadabraTools de Merlin, tu peux voir toutes les propriétés d’un champ spécifique, y compris le nom de la police de caractères utilisée.
Si tu n’as pas les abracadabraTools, je te conseille de les télécharger. Ils sont très utiles.
Il faudrait d’ailleurs que je pense à le mettre à jour…@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésJe fais évoquer le sujet sur le forum Adobe (plus tard) on verra si on a une réponse…
Si vous voulez suivre la discussion :
https://community.adobe.com/t5/acrobat-discussions/event-commitkey-values/m-p/15197726#M499460@+
😎bebarth
Maître des clésbonjour,
J’ai légèrement modifié l’expression régulière car on pouvait écrire “00” pour les jours et mois lors d’une modification de date.
La nouvelle expression régulière contrôlant la frappe est :
var modeleRegEx=/^((0[1-9]?|[1-2][0-9]?|3[0-1]?)([\.]((0[1-9]?|1[0-2]?)([\.]([2]([0]\d{0,2})?)?)?)?)?)?$/;
Maintenant, ce n’est plus possible… De plus, le 20 de l’année est automatiquement indiqué après le second point.@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Bêtement, j’utilise toujours les noms des polices standard données par l’api reference (font.Helv, font.Cour,…).
https://opensource.adobe.com/dc-acrobat-sdk-docs/library/jsapiref/JS_API_AcroJS.html#id615
Existe-t-il une différence ???@+
😎bebarth
Maître des clésJe fais évoquer le sujet sur le forum Adobe (plus tard) on verra si on a une réponse…
@+
😎bebarth
Maître des clésValeur 13 : Ce nombre correspond au code ASCII/Unicode de la touche Entrée (Enter).
C’est bien ce que j’avais cru comprendre, mais pourquoi un simple signe “=” ? Si on en met 2 “==” ça ne fonctionne plus !
Et ça n’a l’air de fonctionner qu’avecevent.commitKey = 13;
.@+
😎bebarth
Maître des clésbonjour,
Du coup, si PDF-XChange Editor comprend “event.commitKey”, je ne comprends pas pourquoi ça ne fonctionne pas avec ton fichier, et surtout pourquoi ça fonctionne avec l’autre ! Il ne l’interprète peut-être pas correctement. Il faut dire que “commitKey” est assez mal documenté.@+
😎bebarth
Maître des clés… j’ai trouvé, mais j’ai fait quelques tests et apparemment PDF-XChange Editor ne connait pas “event.commitKey” !!!
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésVoici le script de touches personnalisé commenté :
// Si aucun évènement ne sera exécuté, c’est à dire en cours de frappe
if(!event.willCommit) {
// La valeur du champ en table ou chaque élément est un caractère
var aTester=event.value.split(“”);
// Dans cette table, avec “splice”, on place le caractère frappé
// entre la position de départ du curseur : event.selStart
// et le nombre de caractères sélectionnés : event.selEnd-event.selStart
// Si aucun caractère n’est sélectionné event.selEnd-event.selStart==0, on ajoute donc un caractère
aTester.splice(event.selStart, event.selEnd-event.selStart, event.change);
// testeChaine est la chaine de caractère à tester de la valeur du champ avec modification du caractère frappé
var testeChaine=aTester.join(“”);
// Expression régulière pour valider la frappe en cours
// Chaque nouveau caractère doit être validé sans tenir compte des caractères à venir
// D’où l’ajout de “?” qui signifie 0 ou 1
// cf. explication de l’expression régulière ci-dessous
var fractionRegEx=/^([1-9]\d*(\/([1-9]\d*)?)?)?$/;
// La frappe est validée si le teste de la chaine avec l’expression régulière est vrai
event.rc=fractionRegEx.test(testeChaine);
// Sinon “if(event.willCommit)” : Si un évènement sera exécuté
// Si on colle une valeur ou si on quitte le champ de quelque façon que ce soit
} else {
// Expression régulière pour valider l’entrée globale
var fractionRegEx=/^[1-9]\d*(\/[1-9]\d*)?$/;
// /^…$/ Teste la chaine de catactères du début jusqu’à la fin
// [1-9] Le premier caractère doit être un chiffre de 1 à 9
// \d* 0 ou plusieurs caractères numériques
// (\/…)? Une barre de fraction et la suite, le tout facultatif
// [1-9] Si il y a une barre de fraction, le premier caractère doit être un chiffre de 1 à 9
// \d* suivi de 0 ou plusieurs caractères numériques
// L’entrée est validée si le teste de la chaine avec l’expression régulière est vrai ou si le champ est vide
event.rc=event.value==”” || fractionRegEx.test(event.value);
}
J’espère que c’est un peu plus clair pour toi !
Ça ne fonctionne effectivement pas avec PDF-XChange Editor, mais je ne sais pas où trouver les scripts du champ…@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Je commente plus tard !
Qu’est-ce qui ne fonctionne pas avec pdf XChange editor ? La validation avec la touche Enter ou l’expression régulière ?@+
😎bebarth
Maître des clésbonjour,
Non, je ne crois pas qu’il soit possible d’exporter directement en .xlsx, mais par contre on peut exporter au format .csv ! On doit pouvoir ensuite convertir le format avec une macro VBA.@+
😎PS : Perso je ne sais pas écrire de macro VBA mais c’est la spécialité de mon frère… si ça t’intéresse je peux lui demander !
-
Cette réponse a été modifiée le il y a 3 semaines et 4 jours par
bebarth.
bebarth
Maître des clésbonjour,
J’ai donc tenté de mettre en script sur le champ Result le code suivant : if (event.commitKey = 13) Verif();
Pourquoi 13 ??? Si tu penses au caractère ASCII du retour ligne, ce n’est pas comme cela que fonctionne “event.commitKey”.
https://opensource.adobe.com/dc-acrobat-sdk-docs/library/jsapiref/JS_API_AcroJS.html#commitkey
Du coup, en script de format personnalisé tu écris :
if (event.commitKey==2) Verif();
Il faut également changer 2 lignes de la fonction Verif() carthis.getField("Result").value = "";
provoque une erreur. Il faut donc remplacer (2 fois) cette ligne parthis.resetForm(["Result"]);
.Dans mon exemple, j’ai également ajouté un script de touches personnalisé pour ne pouvoir taper que les caractères utilisés pour écrire une fraction (ou juste un nombre).
if (!event.willCommit) {
var aTester=event.value.split("");
aTester.splice(event.selStart, event.selEnd-event.selStart, event.change);
var testeChaine=aTester.join("");
var fractionRegEx=/^([1-9]\d*(\/([1-9]\d*)?)?)?$/;
event.rc=fractionRegEx.test(testeChaine);
} else {
var fractionRegEx=/^[1-9]\d*(\/[1-9]\d*)?$/;
event.rc=event.value=="" || fractionRegEx.test(event.value);
}
Demande si tu souhaites que je commente !Voici un lien pour télécharger ton fichier modifié : https://we.tl/t-RlWyRLbGyD
@+
😎-
Cette réponse a été modifiée le il y a 3 semaines et 4 jours par
bebarth.
Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
il y a par contre parfois le numérateur = au dénominateur
Du coup, il faut écrire :
...
while (a==b || PGCD(a,b)==1) hasard();
...
Mon script va au plus simple en reprenant les valeurs des champs “Var.1.3” et “Var.2.3”. Je pense qu’on pourrait faire la même chose avant d’attribuer une valeur à ces champs, mais il faudrait revoir le script en entier ! Ça fonctionne comme ça…
@+
😎bebarth
Maître des clésVoici pour ton script de document “hasard”. La première fonction “function aleatoire (indice)” ne change pas, puis :
function aleatoire (indice) {
function getRandomIntInclusive(min,max,dec) {
return Math.round((Math.random()*(max-min)+min)*Math.pow(10,dec))/Math.pow(10,dec);
}
if (this.getField("Var."+indice+".0").value !="" || this.getField("Var."+indice+".1").value !="" || this.getField("Var."+indice+".2").value !="") {
this.getField("Var."+indice+".3").value=getRandomIntInclusive(this.getField("Var."+indice+".1").value,this.getField("Var."+indice+".2").value,this.getField("Dec."+i).value);
}
eval(this.getField("Var."+indice+".0").value+"="+this.getField("Var."+indice+".3").value);
}
function PGCD(a,b) {
if (b) return PGCD(b,a%b);
else return Math.abs(a);
}
function hasard () {
for (i=1; i<=2; i++) {
try {
aleatoire (i);
} catch(e) {
this.getField("Var."+i+".3").value="";
}
}
a=Math.abs(this.getField("Var.1.3").value);
b=Math.abs(this.getField("Var.2.3").value);
while (PGCD(a,b)==1) hasard();
}
@+
😎PS : Bon, le fichier ne passe pas, je te laisse donc faire la modification.
-
Cette réponse a été modifiée le il y a 3 semaines et 6 jours par
bebarth.
bebarth
Maître des clésVoici une autre version avec moins de problèmes…
Elle est où cette version ???
@+
😎bebarth
Maître des clésLe PGCD et le PPCM, mes cauchemars de collégien !
Je crois même qu’on apprend ça en fin de primaire…
@+
😎bebarth
Maître des clésbonjour,
Il faut écrire :
if (event.value>10) event.target.textColor=color.red;
else event.target.textColor=color.black;
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
En fait je n’arrive pas bien à comprendre comment ça fonctionne (Comment on génère les nombres aléatoires). Quand on clique sur “CLIQUE ICI” on a toujours un message… de plus il me semble qu’il y a une inversion quelque part entre le numérateur et le dénominateur (cf. copie d’écran).Sinon dans le principe il faudrait calculer le PGCD et faire une boucle (while) tant qu’il est égal à 1.
Si tu m’éclaire un peu, je te fais ça (je l’ai déjà fait).@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Par contre ce qui est interdit partout, y compris sur les plaques d’immatriculation c’est “SS”.
Je ne vais pas commenter la liste des noms partis à bannir, mais j’ai une info très intéressante à vous partager.
Ma première voiture, une 4L, était immatriculée “2200 SS 77” et c’est la seule immatriculation que je me souvienne…
Même l’immatriculation de ma voiture actuelle est notée sur mon téléphone. Intéressant, non ???@+
😎bebarth
Maître des clésbonjour,
C’est possible si tu n’utilise pas un champ date mais un champ texte en forçant l’utilisation des caractère.
Il y a 2 possibilités : Soit tu obliges l’utilisateur à taper tous les chiffres et dans ce cas tu peux insérer automatiquement les points de séparation ou l’utilisateur peut ne taper qu’un seul chiffres pour les jours et mois et 2 chiffres pour l’année et un script de format personnalisé se charge de remettre ça en forme.
Voici les scripts utilisés dans mon document exemple qui vérifie les mois de 30 et 31 jours ainsi que le 29 février des année bissextiles :// script de document
function verifDate(laDate) {
var jour=Number(laDate.substr(0,2));
var mois=Number(laDate.substr(3,2));
var annee=Number(laDate.substr(6));
var bissextile=annee%4==0 && (annee%100!=0 || annee%400==0)?"OUI":"NON";
if (mois==2) {
var leMois="FEVRIER";
} else if (mois==4 || mois==6 || mois==9 || mois==11) {
var leMois="30 JOURS";
} else {
var leMois="31 JOURS";
}
if (laDate.length==6) return (leMois=="30 JOURS" && jour<=30) || leMois=="31 JOURS" || (leMois=="FEVRIER" && jour<=29);
else return (leMois=="30 JOURS" && jour<=30) || leMois=="31 JOURS" || (leMois=="FEVRIER" && jour<=28) || (bissextile=="OUI" && jour<=29);
}
// Script de touches personnalisé pour date entrée 01.02.2025
if(!event.willCommit) {
if (event.change==",") event.change=".";
if ((/^0$/.test(event.value) || /^\d{2}\.0$/.test(event.value)) && event.change==0) var dateOK=false;
else {
var aTester=event.value.split("");
if (event.value.length==1 && event.change!="") event.change=event.change+"\.";
if (event.value.length==4 && event.change!="") event.change=event.change+"\.";
aTester.splice(event.selStart, event.selEnd-event.selStart, event.change);
var testeChaine=aTester.join("");
if (testeChaine.length==6 || testeChaine.length==10) var dateOK=verifDate(testeChaine);
else var dateOK=true;
}
var modeleRegEx=/^(([0-2][0-9]?|(3)[0-1]?)([\.](((0)[0-9]?|(1)[0-2]?)([\.]([2]([0]\d{0,2})?)?)?)?)?)?$/;
event.rc=modeleRegEx.test(testeChaine) && dateOK;
} else {
var modeleRegEx=/^(\d{2}\.\d{2}\.\d{4})?$/;
event.rc=event.value=="" || modeleRegEx.test(event.value);
}
// Script de touches personnalisé pour date entrée 1.2.25
if(!event.willCommit) {
if (event.change==",") event.change=".";
if ((/^0$/.test(event.value) || /^\d{1,2}\.0$/.test(event.value) || /^\d{1,2}\.\d{1,2}\.0?$/.test(event.value)) && event.change==0) var dateOK=false;
else {
var aTester=event.value.split("");
aTester.splice(event.selStart, event.selEnd-event.selStart, event.change);
var testeChaine=aTester.join("");
var aRetester=testeChaine.split(".");
for (var i=0; i<aRetester.length; i++) {
if (i==0 || i==1) {
if (aRetester.length==1) aRetester="0"+aRetester+".";
else aRetester=aRetester.toString()+".";
} else if (i==3 && aRetester.length==2) aRetester="20"+aRetester;
}
var testeChaine=aRetester.join("");
if (testeChaine.length==6 || testeChaine.length==10) var dateOK=verifDate(testeChaine);
else var dateOK=true;
}
var modeleRegEx=/^(([0-2]?[0-9]?|(3)[0-1]?)([\.](((0)?[0-9]?|(1)[0-2]?)([\.](([2][0]?)?\d{0,2})?)?)?)?)?$/;
event.rc=modeleRegEx.test(testeChaine) && dateOK;
} else {
var modeleRegEx=/^(\d{1,2}\.\d{1,2}\.\d{2,4})?$/;
event.rc=event.value=="" || modeleRegEx.test(event.value);
}
// Script de format personnalisé
var cetteDate=event.target.value.split(".");
if (cetteDate[0].length==1) cetteDate[0]="0"+cetteDate[0];
if (cetteDate[1].length==1) cetteDate[1]="0"+cetteDate[1];
if (cetteDate[2].length==2) cetteDate[2]="20"+cetteDate[2];
event.value=cetteDate[0]+"."+cetteDate[1]+"."+cetteDate[2];
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésConcrètement ça veut dire que :
- si la variable pointA == “P” alors les variables pointB et pointC doivent être différentes de S et de C
- si pointB == “P” alors pointC doit être différente de S et de C
- si (pointA == “F”|| pointA == “R”) alors les variables pointB et pointC doivent être différentes de N
- si (pointB == “F”|| pointB == “R”) alors la variables pointC doit être différente de N
…ça va encore !
On peut modifier la seconde expression régulière en
/P.?(S|C|D|Q|T)|(F|R).?N|F.?O|L.?R|W.?C|GPT/
, ce qui donne :var pointsABC="";
while (pointsABC.length<3) {
pointsABC+=String.fromCharCode(65+Math.floor(Math.random()*26));
if (/^(?=.*(.).*\1)[A-Z]{1,3}$/.test(pointsABC) || /P.?(S|C|D|Q|T)|(F|R).?N|F.?O|L.?R|W.?C|GPT/.test(pointsABC)) var pointsABC=pointsABC.slice(0,-1);
}
@+
😎-
Cette réponse a été modifiée le il y a 1 mois par
bebarth.
bebarth
Maître des clésbonjour,
Attention aux scripts “Souris relâchée” pour les menus déroulants qui s’exécutent avant de relâcher réellement.
Je pense qu’il vaut mieux utiliser un script de touches personnalisé tel que :
if (!event.willCommit) fillDropdown();
Donc pour placer cette ligne en Script de touches personnalisé de tous les menus déroulants il faut exécuter :
for (var i=0; i<this.numFields; i++) {
var f=this.getField(this.getNthFieldName(i));
if (f.type=="combobox") f.setAction("Keystroke", "if (!event.willCommit) fillDropdown();");
}
Pour ajouter une petite précision, on peut utiliser
if (event.willCommit)...
si on est certain que la case “Valider la valeur sélectionnée immédiatement” est cochée, mais pour être certain que celà fonctionne j’ai l’habitude d’utiliserif (!event.willCommit)...
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
J’ai eu le temps de réfléchir à “comment réduire le script” hier pendant que je conduisais sur mon chemin du retour…
Voici donc le résultat de ma réflexion après l’avoir testé ce matin :
var pointsABC="";
while (pointsABC.length<3) {
pointsABC+=String.fromCharCode(65+Math.floor(Math.random()*26))
if (/^(?=.*(.).*\1)[A-Z]{1,3}$/.test(pointsABC) || /PS|PC|FN|RN|FO|LR|PD|PQ|WC|GPT|PT/.test(pointsABC)) var pointsABC=pointsABC.slice(0,-1);
}
console.println(pointsABC);
On peut donc récupérer chaque point si nécessaire en “splitant” la chaine pointsABC.
Une autre réflexion m’en est ensuite venue : les couples/trios de lettres interdits le sont ici pour des points consécutifs et dans l’ordre (AB et BC) mais doivent-ils également l’être dans un autre ordre (BA, CB ou AC et CA) ??? Ça risque de compliquer un peu l’expression régulière…
@+
😎bebarth
Maître des clésJe pense que ça devrait être ça !
@+
😎bebarth
Maître des clésbonjour,
le principe est le bon mais il faut aussi vérifier que les 3 lettres sont différentes.
Je pourrai regarder à mon retour mercredi ou jeudi…@+
😎bebarth
Maître des clésbonjour,
Il suffit de faire la même chose avec la variable P3 qu’il était fait avec la variable P2. Donc :function Renommer_c() {
for (var i=0; i<this.numFields; i++) {
var nomChamp=this.getNthFieldName(i);
//décomposer les noms de champs en 3 parties séparées par les points : P1 ; P2 et P3
var b = nomChamp.split(".");
var P1 = (b[0]);
var P2 = (b[1]);
var P3 = (b[2]);
var P3a = this.getField("indice2_ancien").value;
var P3n = this.getField("indice2_nouveau").value;
if (P3==P3a) {
renommerChamp (nomChamp,P1+"."+P2+"."+P3n);
this.removeField(nomChamp);
}
}
}
function renommerChamp (leNom,nouveauNom) {
try {
g = this.getField(leNom);
var laValeur=g.value;
var leType=g.type;
var laPage=String(g.page);
var lesPages=laPage.split(",");
for (var p=0; p<lesPages.length; p++) {
var cettePage=Number(lesPages[p]);
if (lesPages.length>1) {
var nomChamp=leNom+"."+p;
} else {
var nomChamp=leNom;
}
g=this.getField(nomChamp);
var lesCoord=g.rect;
var f = this.addField(nouveauNom, leType, cettePage, lesCoord);
f = this.getField(nouveauNom);
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.strokeColor=["RGB",0,147/255,0];
f.fillColor=color.white;
//f.display=display.hidden;
if (leType=="combobox" || leType=="listbox") {
var liste=new Array();
for (var k=0; k<g.numItems; k++) {
var valeur = g.getItemAt(k,false);
var valeurExport = g.getItemAt(k,true);
var element=[valeur,valeurExport];
liste.push(element);
}
f.setItems(liste);
f.currentValueIndices=g.currentValueIndices;
}
if (leType=="button") {
f.buttonSetIcon(g.buttonGetIcon());
f.buttonSetCaption(g.buttonGetCaption());
}
}
} catch(e) {app.alert("\nLe champ \""+leNom+"\"\rn'existe pas dans ce document.")}
}
Et comme le dit Merlin, si les champs possèdent des scripts il est impossible de les recopier.
De même, il n’est pas possible de recopier les formats (mais on peut les définir si on les connait).@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Il suffit de mettre la boucle en fonction !@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
C’est ce qu’est censé faire le fichier que j’ai partagé !@+
😎bebarth
Maître des clésbonjour,
Je ne suis pas certain d’avoir tout compris, mais au cas où voici un fichier que j’avais fait à partir du fichier “Texte2Unicode” de Merlin.
Ce fichier ajoute un caractère d’échappement pour différents cas. Tu me dis…@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Il y avait plusieurs méthodes pour pallier ce message. En voici une :
// Script de document
var dropdownName="gato";
var dropdownNumber=0;
for (var i=0; i<this.numFields; i++) {
if (this.getField(this.getNthFieldName(i)).name.indexOf(dropdownName+".")==0) dropdownNumber++;
}
var listeEleves=this.getField("entreesListe").value;
var lesEleves=listeEleves.split("\r");
lesEleves.sort(function(a,b){return a.localeCompare(b)});
function liste() {
lesNoms=lesEleves.map(function(element) {return [element.split("/")[0],element]});
var theIndex=event.target.name.substr(event.target.name.indexOf(".")+1);
theValue=event.target.value;
for (var i=0; i<dropdownNumber; i++) {
if (i!=theIndex) {
var laPosition=this.getField(dropdownName+"."+i).currentValueIndices;
for (j=0; j<lesNoms.length; j++) {
if (lesNoms[j][0]==this.getField(dropdownName+"."+i).getItemAt(laPosition,false) && this.getField(dropdownName+"."+i).value!="-") {
lesNoms.splice(j,1);
break;
}
}
}
}
}
function fillDropdown() {
liste();
event.target.setItems(lesNoms);
event.target.value=theValue;
}
function selection() {
var theIndex=event.target.name.substr(event.target.name.indexOf(".")+1);
if (event.changeEx=="-") this.getField("Group."+theIndex).value="-";
else this.getField("Group."+theIndex).value=event.changeEx.split("/")[1];
liste();
if (event.changeEx=="-") this.getField("nonListes").value=lesNoms.length-1;
else this.getField("nonListes").value=lesNoms.length-2;
}
function comptage() {
lesNoms=lesEleves.map(function(element) {return [element.split("/")[0],element]});
for (var i=0; i<dropdownNumber; i++) {
var laPosition=this.getField(dropdownName+"."+i).currentValueIndices;
for (j=0; j<lesNoms.length; j++) {
if (lesNoms[j][0]==this.getField(dropdownName+"."+i).getItemAt(laPosition,false) && this.getField(dropdownName+"."+i).value!="-") {
lesNoms.splice(j,1);
break;
}
}
}
this.getField("nonListes").value=lesNoms.length-1;
}
comptage();
Avec mon script, le bouton “Vérifier n’a plus lieu d’être” vu que les champs “Group” sont rempli automatiquement lors de chaque sélection d’élève.
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésOups ! Ça vient de la mise en fonction… et “event.target.name” lancé depuis le script de document n’a aucun sens… Je regarde demain !
Par contre, je ne comprends pas ta copie d’écran !!! Ça fonctionne chez moi.
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Je viens de finaliser le script.
J’ai un peu galéré sur une erreur que je qualifierais “de débutant” (“<=” au lieu de “<“), mais avec un instant de lumière pendant la nuit j’ai enfin pu débloquer le script que voici :// Script de document
var dropdownName="gato";
var dropdownNumber=0;
for (var i=0; i<this.numFields; i++) {
if (this.getField(this.getNthFieldName(i)).name.indexOf(dropdownName+".")==0) dropdownNumber++;
}
function liste() {
var listeEleves=this.getField("entreesListe").value;
var lesEleves=listeEleves.split("\r");
lesEleves.sort(function(a,b){return a.localeCompare(b)});
lesNoms=lesEleves.map(function(element) {return [element.split("/")[0],element]});
var theIndex=event.target.name.substr(event.target.name.indexOf(".")+1);
theValue=event.target.value;
for (var i=0; i<dropdownNumber; i++) {
if (i!=theIndex) {
var laPosition=this.getField(dropdownName+"."+i).currentValueIndices;
for (j=0; j<lesNoms.length; j++) {
if (lesNoms[j][0]==this.getField(dropdownName+"."+i).getItemAt(laPosition,false) && this.getField(dropdownName+"."+i).value!="-") {
lesNoms.splice(j,1);
break;
}
}
}
}
}
function fillDropdown() {
liste();
event.target.setItems(lesNoms);
event.target.value=theValue;
}
function selection() {
var theIndex=event.target.name.substr(event.target.name.indexOf(".")+1);
if (event.changeEx=="-") this.getField("Group."+theIndex).value="-";
else this.getField("Group."+theIndex).value=event.changeEx.split("/")[1];
liste();
if (event.changeEx=="-") this.getField("nonListes").value=lesNoms.length-1;
else this.getField("nonListes").value=lesNoms.length-2;
}
liste();
this.getField("nonListes").value=lesNoms.length-1;
// Pour placer les scripts sur tous les menus déroulants
for (var i=0; i<this.numFields; i++) {
var nomChamp=this.getNthFieldName(i);
if (nomChamp.indexOf("gato.")==0) {
this.getField(nomChamp).setAction("MouseEnter", "fillDropdown();");
this.getField(nomChamp).setAction("Keystroke", "if (!event.willCommit) {selection();}");
};
}
Tu me dis si tu as des questions…
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Je ne vais pas vous raconter ma vie, mais pour info j’ai terminé mais je ne pense pas avoir le temps de peaufiner le script aujourd’hui… Certainement demain !@+
😎bebarth
Maître des clésbonsoir,
Je regarde rapidement…
Je pense faire en sorte que lorsqu’un nom a été sélectionné il n’apparaisse plus dans les autres menus déroulants et afficher le nombre de noms qui n’ont pas encore été sélectionnés.
Ça te conviendrait ???@+
😎bebarth
Maître des clésbonjour,
Voici ma proposition :
var listeEleves=this.getField("entreesListe").value;
var VP1=[];
var VTR=[];
var VP2=[];
var Alternance=[];
var inconnus=[];
var elevesX2=[];
var lesEleves=listeEleves.split("\r");
lesEleves.sort(function(a,b){return a.localeCompare(b)});
var elevePrecedent="";
for (var i=0; i<lesEleves.length; i++) {
var unEleve=lesEleves.split("/");
try {
if (unEleve[0]==elevePrecedent) elevesX2.push(unEleve[0]);
switch (unEleve[1]) {
case "VP1":
VP1.push(unEleve[0]);
break;
case "VTR":
VTR.push(unEleve[0]);
break;
case "VP2":
VP2.push(unEleve[0]);
break;
case "Alternance":
Alternance.push(unEleve[0]);
break;
default:
if (unEleve[0]!="-") inconnus.push(unEleve[0]);
}
var elevePrecedent=unEleve[0]
} catch(e) {}
}
this.getField("groupe.1.1").value=VP1.toString().replace(/,/g,"\r");
this.getField("groupe.1.2").value=VP1.length;
this.getField("groupe.2.1").value=VTR.toString().replace(/,/g,"\r");
this.getField("groupe.2.2").value=VTR.length;
this.getField("groupe.3.1").value=VP2.toString().replace(/,/g,"\r");
this.getField("groupe.3.2").value=VP2.length;
this.getField("groupe.4.1").value=Alternance.toString().replace(/,/g,"\r");
this.getField("groupe.4.2").value=Alternance.length;
if (inconnus.length) app.alert("Les élèves suivants n'ont pas de groupe :\r"+inconnus.toString().replace(/,/g,"\r"),3);
else app.alert("Tous les élèves ont un groupe.",3);
if (elevesX2.length) app.alert("Les élèves suivants sont dans plusieurs groupes :\r"+elevesX2.toString().replace(/,/g,"\r"),3);
Ceci est une version où l’on indique les noms des champs et des variables. On aurait pu en faire une qui les trouve automatiquement, mais ça complique un peu le script… Je me suis dit “commençons par le plus simple, on verra si il y a de la demande !”.
@+
😎-
Cette réponse a été modifiée le il y a 1 mois et 3 semaines par
bebarth.
Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Dans ton fichier tu exécutes un script “affiche();”, par exemple, qui est une fonction mais qui ici n’est définie nulle part…
Lorsque les fonctions sont fréquemment utilisées dans un document, on les place souvent en script de document. Il n’y en a pas dans ton fichier.@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbebarth
Maître des clésbonjour,
Voici un exemple de ce que tu pourrais faire…@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésJ’espère que ça t’as bien avancé… 😉
bebarth
Maître des clésbonjour et Bonne Année !
Je ne peux te donner que mon avis. Je ne suis pas assez calé en programmation/informatique pour savoir si cela à un impact sur la vitesse ou la fluidité d’exécution…
Pour ma part, donc, je préfère diviser les différents scripts nécessaires pour faciliter la lecture et ainsi retrouver plus facilement des éventuelles erreurs. Vu qu’en général on avance petit à petit dans le document on ajoute au fur et à mesure différents scripts de document. Généralement j’en crée un premier où je mets les différentes variables utilisées fréquemment par d’autres scripts ainsi que les scripts d’ouverture, puis les autres scripts de document sont généralement des fonctions.
Par contre, je ne suis pas pour tout mettre en fonction. Cela rend le script plus compliqué à comprendre. Il ne faut donc les utilisées que lorsqu’elles sont appelées fréquemment. Si on a des centaines de champs et que tous les scripts sont en script de calcul cela va énormément rallonger les temps de calcul…@+
Par contre, ce qui est important pour des formulaires compliqués ou avec beaucoup de champs à calculer, c’est de savoir lancer les scripts par les bons évènements.bebarth
Maître des clésJe viens de te répondre par mail.
@+
😎bebarth
Maître des clésTu as même fait en sorte de ne pas re-créer les champs R.a.b s’ils sont déjà présents…
Dans mon script les champs R.a.b sont effacés s’ils existent (d’où le try) :
try {
this.removeField("R."+P2+"."+P3);
} catch(e) {};
avant d’être re-créés :
renommerChamp ("Q."+P2+"."+P3,"R."+P2+"."+P3);
@+
😎bebarth
Maître des clésbonjour,
Tu pourrais aussi faire ça dans le même fichier !
function Renommer_c() {
//récuperer les noms de tous les champs
for (var i=0; i<this.numFields; i++) {
var nomChamp=this.getNthFieldName(i);
//décomposer les noms de champs en 3 parties séparées par les points : P1 ; P2 et P3
var b = nomChamp.split(".");
var P1 = (b[0]);
var P2 = (b[1]);
var P3 = (b[2]);
//Si l'on désire modifier la partie 1 et que la partie 1 correspond à l'entrée saisie dans le champ Name.3.1
if (P1=="Q") {
try {
this.removeField("R."+P2+"."+P3);
} catch(e) {};
renommerChamp ("Q."+P2+"."+P3,"R."+P2+"."+P3);
}
}
}
function renommerChamp (leNom,nouveauNom) {
try {
g = this.getField(leNom);
var laValeur=g.value;
var leType=g.type;
var laPage=String(g.page);
var lesPages=laPage.split(",");
for (var p=0; p<lesPages.length; p++) {
var cettePage=Number(lesPages[p]);
if (lesPages.length>1) {
var nomChamp=leNom+"."+p;
} else {
var nomChamp=leNom;
}
g=this.getField(nomChamp);
var lesCoord=g.rect;
var lesAutresCoord=[lesCoord[0],lesCoord[1]+30,lesCoord[2],lesCoord[3]+30];
var f = this.addField(nouveauNom, leType, cettePage, lesAutresCoord);
f = this.getField(nouveauNom);
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.strokeColor=["RGB",0,147/255,0];
f.fillColor=color.white;
//f.display=display.hidden;
if (leType=="combobox" || leType=="listbox") {
var liste=new Array();
for (var k=0; k<g.numItems; k++) {
var valeur = g.getItemAt(k,false);
var valeurExport = g.getItemAt(k,true);
var element=[valeur,valeurExport];
liste.push(element);
}
f.setItems(liste);
f.currentValueIndices=g.currentValueIndices;
}
if (leType=="button") {
f.buttonSetIcon(g.buttonGetIcon());
f.buttonSetCaption(g.buttonGetCaption());
}
}
} catch(e) {app.alert("\nLe champ \""+leNom+"\"\rn'existe pas dans ce document.")}
}
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
J’ai beaucoup mieux compris avec ta vidéo, et du coup je me suis aperçu qu’il y avait une erreur dans mon script (pour les menus déroulants et les listes).
Il faut supprimer une ligne de script :
...
if (leType=="combobox" || leType=="listbox") {
var liste=new Array();
for (var k=0; k<g.numItems; k++) {
var valeur = g.getItemAt(k,false);
var valeurExport = g.getItemAt(k,true);
// <----- Suppimer cette ligne
var element=[valeur,valeurExport];
liste.push(element);
}
f.setItems(liste);
f.currentValueIndices=g.currentValueIndices;
}
...
Je ne me souviens pas pourquoi je l’avais mise !!! Peut-être pour une application spécifique.
En tout cas cela fonctionne beaucoup mieux maintenant…@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésJe vais faire une petite vidéo si c’est trop confus…
Je veux bien car je ne suis pas certain de comprendre !
@+
😎bebarth
Maître des clésbonjour,
Je viens de relire ta demande, et en fait (si j’ai bien compris) tu pouvais n’utiliser que la partie “bouton” du fichier que je t’ai envoyé !
Voici un exemple fait avec la méthode “popUpMenuEx” de l’api reference.//######################
// * b2Tools * #
// 12/24 #
// ----------- #
// PersoTool Example #
// Exemple Outil Perso #
//######################
if (typeof app.formsVersion!="undefined" && app.formsVersion>9 && app.viewerVariation!="Reader") {
// Traductions
if (app.language=="FRA") {
var txtBoutonPersoTool="Outil Perso"; // Texte bouton
var txtInfoPersoTool="Infobulle"; // Infobulle bouton
}
else {
var txtBoutonPersoTool="Personal Tool"; // Button text
var txtInfoPersoTool="Tooltip"; // Button tooltip
}
// Exécution du script
var executePersoTool=app.trustedFunction(function(){
// Traductions
if (app.language=="FRA") {
var b2txt00="\u00C9l\u00E9ment 1";
var b2txt01="\u00C9l\u00E9ment 2";
var b2txt02="\u00C9l\u00E9ment 2, Sous-menu 1";
var b2txt03="\u00C9l\u00E9ment 2, Sous-menu 2";
var b2txt04="\u00C9l\u00E9ment 2, Sous-menu 2, Sous-sous-menu 1";
var b2txt05="0";
var b2txt06="\u00C9l\u00E9ment 3";
var b2txt07="\u00C9l\u00E9ment 4";
var b2txt08="1";
var b2txt09="Vous avez choisi l'\u00E9l\u00E9ment menu \"";
var b2txt10="\"";
}
else {
var b2txt00="Item 1";
var b2txt01="Item 2";
var b2txt02="Item 2, Submenu 1";
var b2txt03="Item 2, Submenu 2";
var b2txt04="Item 2, Submenu 2, Subsubmenu 1";
var b2txt05="0";
var b2txt06="Item 3";
var b2txt07="Item 4";
var b2txt08="1";
var b2txt09="You chose the \"";
var b2txt10="\" menu item";
}
//
var cChoice=app.popUpMenuEx(
{
cName: b2txt00,
bMarked:true,
bEnabled:false
},{
cName: "-"
},{
cName: b2txt01,
oSubMenu: [
{
cName: b2txt02
},{
cName: b2txt03,
oSubMenu: {
cName:b2txt04,
cReturn: b2txt05
}
}
]
},{
cName: b2txt06
},{
cName: b2txt07,
bMarked: true,
cReturn: b2txt08
}
)
app.alert(b2txt09+cChoice+"\" menu item");
//
});
// Icône PersoTool
var dataIconePersoTool="ffffffffff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ffffffffff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3fffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aeff00ada3ff00ada3ff00ada3ff00ada3fffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aeff00ada3ff00ada3ff00ada3ff00ada3fffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aeff00ada3ff00ada3ff00ada3ff00ada3fffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aeff00ada3ff00ada3ff00ada3ff00ada3fffff7aefffff7aefffff7aefffff7aeffcb0000ffcb0000ffcb0000ffcb0000fffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aeff00ada3ff00ada3ff00ada3ff00ada3fffff7aefffff7aefffff7aefffff7aeffcb0000fffff7aefffff7aefffff7aeffcb0000fffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aeff00ada3ff00ada3ff00ada3ff00ada3fffff7aefffff7aefffff7aefffff7aeffcb0000fffff7aefffff7aeff21221fffcb0000ff21221fff21221fff21221ffffff7aefffff7aefffff7aefffff7aeff00ada3ff00ada3ff00ada3ff00ada3fffff7aefffff7aefffff7aefffff7aeffcb0000ffcb0000ffcb0000ffcb0000fffff7aeff21221ffffff7aefffff7aefffff7aefffff7aefffff7aefffff7aeff00ada3ff00ada3ff00ada3ff00ada3fffff7aefffff7aefffff7aefffff7aeffcb0000fffff7aefffff7aefffff7aefffff7aeff21221ffffff7aefffff7aefffff7aefffff7aefffff7aefffff7aeff00ada3ff00ada3ff00ada3ff00ada3fffff7aefffff7aefffff7aefffff7aeffcb0000fffff7aefffff7aefffff7aefffff7aeff21221ffffff7aefffff7aefffff7aefffff7aefffff7aefffff7aeff00ada3ff00ada3ff00ada3ff00ada3fffff7aefffff7aefffff7aefffff7aeffcb0000fffff7aefffff7aefffff7aefffff7aeff21221ffffff7aefffff7aefffff7aefffff7aefffff7aefffff7aeff00ada3ff00ada3ff00ada3ff00ada3fffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aeff21221ffffff7aefffff7aefffff7aefffff7aefffff7aefffff7aeff00ada3ff00ada3ff00ada3ff00ada3fffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aeff21221ffffff7aefffff7aefffff7aefffff7aefffff7aefffff7aeff00ada3ff00ada3ff00ada3ff00ada3fffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aeff00ada3ff00ada3ff00ada3ff00ada3fffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aeff00ada3ff00ada3ff00ada3ff00ada3fffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aefffff7aeff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ffffffffff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ff00ada3ffffffff";
var IconePersoTool={
count: 0,
width: 20,
height: 20,
read: function(nBytes){return dataIconePersoTool.slice(this.count,this.count+=nBytes);}
};
// Bouton PersoTool
var objetBoutonPersoTool={
cName: "nomBoutonPersoTool",
cExec: "executePersoTool(event.target);",
cEnable: "event.rc=(app.doc!=null)",
cMarked: "event.rc=false",
cTooltext: txtInfoPersoTool,
oIcon: IconePersoTool,
cLabel: txtBoutonPersoTool
};
//
try {
app.removeToolButton("nomBoutonPersoTool");
} catch(e){}
try {
app.addToolButton(objetBoutonPersoTool);
} catch(e){}
}
//########################
// That's all folks! #
// et pis c'est tout ! #
// @+ #
// bebarth #
//########################
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
…et pareil que Merlin : félicitations pour ce que tu fais !Je n’ai pas bien suivi ces derniers jours, du coup tu en es où dans tes demandes ?
Si tu peux me repréciser ! Merci.@+
😎bebarth
Maître des clés…je ne pense pas l’avoir déjà fait alors !
@+
😎bebarth
Maître des clésbonjour,
Je t’ai envoyé mon fichier modèle que j’utilise lorsque je crée des utilitaires.
Je ne le partage pas ici car c’est un peu compliqué et ça a été un peu de boulot à faire, mais je peux le partager sur demande.@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour Jean-Claude,
Envoie-moi une adresse mail en MP à “bebarth arrobase sfr point fr” où je peux te faire parvenir un exemple.@+
😎bebarth
Maître des clésbonjour,
Voici les lignes pour pouvoir supprimer les anciens champs avec ton script :function Renommer_c() {
var anciensChamps=[];
for (var i=0; i<this.numFields; i++) {
var nomChamp=this.getNthFieldName(i);
var Menu = this.getField("Menu").value;
var CaR = this.getField("nom_champ").value;
var an = this.getField("AN").value;
var P1new = this.getField("NN").value;
var P2new = this.getField("NN").value;
var b = nomChamp.split(".");
var P1 = (b[0]);
var P2 = (b[1]);
var P3 = (b[2]);
if (Menu == 1 && an == P1) {
try{
var ts=this.getField(P1+"."+P2+"."+P3).textSize;
var tf=this.getField(P1+"."+P2+"."+P3).textFont;
var rct=this.getField(P1+"."+P2+"."+P3).rect;
var pg=this.getField(P1+"."+P2+"."+P3).page;
var f=this.addField(P1new+"."+P2+"."+P3,"text",pg,rct);
anciensChamps.push(P1+"."+P2+"."+P3);
f.textSize=ts;
f.textFont=tf;
}catch(e){break}
//this.removeField(P1+"."+P2+"."+P3)
}
if (Menu == 2 && an == P2 && CaR == P1) {
try{
var ts=this.getField(P1+"."+P2+"."+P3).textSize;
var tf=this.getField(P1+"."+P2+"."+P3).textFont;
var rct=this.getField(P1+"."+P2+"."+P3).rect;
var pg=this.getField(P1+"."+P2+"."+P3).page;
var f=this.addField(P1+"."+P2new+"."+P3,"text",pg,rct);
anciensChamps.push(P1+"."+P2+"."+P3);
f.textSize=ts;
f.textFont=tf;
}catch(e){break}
//this.removeField(P1+"."+P2+"."+P3)
//app.alert("Champ retiré : "+P1+"."+P2+"."+P3);
}
}
for (var j=0; j<anciensChamps.length; j++) this.removeField(anciensChamps[j]);
}
Ton script fonctionne correctement, par contre il ne duplique pas toutes les propriétés. Tu devrais plutôt t’inspirer du miens…
Pour ce qui est de ton autre problème ce n’est pas très compliqué, il suffit de créer le nouveau champ juste au dessus de l’ancien et de ne pas l’insérer dans la table des champs à supprimer si son nom est “Q”. J’essayerai de te faire ça demain !
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clés…en gros lorsque tu ajoutes un nouveau champ et que tu effaces l’ancien immédiatement cela modifie la numérotation des champs c’est pourquoi ils ne sont pas tous remplacés.
Alors que si tu rajoutes des champs sans supprimer les anciens immédiatement, la numérotation reste identique avec de nouveaux numéros à la fin. il faut donc créer tous les nouveaux avant de supprimer tous les anciens !Ai-je été compréhensible ???
@+
😎bebarth
Maître des clésbonjour,
J’ai mixé ton script avec le mien répondre rapidement à ton problème.function Renommer_c() {
var anciensChamps=[];
//récuperer les noms de tous les champs
for (var i=0; i<this.numFields; i++) {
var nomChamp=this.getNthFieldName(i);
//déclarer les variables
var aN = this.getField("Name.3.1").value;
var nN = this.getField("Name.3.2").value
var CaR = this.getField("nom_champ").value;
var Menu = this.getField("Menu").value;
//décomposer les noms de champs en 3 parties séparées par les points : P1 ; P2 et P3
var b = nomChamp.split(".");
var P1 = (b[0]);
var P2 = (b[1]);
var P3 = (b[2]);
//Si l'on désire modifier la partie 1 et que la partie 1 correspond à l'entrée saisie dans le champ Name.3.1
if (Menu == 1 && aN == P1) {
//déclarer la variable P1new (nouveau nom pour la partie 1)
var P1new = nN;
anciensChamps.push(P1+"."+P2+"."+P3);
renommerChamp (P1+"."+P2+"."+P3,P1new+"."+P2+"."+P3);
}
//Si l'on désire modifier la partie 2 et que la partie 2 correspond à l'entrée saisie dans le champ Name.3.1 et que la partie 1 correspond à la variable CaR
if (Menu == 2 && aN == P2 && CaR == P1) {
//déclarer la variable P2new (nouveau nom pour la partie 2)
var P2new = nN;
anciensChamps.push(P1+"."+P2+"."+P3);
renommerChamp (P1+"."+P2+"."+P3,P1+"."+P2new+"."+P3);
}
}
for (var j=0; j<anciensChamps.length; j++) this.removeField(anciensChamps[j]);
}
function renommerChamp (leNom,nouveauNom) {
try {
g = this.getField(leNom);
var leType=g.type;
var laPage=String(g.page);
var lesPages=laPage.split(",");
for (var p=0; p<lesPages.length; p++) {
var cettePage=Number(lesPages[p]);
if (lesPages.length>1) {
var nomChamp=leNom+"."+p;
} else {
var nomChamp=leNom;
}
g=this.getField(nomChamp);
var lesCoord=g.rect;
var f = this.addField(nouveauNom, leType, cettePage, lesCoord);
f = this.getField(nouveauNom);
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) {}
}
if (leType=="combobox" || leType=="listbox") {
var liste=new Array();
for (var k=0; k<g.numItems; k++) {
var valeur = g.getItemAt(k,false);
var valeurExport = g.getItemAt(k,true);
if (valeur==valeurExport) valeurExport="";
var element=[valeur,valeurExport];
liste.push(element);
}
f.setItems(liste);
f.currentValueIndices=g.currentValueIndices;
}
if (leType=="button") {
f.buttonSetIcon(g.buttonGetIcon());
f.buttonSetCaption(g.buttonGetCaption());
}
}
} catch(e) {app.alert("\nLe champ \""+leNom+"\"\rn'existe pas dans ce document.")}
}
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésJe n’avais pas pensé à essayer avec mon émulateur… Du coup ça fonctionne bien sur PC.
je me demande si tu ne devrais pas plutôt utiliser l’action souris relâchée
J’avais pensé à la souris appuyée vu que sur un piano la note se joue lorsqu’on appuie sur la touche et non lorsqu’on la relâche.
@+
😎bebarth
Maître des clésbonjour Merlin,
Il me semble que c’est un vieux bug de la version Mac
…comme ça j’aurai plus vite terminé ce que je voulais faire !
@+
😎PS : J’ai pas mis toutes les notes sinon le fichier ne passait pas;
Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
En fait, tout se passe à la création de ton champ image qui te propose un nom avec le suffixe “_af_image”.
Si tu gardes ce nom et que tu le modifies ensuite le suffixe est caché mais bien présent pour une recherche en JavaScript.
Si lors de la création tu modifies le nom en retirant le suffixe, il ne comporte définitivement pas ce suffixe, même en recherche via JavaScript.
C’est peut-être (voir certainement) ce qui t’arrives, et si c’est le cas je ne vois pas comment différencier un bouton d’un champ image en JavaScript !!!@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Voici une solution possible. Ici on ne peut écrire que sous le code sous format désiré (2 chiffres, 1 point, 2 chiffres et 1 lettre) et le nombre d’éléments possibles est indiqué si il est multiple ou nul. S’il n’y en a qu’un, l’élément est directement affiché.
On pourrait également modifier le script pour ne permettre de taper que les codes disponibles… Tu me dis !// script de document
this.getField("codeInput").value="";
this.getField("filteredOptions").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][1].replace(/\s$/,""),colonnes[j][0]];
cellule[0][0]="- "+(cellule.length-1)+" éléments -";
this.getField("filteredOptions").setItems(cellule);
// Script de touches personnalisé
if (!event.willCommit) {
event.change=event.change.toUpperCase();
var aTester=event.value.split("");
aTester.splice(event.selStart,event.selEnd-event.selStart,event.change);
var testeChaine=aTester.join("");
if (testeChaine.length<6) testOK=/^(\d{1,2}([.](\d{1,2})?)?)?$/.test(testeChaine);
else testOK=/^\d{2}[.]\d{2}[a-zA-Z]$/.test(testeChaine);
event.rc=testOK;
if (testOK) {
var lesElements=[];
for (var i=1; i<cellule.length; i++) {
if (cellule[1].indexOf(testeChaine)==0) lesElements.push([cellule[0],cellule[1]]);
}
var nb=lesElements.length;
if (nb!=1) lesElements.unshift("- "+nb+" élément(s) -");
this.getField("filteredOptions").setItems(lesElements);
}
} else {
if (event.value.length<6) testOK=/^(\d{1,2}([.](\d{1,2})?)?)?$/.test(event.value);
else testOK=/^\d{2}[.]\d{2}[a-zA-Z]$/.test(event.value);
event.rc=testOK;
}
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Le type de champ “image” n’existe pas en JavaScript.
https://opensource.adobe.com/dc-acrobat-sdk-docs/library/jsapiref/JS_API_AcroJS.html#id619
Un champ image est un champ de type bouton auquel on ajoute une action permettant d’ajouter ou modifier l’image et dont le nom “réel” est modifié en rajoutant un suffixe “_af_image” (cf. copie d’écran jointe).
On pourrait donc écrire :
if (nomChamp.indexOf("Question")==0 && nomChamp.indexOf("_af_image")>0) this.getField(nomChamp).readonly=true;
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésPeux-tu partager un fichier Excel (au format csv ou txt) ou une partie de ce fichier et m’indiquer les cellules utiles.
@+
😎bebarth
Maître des clésbonjour,
Si les données sont extraites d’un fichier Excel, pourquoi ne pas attacher un fichier au pdf ?@+
😎bebarth
Maître des clésbonjour,
Tu peux retirer les icônes de l’obet icon avec la méthode “removeIcon” : https://opensource.adobe.com/dc-acrobat-sdk-docs/library/jsapiref/doc.html#removeicon
Ci-joint un fichier exemple.@+
😎Attachments:
You must be logged in to view attached files.8 novembre 2024 à 08:57 en réponse à : Identifier la couleur des champs en exportant les données #75140bebarth
Maître des clésbonjour,
Si je peux donner mon avis, l’extraction de toutes les données que propose Acrobat n’est pas toujours la meilleur solution car on récolte les valeurs de tous les champs, même de ceux qu’on n’a pas besoin (cases à cocher, boutons radio,…).
Personnellement j’opterais pour un script qui n’extrait que les valeurs souhaitées et dans ce cas on pourrait extraire directement la couleur des champs que l’on aurait par exemple indiquée en info-bulle lors du changement de couleur. cela permettrait d’avoir un document affiché uniquement avec les désignations (sans le nom de la couleur), puis un fichier texte extrait et récupérable directement sans avoir à le retoucher.@+
😎 -
AuteurRéponses