banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#1 Wed 28 November 2007 17:27

Miss T.
Participant assidu
Lieu: En pleine amazonie...
Date d'inscription: 17 Oct 2005
Messages: 294

[MB] Création de frames à la chaîne

Bonjour,

Je suis en train de réaliser un outil type "atlas carto" en partant d'une fenêtre carte et d'une fenêtre Légende.

primo, je duplique ma fenêtre carte en lui donnant des p'tits noms qui vont bien (A, B, C, etc) puis je lance la création des mises en pages:

Code:

       For i = 1 to n 
        Run Command WindowInfo(win_carte,15)
        cmd_string = "Set Window FrontWindow() Title " + chr$(34) + nom_carte(i) + chr$(34)
        run Command cmd_string
        call Create_layout(Nom_Carte(i), nom_legende, str_Titre_Carte, ...)
       next

Le code suivant me créé dans la mise en page courante les frames cartes en utilisant les noms des fenêtres cartes:

Code:

  cmd_string = "Create Frame (0.316,1.5542) (16.2222,10.1326) "
     cmd_string = cmd_string + "Pen (1,2,0) "
     cmd_string = cmd_string + "Brush (2,16777215,16777215) "
     cmd_string = cmd_string + "Title " + chr$(34) + nom_carte + chr$(34) + " "
     cmd_string = cmd_string + "FillFrame On"  
  run command cmd_string

Les mises en pages sont bien créées mais les contenus des frames sont complètement aléatoires.
- La 1e carte (A) a son frame ok: bonne échelle, bonne fenêtre crate, etc.
- La carte "B" n'affiche pas la carte B mais la fenêtre d'un logo qui commence par "B" (coincidence?)
- la majorité des autres cartes  a un frame "vide" avec la mention "pas de fenêtre"
- la fenêtre "F" est nickel aussi.

Je ne comprend pas trop là, doit y avoir un schmilblick avec les noms des fenêtres cartes.

J'appelle du coup, j'ajoute la clause FROM WINDOW + le numéro de la fenêtre. Un message d'erreur apparaît: "id de la fenêtre 6 non valide". Pourtant, c'est bien le n° de la fenêtre et n_carte est bien un Integer

Moi pas comprendre....

Hors ligne

 

#2 Wed 28 November 2007 19:45

Maurice
Membre
Lieu: Montpellier
Date d'inscription: 5 Sep 2005
Messages: 5331

Re: [MB] Création de frames à la chaîne

Je suppose que nom_carte est une variable-liste en string qui contient de 1 à 10 (par exemple) les valeurs de A, B,...à J ??
Dans ce cas le nom_carte utilisé dans la fabrication de cmd_string est une autre variable redéfinie ??
En tout cas il manque des bouts dans le cmd_string: si on suppose que nom_carte = "truc" on obtient
Create Frame (0.316,1.5542) (16.2222,10.1326) Pen (1,2,0) Brush (2,16777215,16777215) Title "truc" FillFrame On
Il manque Into Window layout_win_id au début et  From Window contents_win_id à la fin
Ils ne sont facultatifs que si la fenêtre mise en page concernée est au premier plan et si il n'y a pas d'ambiguité sur le nom de fenêtre que cite Title: ça ne doit pas être le cas
nb: en phase de développement, pensez à tester par print cmd_string avant le run command cmd_string

Hors ligne

 

#3 Fri 30 November 2007 11:37

Miss T.
Participant assidu
Lieu: En pleine amazonie...
Date d'inscription: 17 Oct 2005
Messages: 294

Re: [MB] Création de frames à la chaîne

Je vais essayer de répondre à vos questions dans l'ordre:

nom_carte(i) est une variable-liste en string qui contient de 1 à n noms de cartes: A, B, C...  C'est une variable qui me sert pour dupliquer ma fenêtre carte initiale et renommer cette nouvelle fenêtre. On est dans la procédure Sub Create_Map

