Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
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é ?

#1 Mon 14 April 2025 14:15

Marcopololo
Participant actif
Lieu: Etival Clairefontaine
Date d'inscription: 23 Nov 2021
Messages: 97

QGIS: Fonction for range

Bonjour,

Je souhaite dans cette fonction, insérer dans ma liste ":" et "\n" tous les deux champs mais il y a un truc qui ne marche pas dans ma fonction. i s'incrémente bien mais n'est pas envoyé dans insert suf le premier. J'en déduis que ma boucle s'arrête.

Code:

a=['bonjour','Hello','Au revoir','Bye','Aujourd_hui','demain']
lg=len(a)
print(lg)
for i in range(1,lg,2):
    a.insert(i,":")
    a.insert(i+1,"\n")
    print(i)
print(a)
print("".join(list(map(str,a))))

Merci de votre aide

Marcopololo

Dernière modification par Marcopololo (Mon 14 April 2025 14:16)

Hors ligne

 

#2 Mon 14 April 2025 14:54

SANTANNA
Moderateur
Lieu: Angers
Date d'inscription: 18 Jan 2008
Messages: 4062

Re: QGIS: Fonction for range

Bonjour,
Lorsque vous insérez ":" dans votre liste, la liste s'agrandit les index sont décalés d'autant, et donc le "\n" est aussi placé plus tôt que prévu. La prochaine itération se fait ensuite sur la position prise par le i, et rebelote...
Je vous propose cette approche où on fait le taf, à reculons. Point de risque de bousculer les index.

Code:

a=['bonjour','Hello','Au revoir','Bye','Aujourd_hui','demain']
lg=len(a)
print(lg)
for i in range(lg,0,-2):
    print('le num i est ', i)
    a.insert(i-1,":")
    a.insert(i+1,"\n")
    print(i)

print('a est ', a)
print("".join(list(map(str,a))))

Par contre, et même si vous en avez besoin pour un script dans QGIS, je ne vois aucun rapport avec QGIS sur ce sujet. On est dans du Python, là. Pensez donc à déposer vos sujets dans les forums les plus adaptés.

Hors ligne

 

#3 Mon 14 April 2025 15:20

Marcopololo
Participant actif
Lieu: Etival Clairefontaine
Date d'inscription: 23 Nov 2021
Messages: 97

Re: QGIS: Fonction for range

Merci beaucoup Santana, en plus j'avais lu cet aspect de commencer à reculons pour éviter ce problème. Mais bon, un débutant reste un débutant tant qu'il n'a pas été confronté au problème.

Hors ligne

 

#4 Mon 14 April 2025 17:53

Marcopololo
Participant actif
Lieu: Etival Clairefontaine
Date d'inscription: 23 Nov 2021
Messages: 97

Re: QGIS: Fonction for range

J'ai intégré ce code dans mon plugin mais je dois encore faire une erreur de débutant car le code ne s'arrête sur la partie insert. Si j'enlève cette partie il fonctionne mais sans le rajout des champs à ma liste.
Un

Code:

print(i)

à la place des insert affiche les bonnes valeurs. Peut être l'attribut fields ?

Code:

            def build_travaux_dates(e):
                # fields = fields.strftime("%d/%m/%Y")
                fields = [
                    'parcelles_Travaux_Date1','parcelles_Travaux_Travaux1',
                    'parcelles_Travaux_Date2','parcelles_Travaux_Travaux2',
                    'parcelles_Travaux_Date3','parcelles_Travaux_Travaux3',
                    'parcelles_Travaux_Date4','parcelles_Travaux_Travaux4',
                    'parcelles_Travaux_Date5','parcelles_Travaux_Travaux5',
                    'parcelles_Travaux_Date6','parcelles_Travaux_Travaux6'
                ]
                lg = len(fields)
                print(lg)
                for i in range(lg, 0, -2):
                    fields.insert(i - 1, ":")
                    fields.insert(i + 1, "\n")
                to_str = "".join([e[field] for field in fields if e[field]])
                #to_str = "".join(list(map(str, fields)))
                if not to_str:
                    return 'Aucun travaux effectués ici...'
                return to_str
                #print("".join(list(map(str, fields))))
            self.dlg.travauxListe.setText(build_travaux_dates(e))

Voici l'erreur :
to_str = "".join([e[field] for field in fields if e[field]])
                                                      ~^^^^^^^
KeyError: ':'

Je soupçonne e de me poser un problème. En effet le champ rajouter ":" n'existe pas dans ma table d'attributs et le problème est le même pour l'autre insert. e vient de display_point qui récupère les valeurs de ma table au point cliqué.

Dernière modification par Marcopololo (Mon 14 April 2025 18:00)

Hors ligne

 

#5 Mon 14 April 2025 18:17

Marcopololo
Participant actif
Lieu: Etival Clairefontaine
Date d'inscription: 23 Nov 2021
Messages: 97

Re: QGIS: Fonction for range

J'avance, comme cela c'est mieux, mais au lieu de m'afficher les données de ma table d'attribut j'ai les éléments de la table de mon code

