Utilisation des signets pour activer ou masquer des calques  (Lu 368 fois) Partager ce sujet Imprimer

1 B


jjT  25 juin 2020 : 20:01

Bonsoir,

D'abord toutes mes félicitations pour ce site !
Mon problème du jour :J'ai créé dans un PDF un certain nombre de signets que j'utilise comme "bouton poussoir" pour rendre visible ou masquer des calques.Jusque là tout va bien, mais si je clique une deuxième fois sur le même signet je me retrouve en mode édition pour renommer ledit signet.
Quelle commande rajouter pour qu'à chaque clic, le focus soit renvoyé sur le document principal (ou sur un autre signet) ?
Voici le bout de code :
var ocgArray1 = this.getOCGs(); for (var i=0; i < ocgArray1.length; i++) {     if (ocgArray1.name == "Signet1") {
          if (ocgArray1.state == false) {
             ocgArray1.state = true ;
             }
         else {
             ocgArray1.state = false ;
         }
     } else if (ocgArray1.name == "Signet2") {
         ocgArray1.state = false;
     } else if (ocgArray1.name == "Signet3") {
         ocgArray1.state = false;
     } else if (ocgArray1.name == "Signet4") {
         ocgArray1.state = false;
     } else if (ocgArray1.name == "Signet5") {
         ocgArray1.state = false;
     } else if (ocgArray1.name == "Signet6") {
         ocgArray1.state = false;
     }
 }

Grand merci d'avance.

IP archivée


Merlin  26 juin 2020 : 01:02

Bonjour et bienvenue

1. Fais attention à l'utilisation des balises de formatage quand tu rédiges ton message. Celui ci-dessus était illisible (voir capture ci-dessous).

2. Il n'y a rien à faire. Il faut juste se dire qu'avec Acrobat Reader ou Foxit Reader les noms des signets ne sont pas modifiables, donc ça ne peut pas arriver.

 :Smiley15:

IP archivée


jjT  27 juin 2020 : 09:01

Bonjour,


1. Effectivement, je n'avais pas fait attention au formatage.


2. Là, je ne comprends pas la réponse...


La solution est de fermer et de rouvrir le signet supérieur, donc de rajouter :
var myRoot = this.bookmarkRoot;
var myChild = myRoot.children[0];
myChild.open = false;
myChild.open = true;


À chaque clic sur le signet, c'est le signet parent qui est sélectionné.


 :joker:

IP archivée


bebarth  27 juin 2020 : 09:30

bonjour,
2. Là, je ne comprends pas la réponse...
Merlin veut dire qu'avec les "Reader" on ne peut pas modifier le nom des signets. Tu y arrives parce que tu utilises Acrobat Pro, mais tu ne pourrais le faire avec les "Reader".
Peux-tu partager un fichier, car il y aurait certainement moyen de "simplifier" ton script, mais ça dépend un peu si tu as juste 6 calques ou d'autres...
Jusque là tout va bien, mais si je clique une deuxième fois sur le même signet je me retrouve en mode édition pour renommer ledit signet.
...et là, je ne comprends pas pourquoi !
@+
 :bonjour:

IP archivée


jjT  27 juin 2020 : 19:28

Bonsoir,


J'ai extrait une page du PDF en question en version basse définition (7 Mo tout de même), le PDF complet en 300 dpi pèse plus de 600 Mo...
Il s'agit d'un atlas de la ville de Paris en 1791 dans lequel j'ai intégré énormément de données et une quinzaine de calques avec différents découpages administratifs de l'époque, d'autres cartes, et aussi le cadastre parisien actuel.
Pour l'instant cet instrument de travail pour des recherches historiques est à mon seul usage. Le fait qu'il ne soit guère fonctionnel avec un reader n'a donc pas trop d'importance.
Dans l'extrait que j'ai fait, ne figure pas les 7000 signets de la version complète ni tous les liens.


Pour l'instant, lorsque l'on clique sur un signet correspondant à un calque, celui-ci s'affiche, le signet en mis en rouge (ce qui permet de savoir quel est le calque affiché), tous les autres sont remis en bleu et le signet parent est sélectionné (ce qui permet de cliquer à nouveau sur le même signet pour le masquer (il se remet alors en bleu).
Seule exception, le cadastre actuel, seul calque qu'il peut être intéressant de superposer à un autre, qui lui, est en italique, rouge ou bleu selon qu'il est activé, mais qui ne modifie pas la visibilité des autres calques.


Le javascript que j'ai bricolé n'est pas vraiment élégant (!) et un peu lourd à modifier si je dois à l'avenir rajouter d'autres couches de données...


Dernier problème pour lequel je ne vois pas de solution : comment faire pour qu'Acrobat ne demande pas  si l'on veut enregistrer le fichier à chaque fermeture puisque des modifications ont été faite sur les signets ?


Merci d'avance pour votre aide. :Smiley01: :Smiley01: :Smiley01:




