Toutes mes réponses sur les forums
-
AuteurRéponses
-
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.@+
😎6 novembre 2024 à 21:19 en réponse à : Identifier la couleur des champs en exportant les données #75130bebarth
Maître des clésbonjour
Je peux ajouter une maquette si c’est plus facile à visualiser.
Une maquette serait effectivement la bienvenue.
@+
😎bebarth
Maître des clés…je viens de m’apercevoir que l’expression régulière dans la version unicode->texte ne devrait pas être /(\\u\d{4})/g (pour 4 chiffres), mais /(\\[Uu][0-9A-Fa-f]{4})/g vu qu’en numérotation hexadécimale on a également des lettres (A à F) !!!
Alors pourquoi ça fonctionne en ne recherchant que 4 chiffres ???@+
😎-
Cette réponse a été modifiée le il y a 8 mois et 3 semaines par
bebarth.
bebarth
Maître des clésbonjour,
Personnellement j’utilise Illustrator mais j’imagine que tu ne peux pas…
Lorsqu’on cherche ses équivalents gratuits pour PC on trouve Inkscape en numéro 1. Je ne le connais pas mais si il fonctionne bien il faut continuer à l’utiliser !
https://mailchimp.com/fr/resources/adobe-illustrator-free-alternative/@+
😎bebarth
Maître des clésbonjour,
Comment dire… ?
Sans vouloir douter de tes compétences, c’est TRÈS TRÈS compliqué à faire !
Lorsque je me suis penché sur le problème, j’ai posé quelques question sur le forum Acrobat et je n’ai jamais eu de réponse ! Pas une seule, même de Thom Parker qui apparemment est l’un des seul à s’y connaitre. J’ai d’ailleurs su qu’on pouvait dessiner grâce à son fichier :
https://www.windjack.com/DownLoads/MatrixOperations.pdfComme je n’ai jamais eu réponse j’ai donc creusé ce fichier (pendant plus d’un an) pour essayer de trouver comment ça marche. Le résultat avec Acrobat est un peu décevant par rapport à ce qu’on peut faire en html. Toutes les commandes ne fonctionnent pas avec Acrobat.
De plus, c’est un peu comme avec les expressions régulières, il faut en faire souvent pour ne pas oublier comment ça fonctionne.
Si tu es bon en trigonométrie et que tu t’y connais un peu en courbes de Bezier voici 2 liens qui pourront t’aider :
https://www.w3schools.com/graphics/svg_intro.asp
https://www.w3schools.com/graphics/svg_path.aspJe te joins également 2 fichiers que j’ai fait lors de mon apprentissage. Tu pourras les étudier !!!
En tout cas c’est un sujet qui m’intéresse et à l’occasion je regarderai si je peux faire quelque chose (mais ce ne sera pas tout de suite).
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésJ’ai également écris un petit utilitaire !
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésC’est également ce que je fait !
@+
😎bebarth
Maître des clésbonjour,
Il faut donc utiliser le premier script. Vu qu’on ne traite que les caractères ascii>128 on peut même réduire le script à :
var leTexte="Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d'exquis rôtis de bœuf au kir à l'aÿ d'âge mûr & cætera !";
for (var i=leTexte.length-1; i>=0; i--) {
if (leTexte.charCodeAt(i)>128) var leTexte=leTexte.substr(0,i)+"\\u"+("00"+leTexte.charCodeAt(i).toString(16)).toUpperCase()+leTexte.substr(i+1);
}
console.println("leTexte : "+leTexte);
@+
😎bebarth
Maître des clés…Je ne suis pas certain d’avoir totalement compris !!!
Si en fait tu veux uniquement modifier les caractères accentués, tu peux utiliser ce script dans la console :
var leTexte="Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d'exquis rôtis de bœuf au kir à l'aÿ d'âge mûr & cætera !";
for (var i=leTexte.length-1; i>=0; i--) {
if (leTexte.charCodeAt(i)>128) var leTexte=leTexte.substr(0,i)+"\\u"+("0000"+leTexte.charCodeAt(i).toString(16).toUpperCase()).slice(-4)+leTexte.substr(i+1);
}
console.println("leTexte : "+leTexte);
// Résultat : "D\u00E8s No\u00EBl o\u00F9 un z\u00E9phyr ha\u00EF me v\u00EAt de gla\u00E7ons w\u00FCrmiens je d\u00EEne d'exquis r\u00F4tis de b\u0153uf au kir \u00E0 l'a\u00FF d'\u00E2ge m\u00FBr & c\u00E6tera !"
…et à l’inverse, pour récupérer un texte :
var leTexte="D\u00E8s No\u00EBl o\u00F9 un z\u00E9phyr ha\u00EF me v\u00EAt de gla\u00E7ons w\u00FCrmiens je d\u00EEne d'exquis r\u00F4tis de b\u0153uf au kir \u00E0 l'a\u00FF d'\u00E2ge m\u00FBr & c\u00E6tera !";
leTexte.replace(/(\\u\d{4})/g,parseInt("$1",16));
console.println("leTexte : "+leTexte);
// Résultat : "Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d'exquis rôtis de bœuf au kir à l'aÿ d'âge mûr & cætera !"
@+
😎bebarth
Maître des clésbebarth
Maître des clésbonjour,
Pour connaitre l’erreur, il faut dans un premier temps savoir d’où elle vient.
Vu que tous tes scripts sont des fonctions lancées depuis un bouton, le plus simple est de les tester une par une, et on s’aperçoit que ça plante dès la première fonction « Default() ».
Ensuite, il faut savoir quelle ligne n’est pas correcte, et vu que toutes les lignes font référence à des propriétés de champs, c’est certainement qu’une de ces propriétés n’est pas adaptée au champ concerné.
J’ai donc rajouté une ligne en début de boucle qui permet de voir sur quel champ ça cloche :
for (var i=0; i<this.numFields; i++) {
var nomChamp=this.getNthFieldName(i);
console.println(i+" - nomChamp : "+nomChamp+" - "+(this.getField(nomChamp).page+1)+" - "+this.getField(nomChamp).type);
...
Et on s’aperçoit que c’est sur un champ liste (combobox)…
Effectivement, si tu as une liste où aucun élément n’est sélectionné à l’origine, il n’a pas de valeur par défaut. Ici tu as donc 2 solutions : soit tu sélectionnes le point d’interrogation qui devient ta valeur par défaut ou en dernière ligne tu exclus que ce soit un champ de type « combobox » :
if (this.getField(nomChamp).type!="combobox")
this.getField(nomChamp).defaultValue=this.getField(nomChamp).value;
@+
😎bebarth
Maître des clésAvec la méthode “bouton”, le champ devient bien cliquable, mais il ouvre une fenêtre de navigateur en remplissant 2 fois l’url à la suite, comme s’il prenait en compte le bouton + le champ placé dessous… du coup on arrive sur une 400.
En es-tu certain ?
Avec l’exemple joint ça fonctionne bien chez moi… Dis-moi si il fonctionne chez toi !@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésA ce moment là il ne faut pas que le champ soit en lecture seule…
@+
😎bebarth
Maître des clésbonjour,
Pour trouver l’erreur :- Tu lances tes fonctions une à une.
- Tu t’aperçois que dès la première fonction Default() ça se plante… en ligne 17
if (nomChamp.indexOf("Menu.")==0) {this.getField(nomChamp).defaultValue="";}
- Il y a des champs « Menu. » qui sont des champs texte et d’autre des menus déroulants dont la valeur par défaut n’est pas vide. C’est pour cela que ça plante.
- Il faut donc vérifier le type de champ.
@+
😎bebarth
Maître des clésbonjour,
Je pense que le plus simple est de superposer à ton champ un bouton avec un script d’action souris relâchée :
if (this.getField("contactchoix").value!="" && this.getField("contactchoix").value!="undefined") app.launchURL("http://www."+this.getField("contactchoix").value,true);
Après,
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Vous êtes gentils… Je doute qu’outre Atlantique on me considère comme sorti des Mille et une nuits !Je ne suis pas certain d’avoir été très clair la dernière fois, mais généralement lorsque j’ai quelque chose dans la tête je ne l’ai pas au… tre part !
Lorsque on veut sélectionner plusieurs éléments dans une liste, on doit appuyer sur la touche ctrl sur PC et opt ou cmd sur Mac. Donc si on appuie pas sur une de ces touches, cela signifie que l’on désélectionne tous les éléments précédents !
Je viens de me rappeler que event.modifier contrôle justement si on appuyait sur la touche. J’ai donc pu terminer cette première version.
On a donc un script champ activé :
var indices=event.target.currentValueIndices;
if (indices==-1) {
var liste=[];
} else {
if (typeof indices=="number") var liste=[event.target.getItemAt(indices, false)];
else {
var liste=[];
for (var i=0; i<indices.length; i++) liste.push(event.target.getItemAt(indices, false))
}
}
Puis un script « Changement de sélection » :
if (!event.willCommit) {
if (!event.modifier) {
if (event.value==event.changeEx) {
this.getField("choix2").value="";
this.getField("pop2").clearItems();
var liste=[];
} else {
this.getField("choix2").value=event.changeEx;
this.getField("pop2").setItems([event.changeEx]);
var liste=[event.changeEx];
}
} else {
liste.push(event.changeEx);
for (var i=0; i<liste.length-1; i++) {
if (liste==event.changeEx) {
liste.splice(i,1);
liste.pop();
break;
}
}
liste.sort(function(a, b){return a.localeCompare(b)});
this.getField("choix2").value=liste.toString().replace(/,/g,"\r");
this.getField("pop2").setItems(liste);
}
}
Sauf que l’api reference indique « The modifier key on the Microsoft Windows platform is Control and on the Mac OS platform is Option or Command » et apparemment la touche option fonctionne sur Mac. Je suis donc obligé d’appuyer simultanément sur option et commande pour que ça fonctionne.
Pourriez-vous me dire si ça marche sur PC avec la touche ctrl !@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
J’y était presque… mais je n’avais pas d’ordinateur hier soir pour vérifier. En fait c’est :
var RegExTest=new RegExp("^"+rep[k].replace(/([(){}\[\]])/g,"\\$1")+"$");
Un double antislash pour indiquer qu’on veut le caractère \ et $1 pour récupérer le caractère capturé dans l’expression entre parenthèses (un des caractères entre crochets où les crochets sont eux-mêmes échappés pour indiquer qu’on parle des caractères…). C’est simple, non ?@+
😎-
Cette réponse a été modifiée le il y a 9 mois et 1 semaine par
bebarth.
Attachments:
You must be logged in to view attached files.bebarth
Maître des clésC’est ce que devrait faire la ligne que j’ai modifiée.
@+
😎bebarth
Maître des clésbonjour,
Essaye :
…
var RegExTest=new RegExp("^"+rep[k].replace(/[(){}\[\]]/g,"\$")+"$");
…
Je ne peux pas vérifier ce soir… Tu me dis !
@+
😎bebarth
Maître des clésbonjour Jean-Claude,
J’ai à peu près le même process que toi.
Au début, comme je te l’avais dis, j’étais parti pour exécuter un uniquement script à partir du champ liste, mais ça ne fonctionnait qu’à moitié. Lorsqu’on ajoutait ou supprimait un élément à la fois ça marchait mais si on avait déjà sélectionné plusieurs éléments et que d’un seul coup on n’en sélectionnait plus qu’un seul, ça ne marchait plus. En fait, event.value ne change pas lorsque change de focus, mais si on revient au champ liste et comme event.changeEx est le nouvel élément sélectionné, ça ne marchait pas !!!
Tout ça pour dire que j’en suis revenu également à 2 scripts.
Le script déclencheur en « Changement de sélection » uniquement pour changer de focus et donc lancer le cacul :
if (!event.willCommit) this.getField("choix2").setFocus();
Et un script de calcul :
var indices=this.getField("zone2").currentValueIndices;
if (indices==-1) {
event.value="";
this.getField("pop2").clearItems();
} else {
if (typeof indices=="number") {
event.value=this.getField("zone2").getItemAt(indices, false);
this.getField("pop2").setItems([this.getField("zone2").getItemAt(indices, false)]);
} else {
var liste=[];
for (var i=0; i<indices.length; i++) liste.push(this.getField("zone2").getItemAt(indices, false));
event.value=liste.toString().replace(/,/g,"\r");
this.getField("pop2").setItems(liste);
}
}
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Je n’ai pas d’erreur lorsque je clique sur « Vérifier » de ton document !@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésJe suis complètement débordé avec tout le TAF urgent à terminé!
Ne m’en parle pas !!! Tu verras quand tu seras à la retraite :-)… même pas le temps de procrastiner un peu !
@+
😎bebarth
Maître des clésbonjour,
Si tu veux que ça fonctionne dynamiquement, il faut utiliser « event.changeEx » en script de « Changement de sélection ». Je pense qu’il faut également utiliser un « calculateNow() » car il n’est pas possible de « Valider la valeur sélectionnée immédiatement » avec une « Sélection multiple ».
J’ai une petite idée mais je ne peux l’essayer en ce moment. Je regarderai ce weekend si tu n’y arrives pas…@+
😎bebarth
Maître des clésbonjour,
Il faut bien retirer le *100 mais il faut aussi modifier le format du champ en « pourcentage ».@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Il est vrai qu’il n’est pas utile de pivoter les pages avant de les imprimer, mais pour toute autre raison il est quand même possible de le faire via un script.
Pour une page au format paysage d’un document (et idem pour les pages au format portrait), il y a 2 possibilités : soit elle a été créée dans ce format, ou elle a été créée au format portrait puis pivotée en format paysage. D’où la nécessité de regarder « getPageRotation ». Si ce résultat est 0 c’est que la page a été créée au format paysage, sinon elle a déjà été pivoté. L’instruction « setPageRotations » pivote la page par rapport à la position originale.
Voici donc un script pour pivoter les pages du format paysage au format portrait :
for (var p=0; p<this.numPages; p++) {
var dimPage=this.getPageBox("Crop",p);
if ((dimPage[2]-dimPage[0])>(dimPage[1]-dimPage[3])) {
if (this.getPageRotation(p)!=0) this.setPageRotations(p,p,0);
else this.setPageRotations(p,p,90);
}
}
Par contre, on ne peut vérifier si la position originale est à l’envers (haut en bas)…
@+
😎bebarth
Maître des clés… après on peut aussi ajouter un répertoire sur le bureau !
@+
😎bebarth
Maître des clésbonjour,
Si le pdf original est sur le même disque on peut en déduire le chemin du bureau
On peut par exemple utiliser ce script pour enregistrer sur le bureau utilisateur :
var ceChemin=this.path.split("/");
var cheminSurBureau="";
for (var j=1; j<=3; j++) cheminSurBureau+="/"+ceChemin[j];
cheminSurBureau+="/Desktop/"+ceChemin[ceChemin.length-1];
this.saveAs({
cPath: cheminSurBureau,
bPromptToOverwrite: true // au cas où !!!
})
Ça devrait fonctionner sur Mac et PC, sous unix je ne connais pas la syntaxe des chemins !
@+
😎-
Cette réponse a été modifiée le il y a 9 mois et 1 semaine par
bebarth.
bebarth
Maître des clésSi le pdf original est sur le même disque on peut en déduire le chemin du bureau, mais attention ils sont différents selon l’OS !
@+
😎bebarth
Maître des clésExact !
bebarth
Maître des clésbonjour,
On ne peut pas afficher la fenêtre de l’interface utilisateur, mais avant enregistrement on pourrait indiquer le chemin dans un champ ou une boite de dialogue !
Par contre il y aura une erreur si le chemin n’est pas indiqué correctement.@+
😎bebarth
Maître des clésAs-tu essayé mon fichier ???
Essaye de mettre un try… catch !@+
😎bebarth
Maître des clésbonjour,
Une seule fonction en script de document :
function random (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);
}
…et un script pour appeler cette fonction :
for (var i=1; i<=30; i++) {
try {
random (i);
} catch(e) {
this.getField("Var."+i+".3").value="";
}
}
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésTu écris :
function variables () {
eval("var "+this.getField("Var.2.0").value+"="+this.getField("Var.2.3").value);
eval("var "+this.getField("Var.1.0").value+"="+this.getField("Var.1.3").value);
app.alert("Valeur de la variable E : "+E+" ; Valeur de la variable F : "+F);
}
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Oui, il faut utiliser la méthode « eval ».
Pour un chiffre :
eval("var "+this.getField("nomChamp").value+"=5;");
ou chaîne de caractères :
eval("var "+this.getField("nomChamp").value+"=\"la chaîne de caractères\";");
Mais attention, il faut respecter la règle de nomination des variables… donc pas de caractères spéciaux et ne pas commencer par un chiffre !@+
😎bebarth
Maître des clésbonjour,
Il faut écrire :
event.value=(this.getField("Texte36").value-this.getField("Texte37").value)/this.getField("Texte37").value*100;
Mais il faut modifier le format des champs en « Nombre » avec indicateur de la monnaie.@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
J’ai réussi à solutionner mon problème.
Si d’autres ont le même problème ils se débrouilleront ???
@+
😎bebarth
Maître des clésbonjour,
J’ai modifié un peu le script car certaines fois le chiffre était inférieur au mini…
function getRandomIntInclusive(min,max,dec) {
return Math.round((Math.random()*(max-min)+min)*Math.pow(10,dec))/Math.pow(10,dec);
}
for (var i=1; i<=4; i++) {
this.getField("Var."+i+".3").value=getRandomIntInclusive(this.getField("Var."+i+".1").value,this.getField("Var."+i+".2").value,this.getField("Dec."+i).value);
}
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésL’avantage de mettre une fonction en script de document c’est de pouvoir l’appeler à partir de plusieurs autres scripts.
Si elle n’est utilisée qu’avec un script, autant l’intégrer, et pas forcément depuis un bouton…
@+
😎bebarth
Maître des clésbonjour,
Donc le event.rc = false; n’est pas nécessaire également?
Si, quand même ! Il faut bien pouvoir invalider la réponse, et donc conserver l’ancienne valeur. Tu doit par exemple entrer une valeur supérieure à 5. Admettons que l’ancienne valeur était 10, donc correcte et que tu entres un 3.
Si tu écris ce scrpt :
if (event.value>5) {
app.alert("Valeur correcte",3);
} else {
app.alert("Valeur incorrect",3);
}
Tu auras le message « Valeur incorrecte », mais la valeur indiquée dans ton champ sera 3, alors que si tu écris :
if (event.value>5) {
app.alert("Valeur correcte",3);
} else {
event.rc=false;
app.alert("Valeur incorrect",3);
}
Tu auras le même message « Valeur incorrecte », mais la valeur restera la précédente (donc 10).@+
😎bebarth
Maître des clésbonjour,
event.rc = true;
Juste pour info, ce n’est pas la peine d’indiquer
event.rc = true;
car c’est l’état par défaut de la validation si on indique pasevent.rc = false;
.
Ça fait une ligne de moins…@+
😎bebarth
Maître des clésPartage ton fichier si cela t’est possible.
@+
😎bebarth
Maître des clésLa syntaxe est différente, mais le principe est le même !
@+
😎bebarth
Maître des clésbonjour,
J’avais déjà répondu à une demande similaire :
Voici donc une adaptation :
function getRandomIntInclusive(min,max) {
return (Math.random()*(max-min+1)+min-1).toFixed(this.getField("Dec."+i).value);
}
for (var i=1; i<=4; i++) {
this.getField("Var."+i+".3").value=getRandomIntInclusive(this.getField("Var."+i+".1").value,this.getField("Var."+i+".2").value);
}
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésQu’est-ce qui ne fonctionne pas ?
Y a-t-il un message dans la console ?
Si tu ne veux pas ces informations, il faut retirer des lignes du script, ce qui donne :
var jour=["Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi"]
if (event.value!="") {
var d=util.scand("dd/mm/yyyy",event.value); // valeur donnée à minuit pile
var laDate=d.getTime()+24*3600*1000;
var aujourdhui=util.scand("dd/mm/yyyy", new Date()).getTime();
if (laDate<aujourdhui) {
app.alert("Veuillez indiquer une date postérieure ou égale à celle d'aujourd'hui.\rou\rVeuillez indiquer une date qui n'est pas antérieure à celle d'aujourd'hui.",3);
event.rc=false;
} else {
var jCommande=jour[d.getDay()];
if (d.getDay()==1) var nbJours=4;
else if (d.getDay()==2) var nbJours=6;
else var nbJours=5;
var dateLivraison=laDate+((nbJours-1)*24*3600*1000); // ...comme on a modifié "laDate"
this.getField("DateLimite").value=new Date(dateLivraison);
var jLivraison=jour[new Date(dateLivraison).getDay()];
}
} else {
this.getField("DateLimite").value="";
}
@+
😎bebarth
Maître des clésbonjour,
chacun propose son idée et ensuite il faut faire la part des choses.
Voici donc ma version avec écriture directe lors de la frappe des chiffres (uniquement si >5).
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Oups, j’avais mal lu…Donc, < et non pas >
Ça ne suffit pas dans ce sens là ! Sans indications supplémentaires la valeur de « laDate » est indiquée à minuit pile. Alors que la valeur de « aujourdhui » est indiquée à ‘instant « t ». À moins que l’on remplisse le champ à 0:00 au millième de seconde près, ce qui est peu probable… si « aujourdhui » est aujourd’hui, la valeur « laDate » est toujours inférieure à la valeur « aujourdhui ». 🙂
Le script est donc à modifier comme suit :
var jour=["Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi"]
if (event.value!="") {
var d=util.scand("dd/mm/yyyy",event.value); // valeur donnée à minuit pile
var laDate=d.getTime()+24*3600*1000;
var aujourdhui=util.scand("dd/mm/yyyy", new Date()).getTime();
if (laDate<aujourdhui) {
app.alert("Veuillez indiquer une date postérieure ou égale à celle d'aujourd'hui.\rou\rVeuillez indiquer une date qui n'est pas antérieure à celle d'aujourd'hui.",3);
event.rc=false;
} else {
var jCommande=jour[d.getDay()];
this.getField("jourCommande").value=jCommande;
if (d.getDay()==1) var nbJours=4;
else if (d.getDay()==2) var nbJours=6;
else var nbJours=5;
var dateLivraison=laDate+((nbJours-1)*24*3600*1000); // ...comme on a modifié "laDate"
this.getField("DateLimite").value=new Date(dateLivraison);
var jLivraison=jour[new Date(dateLivraison).getDay()];
this.getField("jourLivraison").value=jLivraison;
}
} else {
this.getField("jourCommande").value="";
this.getField("DateLimite").value="";
this.getField("jourLivraison").value="";
}
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
En scripr de validation de ton champ date :
var jour=["Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi"]
if (event.value!="") {
var d=util.scand("dd/mm/yyyy",event.value);
var laDate=d.getTime();
var aujourdhui=util.scand("dd/mm/yyyy", new Date()).getTime();
if (laDate>aujourdhui) {
app.alert("Veuillez indiquer une date antérieure à aujourd'hui.",3);
event.rc=false;
} else {
var jCommande=jour[d.getDay()];
this.getField("jourCommande").value=jCommande;
if (d.getDay()==1) var nbJours=4;
else if (d.getDay()==2) var nbJours=6;
else var nbJours=5;
var dateLivraison=laDate+(nbJours*24*3600*1000);
this.getField("DateLimite").value=new Date(dateLivraison);
var jLivraison=jour[new Date(dateLivraison).getDay()];
this.getField("jourLivraison").value=jLivraison;
}
}
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clés18 septembre 2024 à 18:14 en réponse à : Formulaire Devis – Afficher un tarif selon choix liste déroulante #74876bebarth
Maître des clésbonjour,
Des listes mères/filles supposent qu’il y a plusieurs menus déroulants dans un fichier alors que dans le tien je n’en voit qu’un…
Je suppose que tu a extrais ton script du fichier ci-joint.
Regarde en script de document, l’objet « elementsListes » définit les différentes valeurs suivant le choix du premier menu déroulant.
Il faut que tu fasses la même chose pour ton document.@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Seconde difficulté : la conversion des chiffres en lettres fonctionne très bien, mais y’a-t-il un moyen pour que, dès que le champ « montant en chiffres » est rempli, le champ « montant en lettres » se remplisse simultanément, sans avoir à cliquer dans le champ « montant en chiffres » ? J’ai inséré le script en « champ activé », en vain…
Le sujet a déjà été traité dans un autre post : https://www.abracadabrapdf.net/forums/topic/remplacer-valeur-numerique-en-lettre/#post-72771
Voici un fichier qui reprend le script principal, et ci-dessous les scripts que j’ai ajouté :
// Script de touches personnalisé champ nombre
if (!event.willCommit) {
if (event.selStart==0 && event.change==",") event.change="0,";
if (event.selStart==0 && event.change=="0") event.change="0,";
var aTester=event.value.split("");
aTester.splice(event.selStart,event.selEnd-event.selStart,event.change);
var testeChaine=aTester.join("");
if (/^([1-9]\d*(\,\d{0,2})?)?$/.test(testeChaine)) this.getField("SaisieSomme").value=Number(testeChaine.replace(/,/,"."))*1000;
else event.rc=false;
} else {
if (event.value=="" || /^([1-9]\d*(\,\d{0,2})?)$/.test(event.value)) this.getField("SaisieSomme").value=Number(event.value.replace(/,/,"."))*1000;
else event.rc=false;
}
// Script de calcul champ SaisieSomme
if (event.value>5000) {
ecriture(event.value);
this.getField("droit2").value=this.getField("SaisieSomme").value*Number(this.getField("tauxpersonnalise").value.replace(",","."))/100;
this.getField("totalperso").value=this.getField("SaisieSomme").value+this.getField("droit2").value;
} else {
this.getField("TexteSomme").value="";
this.getField("droit2").value="";
this.getField("totalperso").value="";
}
// Script de format personnalisé champ SaisieSomme
if (event.value<=5000) event.value="";
else event.value=event.value+" €";
Je te laisse retirer les étoiles si tu ne les veux pas…
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
je ne sais pas s’il y a eu d’autres versions depuis.
Il y a une version Suisse & Belgique…
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
J’ai essayer en ajout ceci suggérer par Thom Parker mais cela ne fonctionne pas. var strPrefix = event.targetName.split(« . »).splice(0,2).join(« . »); this.resetForm(strPrefix);
Ça fonctionne si ce script est sur la page des champs à réinitialiser, mais pour ton exemple, le bouton ne l’est pas.
Vu que la syntaxe des préfixes est toujours la même et que tu ajoutes la page dupliquée en fin de document, tu peux écrire :
this.getTemplate("page").spawn(this.numPages, true, false);
var t=this.templates;
var strPrefix="P"+(this.numPages-1)+"."+t[0].name;
// ou directement var strPrefix="P"+(this.numPages-1)+".page";
this.resetForm(strPrefix);
this.removeField(strPrefix+"."+event.target.name);
Ici j’ai supprimé le bouton sur la page dupliquée.
@+
😎P.S. : Dans le script de Thom, « event.targetName » est mal écrit. Ça devrait être « event.target.name » !
-
Cette réponse a été modifiée le il y a 10 mois par
bebarth.
Attachments:
You must be logged in to view attached files.bebarth
Maître des clésAprès avoir cherché un certain temps, je me suis aperçu que :
Lorsque l’on crée une case à cocher sur Acrobat, sa valeur par défaut est « Off » (décochée).
Apparemment, avec ton logiciel, sa valeur par défaut lors de sa création est « undefined » (décochée), et lorsqu’on la coche puis décoche sa valeur est « Off ».Pour que ça fonctionne sans modifier le script, il faut donc cocher/décocher toutes les cases à cocher avant de les utiliser (idem pour les boutons radio je suppose), ou lancer ce script :
for (var i=0; i<this.numFields; i++) {
var nomChamp=this.getNthFieldName(i);
if ((this.getField(nomChamp).type=="checkbox" || this.getField(nomChamp).type=="radiobutton") && this.getField(nomChamp).value=="undefined") this.getField(nomChamp).value="Off";
}
Pour info, ça ne fonctionnait pas non plus dans le premier fichier que tu as partagé…
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Il faut vérifier toutes les réponses possibles séparées par « | » :
...
this.getField("Q."+n+"."+a).readonly=true;
// BB
var rep=this.getField("R."+n+"."+a).valueAsString.split("|");
var OK=0;
for (var k=0; k<rep.length; k++) {
var RegExTest=new RegExp("^"+rep[k]+"$");
if (RegExTest.test(this.getField("Q."+n+"."+a).value)) OK++;
}
if (OK) {this.getField("Q."+n+"."+a).fillColor=eval("color."+colorOk);}
else {this.getField("Q."+n+"."+a).fillColor=eval("color."+colorErr);erreurs++;this.getField("Erreurs").value++;}
// BB
if (!erreurs) {
...
@+
😎Attachments:
You must be logged in to view attached files.6 septembre 2024 à 17:31 en réponse à : Remplir les champs d’une 2e liste déroulante dynamiquement #74820bebarth
Maître des clésbonjour,
Ce sont des listes mères-filles… le plus simple est de chercher « mère fille » sur le forum et tu devrais trouver des réponses.
https://www.abracadabrapdf.net/forums/search/m%C3%A8re+fille/@+
😎bebarth
Maître des clésje n’avais jamais vu le point d’exclamation placé avant…
Si, certainement… « == » signifie « est égale à » alors que « != » signifie « est différent de« . Le point d’exclamation (!) exprime l’inverse.
Doncif (!this.getField("meca"))
signifie s’il n’y a pas de champ nommé « meca ».À noter que « == » est le signe d’égalité faible qui ne tient compte que de la valeur (donc
0=="0"
, le chiffre 0 est égal au caractère « 0 » et idem pour0==null
) alors que « === » est le signe d’égalité stricte qui tient compte que de la valeur et du type, d’où0!=="0"
et0!==null
.@+
😎bebarth
Maître des clésbonjour,
…ouif (!this.getField("meca")) {...
, ça fonctionne aussi !@+
😎3 septembre 2024 à 12:43 en réponse à : Mr ou Mme qui s’inscrit avec bouton radio ou case à cocher #74803bebarth
Maître des clésbonjour,
Tu peux écrire :
if (event.target.value!="Off") this.getField("Texte1").value=event.target.value+" "+this.getField("Texte1").value.replace(/^(M.\s)|(Mᵐᵉ\s)/,"");
else this.getField("Texte1").value=this.getField("Texte1").value.replace(/^(M.\s)|(Mᵐᵉ\s)/,"");
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Toujours le même problème d’affichage d’un « i » entre crochets sur le forum… On peut le remplacer l’indice par un « j » et ça devrait beaucoup mieux marcher :
var aTousLesModeles=this.templates;
for (j=0; j<aTousLesModeles.length; j++) {
aTousLesModeles[j].hidden=false; // true ou false
var leNom=aTousLesModeles[j].name;
var ind=leNom.substr(leNom.length-1);
var nm=leNom.substr(0,leNom.length-1);
this.setPageLabels(this.numPages-1, ["D",leNom.substr(0,leNom.length-1),ind-1]);
}
P.S. : Je ne me souviens pas ce qu’elle fait là, mais la variable nm en ligne 6 ne sert à rien ici…
@+
😎-
Cette réponse a été modifiée le il y a 10 mois et 2 semaines par
bebarth.
bebarth
Maître des clésbonjour,
Si ce calcul est correct, il faudra le multiplier par 180/π pour l’avoir en degrés…
Mais il n’est pas correct, et le calcul n’est pas une notation simplifiée du champ « tangresultatab ».
Pour trouver la tangente, il faut écrire en script de calcul :
event.value=Math.tan(this.getField("Resultab").value*Math.PI/180);
On utilise « Math.tan2 » pour trouver la tangente lorsque l’on a les coordonnées d’un point et non un angle !
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
event.value=Math.atan2(this.getField(“Resultab”).value);
Attention, les calculs trigonométriques utilisent le radian comme unité. Si ce calcul est correct, il faudra le multiplier par 180/π pour l’avoir en degrés…
@+
😎bebarth
Maître des clésbonjour,
Je pense avoir réussi. Il y avait sûrement plus simple avec une autre numérotation des champs mais je ne voulais pas me refaire tous les calculs… Le script est long mais ça a l’air de marcher. Enfin ça fonctionne si il y a 10 caissons….Il va falloir que je trouve un truc s’il y a moins de 10 caissons…
Si je peux me permettre, j’aurais quelques recommandations à te donner avant de te lancer dans des calculs, surtout lorsqu’il y a autant de champs… et malheureusement, lorsqu’on « commence » à programmer (durant quelques années), on doit souvent recommencer la nomination des champs, même si c’est un travail fastidieux…
Je croyais avoir compris que les quantités de formats identiques s’ajoutaient ! Ça n’a pas l’air d’être le cas dans ton tableau.
@+
😎bebarth
Maître des clésbonsoir,
Je ne comprends pas bien ce qu’il faut indiquer dans les colonnes 1 et 2…
Ce qui va compliquer c’est qu’il n’y a pas de logique de numérotation pour les champs « essence » et « Ep » ! Il aurait été plus simple qu’il y en ait une en fonction de l’indice des champs…@+
😎bebarth
Maître des clésbonjour,
Tu pourrais placer en script de format de tous les champs « Caiss » et « Tiroir » :
if (/(××)|(0×)|(NaN)/.test(event.value)) event.value="–";
Pour éviter de modifier tous ces champs manuellement, tu peux lancer ce script :
for (var i=0; i<this.numFields; i++) {
if (/^(Tiroir)|(Caiss)[.]\d[.]\d$/.test(this.getNthFieldName(i))) {
this.getField(this.getNthFieldName(i)).setAction("Format","if (/(××)|(0×)|(NaN)/.test(event.value)) event.value=\"–\";");
}
}
@+
😎-
Cette réponse a été modifiée le il y a 10 mois et 4 semaines par
bebarth.
Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Après une première lecture rapide je remarque qu’il y a 2 fois la fonction « Calc() » en lignes 1 et 71.
Je n’ai pas vérifié si elles sont exactement identiques, mais peut-être que la seconde qui annule la première ne permet pas l’exécution de certains calculs…@+
😎bebarth
Maître des clésbonjour,
Si on veut gagner quelques lignes de script on peut écrire :
var OK=true;
for (var i=1; i<=7; i++) var OK=OK && this.getField("Groupe "+i).value!="Off";
if (OK) {
// script
} else event.value="";
Mais là, j’avoue,je chipote…
@+
😎bebarth
Maître des clésbonjour,
Si ça t’intéresse, bebarth m’avait écrit un script qui “démasque” les modèles masqués en conservant leurs noms de modèle dans le panneau des pages, au lieu d’avoir page 1, page 2, etc. C’est très pratique quand il y en a beaucoup. Avec son autorisation (dont je doute pas) je pourrais te l’envoyer, ou le poster céans.
@Merlin : Tu peux partager car de tête je ne me souviens pas et je ne serai de retour qu’à la fin du mois pour le plonger dans mes archives…@+
😎bebarth
Maître des clésDésolé je suis dans le cap corse sans pratiquement aucun réseau…
@+
Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Si tu regardes la 3e colonne de la Quick bar, le S indique les niveaux de privilèges où tu peux exécuter cette méthode et on ne trouve pas le niveau Sript de document.
Par contre, si tu étends les privilèges tu devrais pouvoir te créer un menu qui te permette d’exécuter ce script.
Essaye et dis-moi/nous.
@+
bebarth
Maître des clésAh, l’Ardèche, ses gorges et jardins suspendus…
😎
bebarth
Maître des clésbonjour,
Bonjour, est-ce que vous avez remarqué dernièrement que les caractères avec accents ne sont plus interprétés correctement même si on utilise leurs valeurs Unicode ? Ex: \u00E9 pour «é».
Est-ce que cela signifie que ça a déjà fonctionné un jour ???
A ce que je me souvienne, depuis que j’ai commencé à écrire des utilitaires exécutables depuis un menu ça na jamais fonctionné…
Pour mon premier utilitaire j’avais même abrégé « Proppriétés » par « Prop. », mais maintenant j’essaie de trouver des mots sans caractères accentués ou je mets des « e » à la places des « é » !@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Je n’avais pas vu la vidéo ! Si on la regarde, on peut comprendre que l’opération effectuée n’est pas celle indiquée sur la copie d’écran, mais : coef = déport ÷ sin(22,5) ÷ déport
Et là on remarque vite que déport ÷ déport = 1… donc coef = 1/sin(angle) quel que soit le cet angle qui est fonction du déport.
On peut donc écrire :
event.value=1/Math.sin(this.getField("angle").value*Math.PI/180);
Ici on transforme les angles en « radian » qui est l’unité trigonométrique utilisée en JavaScript.@+
😎PS : les vacances sont pour la fin de semaine, mais j’ai (encore) des soucis avec mes e-mails et je ne reçois pas les notifications ni de ce forum, ni de celui d’adobe…
-
Cette réponse a été modifiée le il y a 11 mois et 3 semaines par
bebarth.
Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Comment un sinus compris entre -1 et +1 divisé par 500 peut-il être égale à 2,613 ???
De plus, 541,196/500 ne fait jamais 2,6 mais 1 et des brouettes…
Il doit y avoir une erreur de formule !@+
😎bebarth
Maître des clésIl faudrait demander à Thom Parker, ou chercher sur son site, si quelqu’un connaît la réponse c’est lui.
Tu nous donneras sa réponse…
@+
😎bebarth
Maître des clésbonjour,
Non ce n’est pas possible !
@+
😎bebarth
Maître des clésbonjour,
Oups ! Je suppose que tout le monde aura rectifié de lui-même ce dysfonctionnement… on ne peut pas penser à tout. 😉
Pour ma part, j’ai donc modifié les expressions régulières en ligne 124 qui servent à supprimer/rectifier certains caractères inutiles (pour éviter d’avoir des lignes vierges ou des espaces multiples par exemple). Dans la théorie, on a pas besoin de ça si l’on fait attention à ce qu’on frappe…
La nouvelle ligne est :
lesElements=oRslt["elem"].replace(/[ ]{2,}/g," ").replace(/^\s+|\s+$/g,"").replace(/[^\S ]+/g,"\r").replace(/\s{3,}/g,"\r");
Explications sur demande…
J’espère avoir pensé à tout ce coup ci !@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
En script de format personnalisé tu peux écrire :
if (event.value==1) event.value="Growth";
else if (event.value==2) event.value="Diversified";
else if (event.value==3) event.value="Growth or Diversified";
// etc.
else event.value="";
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésEn fait, dans ton fichier précédent, les champs à double indices n’étaient que des menus déroulants alors que dans celui-ci il y a tous types de champs.
J’ai donc modifié le script pour qu’il ne tienne compte que des menus déroulants (2 fois : en lignes 9 et 88) :
if (OK && this.getField(nomChamp).type=="combobox") {
Ce qui entraine une modification en ligne 195 que je n’écris pas ici car elle comporte un « i » entre crochets, mais je fais une copie d’écran !@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Je partage (pratiquement) toujours un fichier lorsque je fournis un script et il vaut mieux utiliser le script du fichier plutôt que celui affiché sur le post.
J’avais remarqué qu’il y a un problème d’affichage lorsqu’on indique un « i » entre crochets (disparait à l’affichage, doit être interprété comme une balise).
En tout cas, j’utilise souvent ce » i » entre crochets lorsque j’écris un script et des fois je pense à le modifier avant de partager ce script et d’autres fois je n’y pense pas…
Dans ce script, il y a effectivement plusieurs fois ce « i » entre crochets et si tu as utilisé celui affiché sur le post de réponse, je pense que l’erreur doit venir de là !!!
Essaye donc avec celui fourni dans le fichier et (normalement) ça devrait beaucoup mieux fonctionner…@+
😎-
Cette réponse a été modifiée le il y a 1 année par
bebarth.
Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Fonctionne correctement avec PDF-XChange pour moi alors que j’ai un message d’erreur avec ton dernier fichier !@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Il n’y avait pas d’erreur chez moi, et par contre ton fichier ne fonctionne pas (chez moi également) !@+
😎bebarth
Maître des clésbonjour,
Voici ma proposition que je partage maintenant, avant d’être de mauvaise humeur… (ce que je n’espère pas, évidemment !).
Tu me dis si je n’ai pas tout compris.
C’est la première fois que je fais une boite de dialogue à éléments variables. Ce n’est pas ce qu’il y a de plus simple, mais lorsqu’on a compris comment fonctionnent les boites de dialogue, ça se fait… et voici le script pour ton fichier :
nbChamps=this.numFields;
if (nbChamps) {
var leChamp="- Liste des champs -";
var listeChamps="var listeChamps \= \{\""+leChamp+"\": "+(nbChamps+1)+",";
for (var i=0; i < nbChamps; i++) {
var nomChamp=this.getNthFieldName(i);
var RegExTest=new RegExp("^(\\w\\.\\d+)\\.(\\d+)$");
var OK=nomChamp.match(RegExTest);
if (OK) {
listeChamps+="\""+OK[1]+"\": "+(-1*(i+1)).toString()+",";
}
}
var listeChamps=listeChamps.substring(0, listeChamps.length-1);
listeChamps+="\}";
eval(listeChamps);
var bDialogue={
initialize: function(bDialogue) {
this.loadDefaults(bDialogue);
},
loadDefaults: function(bDialogue) {
bDialogue.load({
LCha: listeChamps,
})
},
validate: function(bDialogue) {
var oRslt=bDialogue.store();
var elements=bDialogue.store()["LCha"];
var testOK=true;
for (var i in elements) {
if (elements>0) {
valeurListe=listeChamps;
nomListe=i;
}
}
if (valeurListe>0) var testOK=false;
if (!testOK) app.alert("Veuillez sélectionner un nom de champ.",3);
return testOK;
},
description: {
name: "Générer des menus déroulants",
elements: [
{
type: "view",
elements: [
{
type: "view",
alignment: "align_fill",
elements: [
{
type: "static_text",
name: "Champs à double indices",
font: "dialog",
bold: true,
},
{
type: "static_text",
name: "Sélectionnez...",
},
{
type: "popup",
item_id: "LCha",
width: 150,
alignment: "align_fill",
},
]
},
{
type: "gap",
height: 5
},
{
type: "ok_cancel",
},
]
},
]
}
};
if("ok"==app.execDialog(bDialogue)){
debutChamp=nomListe;
lesIndices=[];
var leChamp="- Liste des seconds indices -";
var listeChamps="var listeChamps \= \{\""+leChamp+"\": "+(nbChamps+1)+",";
for (var i=0; i < nbChamps; i++) {
var nomChamp=this.getNthFieldName(i);
var RegExTest=new RegExp("^"+nomListe+"\\.(\\d+)$");
var OK=nomChamp.match(RegExTest);
if (OK) {
lesIndices.push("0"+OK[1].slice(-2));
}
}
var listeChamps=listeChamps.substring(0, listeChamps.length-1);
listeChamps+="\}";
eval(listeChamps);
//
var nbH=Math.ceil(Math.sqrt(lesIndices.length));
var nbV=Math.ceil(lesIndices.length/nbH);
numIndice=0;
champsCaC="[";
for (var i=0; i<nbH; i++) {
champsCaC+="{type: \"view\",elements: [";
for (var j=0; j<nbV; j++) {
if (numIndice<lesIndices.length) {
champsCaC+="{type: \"check_box\",item_id: \"cb"+lesIndices[numIndice]+"\",name: \" ."+Number(lesIndices[numIndice])+"\",},";
numIndice++;
} else break;
}
champsCaC+="]},{type: \"static_text\",name: \" \",},"
}
champsCaC+="]";
//
var bDialogue={
validate: function(bDialogue) {
var oRslt=bDialogue.store();
for (var i=0; i<lesIndices.length; i++)eval("theCB"+i+"=oRslt[\"cb"+lesIndices+"\"];")
var testOK0=true;
var txtTest="";
for (var i=0; i<lesIndices.length; i++){
txtTest+="theCB"+i+"==false";
if (i<lesIndices.length-1) txtTest+=" && ";
}
if (eval(txtTest)) var testOK0=0;
var testOK1=true;
lesElements=oRslt["elem"].replace(/^\s+|\s+$/g,"").replace(/\s+/g,"\r");
if (lesElements=="") var testOK1=0;
if (!testOK0) app.alert("Veuillez sélectionner au moins un indice pour le champ "+debutChamp+".",3);
else if (!testOK1) app.alert("Veuillez indiquer les éléments à ajouter pour les indices sélectionnés pour le champ "+debutChamp+".",3);
var testOK=(testOK0 && testOK1);
return testOK;
},
description: {
name: "Générer des menus déroulants",
elements: [
{
type: "view",
elements: [
{
type: "view",
alignment: "align_fill",
elements: [
{
type: "static_text",
name: "Seconds indices du champ "+debutChamp,
font: "dialog",
bold: true,
},
{
type: "static_text",
name: "Sélectionnez...",
},
{
type: "view",
align_children: "align_top",
elements: eval(champsCaC)
},
{
type: "gap",
height: 5
},
{
type: "static_text",
name: "Élément des menus déroulants",
font: "dialog",
bold: true,
},
{
type: "static_text",
name: "Indiquez une liste à intégrer",
},
{
type: "edit_text",
item_id: "elem",
multiline: true,
alignment: "align_fill",
height: 150
}
]
},
{
type: "gap",
height: 5
},
{
type: "ok_cancel",
},
]
},
]
}
};
if("ok"==app.execDialog(bDialogue)){
lesElements=lesElements.split("\r");
lesElements.unshift("?");
for (var i=0; i<lesIndices.length; i++) {
if (eval("theCB"+i)) this.getField(debutChamp+"."+i).setItems(lesElements);
}
}
}
} else app.alert("Il n'y a pas de champ dans ce document.",3);
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Je regarde ça ce weekend.
Dans ta boite de dialogue, faut-il laisser la possibilité d’indiquer le nom de champ manuellement ???@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clés… pas tant que ça en fait ! La plupart des zones devraient être inaccessibles et les boutons radios décochées à l’ouverture de la boîte de dialogue.
La fenêtre de script est également mal placée.
Je n’est pas testé l’exécution du script.
@+
😎bebarth
Maître des clésbebarth
Maître des clésbonjour,
Voilà, je redonne l’ensemble des scripts qui ont, pour certains, un peu évolués :
// Scripts de document
//
var nbDepart=0;
for (var i=0; i<this.numFields; i++) {
if (/^Départ\.\d+/.test(this.getNthFieldName(i))) nbDepart++;
}
var fichier=this.getDataObjectContents("Départ.csv");
var donnees=util.stringFromStream(fichier);
var lignes=donnees.split("\r\n");
var colonnes=new Array();
for (var ii=0 ; ii
var colonne0=[];`
for (var j=0 ; j
if (colonnes[j][0]) colonne0.push([colonnes[j][0]]);`
}
for (var i=1; i<=colonne0.length; i++) {
eval("var colonne"+(i+1)+"=[];");
for (var j=0 ; j
if (colonnes[j][i+1]) eval(« colonne »+(i+1)).push(colonnes[j][i+1]);`
}
}
colonne0[0].push(0);
for (var ii=1; ii<colonne0.length; ii++) {
colonne0[ii].push(eval("colonne"+(i+1)))
}
// Fichier "Départ Arrivée.csv"
var fichierDA=this.getDataObjectContents("Départ Arrivée.csv");
var donneesDA=util.stringFromStream(fichierDA);
var lignesDA=donneesDA.split("\r\n");
var colonnesDA=new Array();
for (var i=0 ; i
for (var i=1; i<=colonnesDA[0].length; i++) {`
eval("var colonne"+(i+1)+"DA=[\"- Sélectionnez -\"];");
for (var j=1 ; j
if (colonnesDA[j][i+1]) eval(« colonne »+(i+1)+ »DA »).push(colonnesDA[j][i+1]);`
}
}
//
var leCanal=this.getField("Canal").value;
this.getField("Canal").clearItems();
this.getField("Canal").setItems(colonne0);
this.getField("Canal").value=leCanal;
//
function menuCanal(laValeur) {
try {
for (var i=0; i<nbDepart; i++) {
this.getField("Départ."+i).clearItems();
this.getField("Arrivée."+i).clearItems();
}
if (laValeur!=0) {
var leMenu=laValeur.split(",");
var ind=leMenu[0].substr("Canal ".length);
leMenu[0]=["- Sélectionnez -",0];
for (var ii=1; ii<leMenu.length; ii++) {
leMenu[ii]=[leMenu[ii],eval("colonne"+(i+1)+"DA")];
}
for (var i=0; i<nbDepart; i++) {
this.getField("Départ."+i).clearItems();
this.getField("Départ."+i).setItems(leMenu);
}
}
} catch(e) {}
}
//
function menuDepart(ind,laValeur) {
this.getField("Arrivée."+ind).clearItems();
this.getField("Arrivée."+ind).setItems(laValeur.split(","));
}
function menuArrivee(leChamp) {
try {
var ind=leChamp.name.substring(leChamp.name.indexOf(".")+1);
var laTable=this.getField("Départ."+ind).value.split(",");
for (var i=0; i<nbDepart; i++) {
if (i==ind) continue;
for (j=0; j<leChamp.numItems; j++) {
if (this.getField("Départ."+i).getItemAt(this.getField("Départ."+i).currentValueIndices,false)==this.getField("Départ."+ind).getItemAt(this.getField("Départ."+ind).currentValueIndices,false) && this.getField("Arrivée."+i).value==laTable[j]) laTable.splice(j,1);
}
}
var lArrivee=leChamp.value;
leChamp.clearItems();
leChamp.setItems(laTable);
leChamp.value=lArrivee;
} catch(e) {}
}
//
function cAc(arrivee) {
if (this.getField("Canal").value && this.getField("Départ.0").value && arrivee!="- Sélectionnez -") {
this.getField("Check Box1").display=display.noPrint;
} else {
this.getField("Check Box1").display=display.hidden;
var modeles=this.templates;
if (this.getField("Check Box1").value!="Off") {
for (ii=0; ii<modeles.length; ii++) {
if (modeles[ii].name=="page2") {
this.deletePages(1);
break;
}
}
}
this.getField("Check Box1").value="Off";
this.pageNum=0;
}
}
// Script de touches personnalisé Menu "Canal"
if (!event.willCommit) {
menuCanal(event.changeEx);
cAc(this.getField("Arrivée.0").value);
}
// Script de touches personnalisé des Menus "Départ" sauf "Départ.0"
if (!event.willCommit) {
if (event.changeEx!=0) {
menuDepart(event.target.name.substring(event.target.name.indexOf(".")+1),event.changeEx);
cAc(this.getField("Arrivée.0").value);
} else {
this.getField("Arrivée."+event.target.name.substring(event.target.name.indexOf(".")+1)).clearItems();
}
}
// Script de touches personnalisé Menu "Départ.0"
if (!event.willCommit) {
if (event.changeEx!=0) {
menuDepart(event.target.name.substring(event.target.name.indexOf(".")+1),event.changeEx);
cAc(this.getField("Arrivée.0").value);
} else {
this.getField("Arrivée."+event.target.name.substring(event.target.name.indexOf(".")+1)).clearItems();
this.getField("Check Box1").display=display.hidden;
var modeles=this.templates;
if (this.getField("Check Box1").value!="Off") {
for (ii=0; ii<modeles.length; ii++) {
if (modeles[ii].name=="page2") {
this.deletePages(1);
break;
}
}
}
this.getField("Check Box1").value="Off";
this.pageNum=0;
}
}
// Ajout Script de touches personnalisé de TOUS les Menus "Départ" sauf "Départ.0"
for (var i=1; i<30; i++) {
this.getField("Départ."+i).setAction("Keystroke","if (!event.willCommit) {\r\tif (event.changeEx!=0) {\r\t\tmenuDepart(event.target.name.substring(event.target.name.indexOf(\".\")+1),event.changeEx);\r\t\tcAc(this.getField(\"Arrivée.0\").value);\r\t} else {\r\t\tthis.getField(\"Arrivée.\"+event.target.name.substring(event.target.name.indexOf(\".\")+1)).clearItems();\r\t}\r}");
}
// Script de touches personnalisé Menu "Arrivée.0"
if (!event.willCommit) {
if (event.changeEx!="- Sélectionnez -") cAc(event.changeEx);
}
// Souris entrée de tous les Menus "Arrivée"
menuArrivee(event.target);
// Ajout Script Souris entrée de TOUS les Menus "Arrivée"
for (var i=0; i<30; i++) {
this.getField("Arrivée."+i).setAction("MouseEnter","menuArrivee(event.target);");
}
// Script d'ouverture de page
if (app.viewerType!="Exchange-Pro") this.viewState={overViewMode:2};
this.viewState={overViewMode:5}
// Script Affichage Page 2
if (event.target.value!="Off") {
var modeles=this.templates;
for (ii=0; ii<modeles.length; ii++) {
if (modeles[ii].name=="page2") {
modeles[ii].spawn(1, false, false);
break;
}
}
this.pageNum=0;
} else {
this.deletePages(1);
}
// Ajouter page 4
var modeles=this.templates;
for (ii=0; ii<modeles.length; ii++) {
if (modeles[ii].name=="page4") {
modeles[ii].spawn(this.numPages-1, false, false);
break;
}
}
PS : Les [ii] dans les scripts ci-dessus sont en fait de simples « i » entre crochets dans le document joint. Il est donc préférable de se reporter aux scripts contenus dans le fichier ci-joint.
@+
😎-
Cette réponse a été modifiée le il y a 1 année par
bebarth.
Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonsoir,
Pas de souci pour te le partager, mais sais-tu si tu peux ajouter un script d’application avec PDF-XChange ? Je n’ai pas l’impression…@+
😎 -
Cette réponse a été modifiée le il y a 8 mois et 3 semaines par
-
AuteurRéponses