Code:

            def build_travaux_dates(e):
                # fields = fields.strftime("%d/%m/%Y")
                fields = [
                    'parcelles_Travaux_Date1','parcelles_Travaux_Travaux1',
                    'parcelles_Travaux_Date2','parcelles_Travaux_Travaux2',
                    'parcelles_Travaux_Date3','parcelles_Travaux_Travaux3',
                    'parcelles_Travaux_Date4','parcelles_Travaux_Travaux4',
                    'parcelles_Travaux_Date5','parcelles_Travaux_Travaux5',
                    'parcelles_Travaux_Date6','parcelles_Travaux_Travaux6'
                ]
                lg = len(fields)
                print(lg)
                for i in range(lg, 0, -2):
                    print(i)
                    fields.insert(i - 1, ' : ')
                    fields.insert(i + 1, "\n")
                to_str = "".join(list(map(str, fields)))
                print(to_str)
        #        to_str = "".join([e[field] for field in fields if e[field]])
                #to_str = "".join(list(map(str, fields)))
                if not to_str:
                    return 'Aucun travaux effectués ici...'
                return to_str
                print("".join(list(map(str, fields))))
            self.dlg.travauxListe.setText(build_travaux_dates(e))

Hors ligne

 

#6 Mon 14 April 2025 19:22

Marcopololo
Participant actif
Lieu: Etival Clairefontaine
Date d'inscription: 23 Nov 2021
Messages: 97

Re: QGIS: Fonction for range

Je pense avoir compris le fond de mon problème.
e correspond aux données de ma table attributaire. Et en voulant y ajouter des données que se soit ":" ou "\n" je pense que ce n'est pas possible.
alors ma question est la suivante.
Si je transforme ma table en liste je récupère donc les champs correspondant et qu'ensuite j'en fais une copie. a cette liste j'ajoute les éléments ":" et "\n" puis je la transforme à nouveau en table pour pouvoir l'utiliser, cela serait il fonctionnel.
Je vais testé mais si quelqu'un à une autre idée je suis preneur.
Merci d'avance

Hors ligne

 

#7 Mon 14 April 2025 23:27

Marcopololo
Participant actif
Lieu: Etival Clairefontaine
Date d'inscription: 23 Nov 2021
Messages: 97

Re: QGIS: Fonction for range

Voilà j'y suis presque après de longues heures de bataille. Il me reste encore à injecter ma nouvelle table dans la boite de dialogue et régler les soucis d'insert en trop :

Code:

            def build_travaux_dates(e):
                # fields = fields.strftime("%d/%m/%Y")
                fields = [
                    'parcelles_Travaux_Date1',
                    'parcelles_Travaux_Travaux1',
                    'parcelles_Travaux_Date2',
                    'parcelles_Travaux_Travaux2',
                    'parcelles_Travaux_Date3',
                    'parcelles_Travaux_Travaux3',
                    'parcelles_Travaux_Date4',
                    'parcelles_Travaux_Travaux4',
                    'parcelles_Travaux_Date5',
                    'parcelles_Travaux_Travaux5',
                    'parcelles_Travaux_Date6',
                    'parcelles_Travaux_Travaux6'
                ]
                to_str = " : ".join([e[field] for field in fields if e[field]])
                print("str:",to_str)
                if not to_str:
                    return 'Aucun travaux effectués ici...'
                lg=len(fields)
                print(lg)
                to_tbl = to_str.split(" : ")
                #print(to_tbl)
                for i in range(lg,0,-2):
                    to_tbl.insert(i-1," : ")
                    to_tbl.insert(i+1,"\n")
                    print ("to_tbl:",to_tbl)
                    to_str2 = "".join(to_tbl)
                    print("to_str2:",to_str2)
                #print(" : ".join([e[field] for field in fields if e[field]]))
                return to_str
            self.dlg.travauxListe.setText(build_travaux_dates(e))

Dernière modification par Marcopololo (Mon 14 April 2025 23:30)


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

#8 Tue 15 April 2025 12:33

Marcopololo
Participant actif
Lieu: Etival Clairefontaine
Date d'inscription: 23 Nov 2021
Messages: 97

Re: QGIS: Fonction for range

Encore un autre petit soucis de compréhension, je n'arrive pas à afficher dans ma boite de dialogue la valeur se to_str2, puisqu'elle n'est pas dans le même niveau. Comment fait on pour la récupérer et que je puisse l'utiliser dans une commande de type self.dlg.travauxListe ?

Merci de votre aide

Marcopololo

Hors ligne

 

#9 Wed 16 April 2025 13:40

Marcopololo
Participant actif
Lieu: Etival Clairefontaine
Date d'inscription: 23 Nov 2021
Messages: 97

Re: QGIS: Fonction for range

Après de nombreuses recherches et de l'aide, voici enfin un code qui fonctionne

Code:

            def build_travaux_dates(e):
                # fields = fields.strftime("%d/%m/%Y")
                fields = [
                    'parcelles_Travaux_Date1',
                    'parcelles_Travaux_Travaux1',
                    'parcelles_Travaux_Date2',
                    'parcelles_Travaux_Travaux2',
                    'parcelles_Travaux_Date3',
                    'parcelles_Travaux_Travaux3',
                    'parcelles_Travaux_Date4',
                    'parcelles_Travaux_Travaux4',
                    'parcelles_Travaux_Date5',
                    'parcelles_Travaux_Travaux5',
                    'parcelles_Travaux_Date6',
                    'parcelles_Travaux_Travaux6'
                ]
                items = [e[field] for field in fields if e[field]]
                str2 = '\n'.join(f'{a} : {b}' for a, b in list(batched(items, 2)))
                print("str:",str2)
                if not str2:
                    return 'Aucun travaux effectués ici...'
                return str2
            self.dlg.travauxListe.setText(build_travaux_dates(e))

Hors ligne

 

Pied de page des forums

Copyright Association GeoRezo