Lien pour télécharger le PDF :
https://drive.google.com/file/d/1GjDWpQkXGbfQq96VaagEZy62ZPeWfE6b/view?usp=sharing


IP archivée


bebarth  27 juin 2020 : 19:51

En "Actions de Scripts lorsque le document sera fermé" il faut écrire :
this.dirty=false;

IP archivée


jjT  27 juin 2020 : 23:18

Ben, alors là, merci !
 :bonjour:
C'est une épine de moins !
J'attends avec impatience la suite de votre expertise...


IP archivée


Merlin  28 juin 2020 : 01:29

Citer
En "Actions de Scripts lorsque le document sera fermé" il faut écrire :
this.dirty=false;
C'est acceptable pour un document à usage privé, encore qu'on risque de se piéger soi-même, mais la solution la plus élégante c'est de placer :
var bSale = this.dirty;
avant toute fonction modifiant le marqueur dirty, c'est-à-dire modifiant l'état du document.
Voir : https://help.adobe.com/en_US/acrobat/acrobat_dc_sdk/2015/HTMLHelp/Acro12_MasterBook/JS_API_AcroJS/Doc_properties.htm?rhhlterm=dirty&rhsyns=%20#XREF_39186_dirty

Et de placer :
this.dirty = bSale;
à la fin de chaque fonction utilisant le script ci-dessus pour rétablir le marqueur tel qu'il était avant l'exécution de la fonction.

Ainsi l'utilisateur est invité à enregistrer seulement s'il a modifié quelque chose d'autre (commentaires/annotations, paramètres d'ouverture, etc.) et il ne risquera pas de perdre son temps et ses efforts en se faisant piéger.
 :Smiley15:

IP archivée


bebarth  28 juin 2020 : 16:14

bonjour,
Il faut effectivement utiliser ce script en "Actions de Scripts lorsque le document sera fermé" uniquement lorsque le formulaire est terminé et qu'il est utilisé en mode "utilisateur" (bien que l'on puisse encore l'enregistrer via le menu ou la commande clavier).
Ici, pour chaque signet on indique son nom en variable puis on appelle une fonction définie en script de document. Le nom du signet correspond au nom du calque que l'on affiche/masque.
Je n'ai pas trouvé comment récupérer directement le nom du signet sur lequel on clique... Merlin, une idée ??? Sinon je poserai la question sur le forum Adobe.
Voici ce que cela donne :
// Script signet
var ceCalque="Paroisses Ancien Régime";
AffichageCalques();


// Sript de document
var lesCalques=this.getOCGs();
var lesSignets=this.bookmarkRoot.children[0].children;
function AffichageCalques() {
    for (var i=0; i<lesCalques.length; i++) {
        if (lesCalques[i].name!=ceCalque && lesCalques[i].name!="Boutons" && lesCalques[i].name!="Repères assemblage" && lesCalques[i].name!="Carte" && lesCalques[i].name!="Nom des rues" && lesCalques[i].name!="Cases") {
            lesCalques[i].state=false ;
        } else if (lesCalques[i].name==ceCalque) {
            this.delay=true;
            lesCalques[i].state=!lesCalques[i].state;
            this.delay=false;
        }
    }
    for (var i=0; i<lesSignets.length; i++) {
        if (lesSignets[i].name!=ceCalque) {
            lesSignets[i].color=color.blue;
        } else {
            if (lesSignets[i].color=="RGB,0,0,1") {
                lesSignets[i].color=color.red;
            } else {
                lesSignets[i].color=color.blue;
            }
        }
    }
}
...et voici le lien :
https://we.tl/t-le5uXH2PjT
@+
 :bonjour:

IP archivée


jjT  28 juin 2020 : 17:31

 :soleil:


Mille mercis Merlin et Bebarth !
C'est mille fois plus élégant et efficace que mes gribouillis en javascript...


 :soleil:

IP archivée


bebarth  28 juin 2020 : 21:06

Ça permet surtout de rajouter des claques/signets sans modifier tous les scripts.
J'ai posé la question sur le forum Adobe et il n'est apparemment pas possible de récupérer le nom du signet sur lequel on clique.
@+
 :bonjour:

IP archivée


Merlin  29 juin 2020 : 10:17

Citer
Je n'ai pas trouvé comment récupérer directement le nom du signet sur lequel on clique
Oui, il me semble bien que ce n'est pas possible.

IP archivée


jjT  30 juin 2020 : 19:10

Effectivement, j'ai cherché aussi de mon côté... impossible.
La seule solution semble de créer un nouveau signet et de le supprimer, ou de fermer et de rouvrir le signet parent.
J'ai donc réintroduit mon bout de code :


var myRoot = this.bookmarkRoot;[/size]var myChild = myRoot.children[0];myChild.open = false;myChild.open = true;


Et tout fonctionne à merveille.


Merci encore !
 :Smiley01:
[/color]

IP archivée