Une fois cette nouvelle fenêtre créée/renommée/recentrée, j'appelle la procédure Create_Layout avec un tas de paramètres dont le nom de la carte pour laquelle je veux un nouveau layout. donc je passe Nom_carte(i) qui sera le paramètre nom_carte dans la procédure Create_Layout. donc Nom_carte dans cmd_string = "Create Frame ...[] ...FillFrame On" = nom_carte (i)

si on suppose que nom_carte = "truc" on obtient
Create Frame (0.316,1.5542) (16.2222,10.1326) Pen (1,2,0) Brush (2,16777215,16777215) Title "truc" FillFrame On


Vous supposez bien...

Il manque Into Window layout_win_id au début et  From Window contents_win_id à la fin
Ils ne sont facultatifs que si la fenêtre mise en page concernée est au premier plan et si il n'y a pas d'ambiguité sur le nom de fenêtre que cite Title: ça ne doit pas être le cas


Dans l'ordre: je duplique/renomme/recentre la fenêtre carte puis je créé le Layout et lui ajoute les éléments graphiques: la légende, des rectangles, des frames. tout est OK (même la légende mais c'est toujours la même, celle de la carte initiale) sauf cette @#¤ de frame devant contenir la carte dupliquée n°i. Donc en théorie, la mise en page concernée est belle et bien au premier plan.
Dans le doute sur l'ambiguïté des noms des fenêtres cartes, je vais changer les titres....

nb: en phase de développement, pensez à tester par print cmd_string avant le run command cmd_string


TOUJOURS!! Et encore plus quand ça bugue!!!!

Hors ligne

 

#4 Fri 30 November 2007 11:55

Maurice
Membre
Lieu: Montpellier
Date d'inscription: 5 Sep 2005
Messages: 5331

Re: [MB] Création de frames à la chaîne

Alors, si je comprens bien (pas facile en aveugle!) il faut que la variable liste nom_carte() soit définie au niveau supérieur ainsi que la variable string nom_carte. Il s'agit du niveau avant le Sub Main, au tout début (nb: ce serait mieux qu'elle s'appelle plutôt nomcarte pour éviter toute confusion)
A ce compte, dans la procédure Sub Create_Map on dit nomcarte=nomcarte(i) et ce nomcarte défini à chaque incrémentation de 1 est réutilisé dans la sous procédure Sub Create_Layout appelée par Sub Create_Map

[EDIT] En revenant au premier post, je remarque que Create_Layout reçoit ses paramètres par Create_Map !!
Ce qui précède est donc en grande partie faux sad   mais je le laisse....
Comme les paramètres ne sont pas passés par ByVal, il faut que Create_Layout commence par :
Dim nom_carte,..... As String
nom_carte = parametre1 .....
la procédure étant être déclarée par Declare Sub Create_Layout(parametre1 As Sring,parametre2 As String,...)
Sinon, c'est souvent plus commode d'utiliser Declare Sub Create_Layout(ByVal parametre1 As String,ByVal parametre2 As String,...), car on n'a plus a déclarer de variable ....
...à suivre ...

Dernière modification par Maurice (Fri 30 November 2007 13:16)

Hors ligne

 

#5 Fri 30 November 2007 14:38

Miss T.
Participant assidu
Lieu: En pleine amazonie...
Date d'inscription: 17 Oct 2005
Messages: 294

Re: [MB] Création de frames à la chaîne

Pas tout à fait ça.
nom_carte(i) est une variable de Create_Map. Je défini le contenu de cette variable dans cette procédure.
La variable nom_carte est un paramètre de la procédure Create_Layout.

Et la petite phrase "s'il n'y a pas d'ambiguité sur le nom de fenêtre que cite Title " m'a titillé à l'oreille qu'il fallait que je mette des noms plus longs aux cartes.
i.e. Si j'ai une fenêtre carte qui s'appelle "Synoptique" et une carte dupliquée "S" ==> confusion.
Si mes cartes dupliquées s'appellent "Carte S", là, il ne fait plus de confusion.

Et là, ça fonctionne au poil.

Donc le problème est résolu mais c'est bizarre comme confusion....

Hors ligne

 

Pied de page des forums

Powered by FluxBB