Donnez vie à vos documents numériques !
 

Couleurs

  • Créateur
    Sujet
  • #70137
    michel c.
    Participant

    Bonjour, j’ai un pdf qui contient une cinquantaine de champs qui peuvent contenir des valeurs de 0 à 10 (ces nombres sont des valeurs d’exportation de listes déroulantes) et j’aimerais qu’en fonction de la valeur affichée une couleur différente soit utilisée comme couleur de remplissage.

    J’ai fait un script en essayant d’utiliser la boucle for (je pensais avoir bien compris)

    J’avais prévu un dégradé allant du vert (pour la valeur 1) au rouge (pour la valeur 10) en passant par le orange.

    Mais je ne comprends pas, seules 3 couleurs s’affichent (les 2 valeurs extrêmes et une seule pour toutes les valeurs intermédiaires).

    for (var j = 0; j < 53; j++) {

    if (this.getField("diff."+j).value === 0) {
    this.getField("diff."+j).fillColor = color.transparent;}

    else if (this.getField("diff." +j).value === 1) {
    this.getField("diff."+j ).fillColor = ["RGB", 0, 255, 0];}

    else if (this.getField("diff." +j).value === 2) {
    this.getField("diff."+j ).fillColor = ["RGB", 255, 205, 0];}

    else if (this.getField("diff." +j).value === 3) {
    this.getField("diff."+j ).fillColor = ["RGB", 255, 180, 0];}

    else if (this.getField("diff." +j).value === 4) {
    this.getField("diff."+j ).fillColor = ["RGB", 255, 149, 0];}

    else if (this.getField("diff." +j).value === 5) {
    this.getField("diff."+j ).fillColor = ["RGB", 255, 122, 0];}

    else if (this.getField("diff." +j).value === 6) {
    this.getField("diff."+j ).fillColor = ["RGB", 255, 102, 0];}

    else if (this.getField("diff." +j).value === 7) {
    this.getField("diff."+j ).fillColor = ["RGB", 255, 77, 0];}

    else if (this.getField("diff." +j).value === 8) {
    this.getField("diff."+j ).fillColor = ["RGB", 255, 54, 0];}

    else if (this.getField("diff." +j).value === 9) {
    this.getField("diff."+j ).fillColor = ["RGB", 255, 37, 0];}

    else if (this.getField("diff." +j).value === 10) {
    this.getField("diff."+j ).fillColor = color.red;}

    else {}

    }

     

     

    De plus je voulais savoir si on pouvait faire marcher ce script sans avoir à cliquer sur un bouton ni en survolant une zone. J’ai essayer de le placer en script de document mais ça ne fonctionne pas.

     

    Merci

    • Ce sujet a été modifié le il y a 2 années et 4 mois par michel c..
    • Ce sujet a été modifié le il y a 2 années et 4 mois par michel c..
    Attachments:
    You must be logged in to view attached files.
Affichage de 6 réponses de 1 à 6 (sur un total de 6)
  • Auteur
    Réponses
  • #70142
    Merlin
    Maître des clés

    Bonjour

     

    1. C’est parce-que les couleurs ne sont pas référencées correctement il manque /255, voir le script ci-dessous. Si la 1re fonctionnait c’est parce qu’elle n’utilisait que 255 et 0, si la dernière fonctionne c’est parce-que c’est une couleur nommée.

    2. Il faut placer le script à la suite du calcul existant dans le bouton CALCUL, voir le ci-joint.

     

    for (var j = 0; j < 53; j++) {

    if (this.getField("diff."+j).value === 0) {
    this.getField("diff."+j).fillColor = color.transparent;}

    else if (this.getField("diff." +j).value === 1) {
    this.getField("diff."+j ).fillColor = ["RGB", 0/255, 255/255, 0/255];}

    else if (this.getField("diff." +j).value === 2) {
    this.getField("diff."+j ).fillColor = ["RGB", 255/255, 205/255, 0/255];}

    else if (this.getField("diff." +j).value === 3) {
    this.getField("diff."+j ).fillColor = ["RGB", 255/255, 180/255, 0/255];}

    else if (this.getField("diff." +j).value === 4) {
    this.getField("diff."+j ).fillColor = ["RGB", 255/255, 149/255, 0/255];}

    else if (this.getField("diff." +j).value === 5) {
    this.getField("diff."+j ).fillColor = ["RGB", 255/255, 122/255, 0/255];}

    else if (this.getField("diff." +j).value === 6) {
    this.getField("diff."+j ).fillColor = ["RGB", 255/255, 102/255, 0/255];}

    else if (this.getField("diff." +j).value === 7) {
    this.getField("diff."+j ).fillColor = ["RGB", 255/255, 77/255, 0/255];}

    else if (this.getField("diff." +j).value === 8) {
    this.getField("diff."+j ).fillColor = ["RGB", 255/255, 54/255, 0/255];}

    else if (this.getField("diff." +j).value === 9) {
    this.getField("diff."+j ).fillColor = ["RGB", 255/255, 37/255, 0/255];}

    else if (this.getField("diff." +j).value === 10) {
    this.getField("diff."+j ).fillColor = color.red;}

    else {this.getField("diff."+j ).fillColor = color.transparent;}

    }

    Attachments:
    You must be logged in to view attached files.
    #70144
    bebarth
    Maître des clés

    bonjour,
    Voici ma version.
    En script de document :

    function laCouleur(j) {
    switch (this.getField("diff."+j).value) {
    case 1:
    var couleur=["RGB", 0, 255/255, 0];
    break;
    case 2:
    var couleur=["RGB", 255/255, 205/255, 0];
    break;
    case 3:
    var couleur=["RGB", 255/255, 180/255, 0];
    break;
    case 4:
    var couleur=["RGB", 255/255, 149/255, 0];
    break;
    case 5:
    var couleur=["RGB", 255/255, 122/255, 0];
    break;
    case 6:
    var couleur=["RGB", 255/255, 102/255, 0];
    break;
    case 7:
    var couleur=["RGB", 255/255, 77/255, 0];
    break;
    case 8:
    var couleur=["RGB", 255/255, 54/255, 0];
    break;
    case 9:
    var couleur=["RGB", 255/255, 37/255, 0];
    break;
    case 10:
    var couleur=color.red;
    break;
    default:
    var couleur=color.transparent;
    }
    return couleur;
    }

    et en script de calcul de tous les champs “diff.” :

    var i=event.target.name.lastIndexOf(".");
    event.target.fillColor=laCouleur(Number(event.target.name.substr(i+1)));

    Pour écrire ce script dans les 53 champs, tu tappes dans la console :

    for (var i=0; i<53; i++) {
    this.getField("diff."+i).setAction("Calculate", "var i=event.target.name.lastIndexOf(\".\");\revent.target.fillColor=laCouleur(Number(event.target.name.substr(i+1)));");
    }

    puis “tout sélectionner” et ENTER du pavé numérique…

    @+
    😎

    Attachments:
    You must be logged in to view attached files.
    #70146
    bebarth
    Maître des clés

    bonjour,
    Je viens de regarder ton fichier de plus près et voici mes commentaires.

    Le champ de calcul ne sert à rien. Il faut le supprimer
    Pour chaque menu déroulant, il faut cocher la case “Valider la valeur sélectionnée immédiatement” et écrire un script de touches personnalisé :

    if (!event.willCommit) {
    var i=event.target.name.lastIndexOf(".");
    var f=this.getField("diff."+Number(event.target.name.substr(i+1)));
    f.value=event.changeEx;
    f.fillColor=laCouleur(event.changeEx);
    }

    Les scripts de calcul des champs “diff.” ne servent plus à rien, il faut donc les supprimer. Cela évite d’exécuter 53 script de calcul lorsqu’on modifie 1 menu déroulant. Seul le script de touches personnalisé est exécuté !

    Pour faire toutes ces modifications en une fraction de seconde, tu colles dans la console :

    for (var i=0; i<53; i++) {
    this.getField("sequence."+i).commitOnSelChange=true;
    this.getField("sequence."+i).setAction("Keystroke","if (!event.willCommit) {\r\tvar i=event.target.name.lastIndexOf(\".\");\r\tvar f=this.getField(\"diff.\"+Number(event.target.name.substr(i+1)));\r\tf.value=event.changeEx;\r\tf.fillColor=laCouleur(event.changeEx);\r}");
    this.getField("diff."+i).setAction("Calculate", "");
    }

    puis tout sélectionner et ENTER du pavé numérique.

    Une petite modification du script de document :

    function laCouleur(j) {
    switch (Number(j)) {
    ...

    Ci-joint le résultat.

    @+
    😎

    Attachments:
    You must be logged in to view attached files.
    #70149
    michel c.
    Participant

    Bonjour, la proposition de merlin fonctionne bien.

    Pour la dernière proposition, lorsque je colle le script dans la console et que j’exécute, la console renvoie undefined.

    Ce que tu appelle script de touche personnalisée c’est un script qui se déclenche souris vers le haut par exemple ?

    Je met le 1er script pour tous les menus déroulants et le 2nd sur les champs diff ?

    Tu as du oublier la pièce jointe.

    Tu as raison de préciser qu’il est inutile d’exécuter les 53 scripts; J’avais remarqué que lorsque j’ai un pdf dans lesquels trop de champs contiennent des scripts, il arrive que mon éditeur plante.

    Je précise que je ne suis pas sous adobe mais sous PDF XChange Editor Plus (mais je pense qu’il y a à peu près les mêmes fonctionnalités)

    Je réessayerai ce soir

    Merci pour les propositions en tout cas.

    PS : je ne comprend pas bien cette ligne : this.getField(“sequence.”+i).commitOnSelChange=true

     

    #70150
    bebarth
    Maître des clés

    la proposition de merlin fonctionne bien.

    Je n’ai jamais dit qu’elle ne fonctionnait pas. Je dis qu’il ne sert à rien d’exécuter 53 scripts lorsque l’on modifie un menu déroulant.

    lorsque je colle le script dans la console et que j’exécute, la console renvoie undefined.

    Ce n’est pas très grave, l’important est qu’il s’est exécuté correctement. Regarde les propriétés des champs.

    Ce que tu appelle script de touche personnalisée c’est un script qui se déclenche souris vers le haut par exemple ?

    C’est un script qui se déclenche lorsque tu relâche le bouton de la souris dans un menu déroulant.

    Je met le 1er script pour tous les menus déroulants et le 2nd sur les champs diff ?

    Si tu exécutes le script dans la console tu n’as rien d’autre à faire. Les scripts de touches personnalisés seront générés automatiquement pour tous les menus déroulants et les cases “Valider…” seront également cochées.

    Tu as du oublier la pièce jointe.

    Je ne pense pas ! Elle est en bas du message. Peut-être n’es-tu pas connecté à ton compte (on ne voit les pièces jointes que si l’on est connecté).

    je ne comprend pas bien cette ligne : this.getField(« sequence. »+i).commitOnSelChange=true

    commitOnSelChange est la propriété pour activer la case “Valider la valeur sélectionnée immédiatement” si “true”.

    @+
    😎

    #70151
    Merlin
    Maître des clés

    Tu as raison de préciser qu’il est inutile d’exécuter les 53 scripts; J’avais remarqué que lorsque j’ai un pdf dans lesquels trop de champs contiennent des scripts

    C’est pour ça que mon exemple n’utilise qu’un seul script de calcul dans un seul champ.

    😎

     

     

    Ce que tu appelle script de touche personnalisée

    Voir capture jointe et voir aussi ce tuto, mais je ne connais pas les équivalences avec PDF XChange Editor Plus  :

    L’ordre d’exécution des événements dans les champs de formulaire PDF

    Attachments:
    You must be logged in to view attached files.
Affichage de 6 réponses de 1 à 6 (sur un total de 6)
  • Vous devez être connecté pour répondre à ce sujet.