bru Posté(e) le 1 juillet 2004 Posté(e) le 1 juillet 2004 Bonjour à tous, J'ai obté pour la programmation de style:(entmake (list (cons 0 "LINE") (cons 10 (getpoint)) (cons 11 (getpoint)) )) plutôt que (command "line" (getpoint) (getpoint) "") et ce, pour une très simple raison:plus besoin de se placer dans un layer puis de revenir au précédent,idem pour les osnap, textstyle, et autres machin-bidules une line, ca marche,un texte, ca marche (layer, textstyle, justification, taille)par contre une polyline, là je seche... j'y a mis tous les codes dxf (sauf, le ename, handle) présent dans autre polyline, rien à faire, ca prend pas ! quelqu'un connait-il la subtilité à utiliser dans le cadre de la création d'une polyline par entget ? merci d'avance... Bruno
bru Posté(e) le 1 juillet 2004 Auteur Posté(e) le 1 juillet 2004 ah ok! j'ai trouvé, ca fonctionne, il manquait: (cons 100 "AcDbEntity") (cons 100 "AcDbPolyline") ce qui n'était pas nécéssaire dans la création des textes ou des lines pour ceux à qui ca intéresse:le code minimal pour une lwpline: (entmake (list (cons 0 "LWPOLYLINE") (cons 100 "AcDbEntity") (cons 100 "AcDbPolyline") (cons 90 2) ;; nbre de points (cons 10 (getpoint)) (cons 10 (getpoint)) ))
Patrick_35 Posté(e) le 1 juillet 2004 Posté(e) le 1 juillet 2004 Salut,C’est intéressant à savoir, mais je trouve un peu plus simple de passer par un command que par un entmake @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
bru Posté(e) le 1 juillet 2004 Auteur Posté(e) le 1 juillet 2004 Salut,C’est intéressant à savoir, mais je trouve un peu plus simple de passer par un command que par un entmake @+ Sans doute,mais pas si sûr: par exemple:(defun c: tx ()(setq l (getvar "clayer"))(setvar "clayer" "my_layer")(command "textstyle" "my_text_style") (command "text" blablabla)(command "textstyle" "previous")(setvar "clayer" l)) en cas d'erreur, on sort de la routine, le layer et le texstyle courant ont changé, il faut alors redefinir la fonction *error*, du genre: (defun *error* (msg) (if l (setvar "clayer" l)) ( changement de textstyle ) ( que faire en cas d'undo ???) (setq *error* olderror)) et, evidemment: (setq olderror *error*) et (setq *error* olderror)sans oublier les erreur éventuelles dans *error*, ce qui a pour conséquence de ne pas récupérer la fonction *error* d'origine !!! avec la méthode (entmake): (entmake (list (cons 0 "TEXT") (cons 8 *DIM*) (cons 10 (setq p (getpoint))) (cons 40 textheight) (cons 1 (rtos (roundx 0.1 (cadr p)))) (cons 7 "£-dim") )) ) en cas d'erreur, on sort de la function et c'est tout: l'environnement de travail n'a pas changé. donc pas besoin de gestion d'erreur. c'est propre, très clair! à vrais dire, je trouve que finalement le entmake est plus simple, et beaucoup plus souple, malgré ce qu'il y parrait Deux autres avantages:- les réacteurs: il faut de toutes facon un entmake ou du moins un entmod- avec entmakex, tu récupères l'element crée, que tu peux dont modifier, deleter, ssadder, enfin, plein de truc... ;-) Bruno
bonuscad Posté(e) le 1 juillet 2004 Posté(e) le 1 juillet 2004 Je soutiens Bruno dans son argumentation. Malgré que ENTMAKE donne un code plus long que l'utilisation de COMMAND.Il y a moins de variables à surveiller, à changer et à restaurer.Entmake se charge même de créer un calque si celui ci n'existe pas! Par contre la manipulation d'objets complexes comme des blocs est plus compliqué (il faut respecter l'imbrication)Le code, à mon avis, est plus fiable et fait plus "professionel" ;) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
Patrick_35 Posté(e) le 1 juillet 2004 Posté(e) le 1 juillet 2004 Bonjour à vous deux Ca fait plus pro ! si on regarde le listing, autrement, pour l'utilisateur, c'est complètement transparentEt pour les évolutions futures ? La notion de lwpolyline est apparut avec la 2000 ainsi que les codes de groupes du type AcDbpolyline. En faisant des entmake, je ne suis pas certain que ça fonctionne avec les évolutions futures d'autocad et de plus, si j'ai des prog qui tournent sur différentes versions, le entmake n'est pas forcément la solution idéale.Mais je dois avouer que je ne savais pas qu'on ne pouvait qu'utiliser un minimum d'arguments pour créer un objet. En regardant les exemples fournit dans l'aide, je pensais qu'il fallait donner toutes les valeurs que l'on peut trouver dans un entget. C'est vrai qu'en cas d'erreur sur la fonction, on sort et c'est tout, mais en générale, on définit notre environnement d'utilisation du lisp au début, et de temps en temps en cours d'utilisation. Pour grouper les commandes, en utilisant la commande _undo --> _group et puis _end, ça permet de tout regrouper que sur ma fonction lisp En cas d'erreur, ce que je fais correspond à peu prêt a ceci (defun *erreurprog* (msg) (if (/= msg "Function cancelled") (if (= msg "quit / exit abort") (princ) (princ (strcat "\nErreur : " msg)) ) (princ) ) (remettre les variables à leurs valeurs d'origine) (setq *error* olderreur) (setvar "cmdecho" cmd) (princ) ) (setq olderreur *error*) (setq *error* *erreurprog*) (command "_.undo" "_group") (définition des variables) (routines) (remettre les variables à leurs valeurs d'origine) (command "_.undo" "_end") (setq *error* olderreur) Je ne dis pas que c'est la panacée, mais c'est la routine type dont je me sers dans tout mes lisp. Un avantage certain, c'est que si ça plante, ça évite d'avoir tout le listing qui défile et ça remet toutes mes variables à leurs valeurs d’origine. Ah ! encore une chose, pour récupérer la dernière entité créée, je passe par un entlast Je pense que l’on à ses habitudes, et c’est dur d’en changer :P , mais il est toujours intéressant d’en discuter. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
bru Posté(e) le 1 juillet 2004 Auteur Posté(e) le 1 juillet 2004 Bonjour à vous deux Ca fait plus pro ! si on regarde le listing, autrement, pour l'utilisateur, c'est complètement transparent Ok! mais alors tu mets un (setvar "cmdecho" 0) ;-) Et pour les évolutions futures ? La notion de lwpolyline est apparut avec la 2000 ainsi que les codes de groupes du type AcDbpolyline. En faisant des entmake, je ne suis pas certain que ça fonctionne avec les évolutions futures d'autocad et de plus, si j'ai des prog qui tournent sur différentes versions, le entmake n'est pas forcément la solution idéale. Je ne pense pas: les plines aux encombrants vertex tournent toujours sous 2000. Et il me semble que AutoDESK a une philosophie de compatibilité ascendante: les fonctions vlisp du fait de leur vl- n'ecrasent pas les fonctions autolisp, lui même compatible avec l'ancestral diesel. En effet une lwpolyline ne tournera pas sous AutoCAD 14, mais (command "ucs" "n" "ob") non plus puisque jusqu'en acad14, il fallait faire (command "ucs" "e") si je me souviens bien. 1 partout ;-) Ah ! encore une chose, pour récupérer la dernière entité créée, je passe par un entlast DANGER !!!si pour une raison ou pour une autre, l'objet voulu n'est pas crée, (entlast) pointera un autre objet (le VRAI dernier)! Je pense que l’on à ses habitudes, et c’est dur d’en changer :P , mais il est toujours intéressant d’en discuter. on est là pour ca ;-)
bru Posté(e) le 1 juillet 2004 Auteur Posté(e) le 1 juillet 2004 (defun *erreurprog* (msg) (if (/= msg "Function cancelled") (if (= msg "quit / exit abort") (princ) (princ (strcat "\nErreur : " msg)) ) (princ) ) (remettre les variables à leurs valeurs d'origine) (setq *error* olderreur) (setvar "cmdecho" cmd) (princ) ) (setq olderreur *error*) (setq *error* *erreurprog*) (command "_.undo" "_group") (définition des variables) (routines) (remettre les variables à leurs valeurs d'origine) (command "_.undo" "_end") (setq *error* olderreur) Oui, c'est bien ca que je disais: mais perso, je trouve ca lourd, encombrant, et n'offre aucune souplesse... c'est justement pour cela que je m'oriente vers les entmake: pour son économie de moyens. entmake dépose un element dans un dessin. command est obligé de chambouler l'environnement de travail pour devoir le remettre en place.;; si il le veut bien !
Patrick_35 Posté(e) le 1 juillet 2004 Posté(e) le 1 juillet 2004 Ok! mais alors tu mets un (setvar "cmdecho" 0) ;-) Tout à fait En effet une lwpolyline ne tournera pas sous AutoCAD 14, mais (command "ucs" "n" "ob") non plus puisque jusqu'en acad14, il fallait faire (command "ucs" "e") si je me souviens bien. 1 partout ;-) D'où l'intérêt de passer par les commandes en anglais du style (command "_.ucs" "_new") DANGER !!!si pour une raison ou pour une autre, l'objet voulu n'est pas crée, (entlast) pointera un autre objet (le VRAI dernier)! Exact, mais en générale, ça se passe bien. Il faut vérifier que toutes les variables balancées dans le command soient bonnes. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Patrick_35 Posté(e) le 1 juillet 2004 Posté(e) le 1 juillet 2004 Ce n'est pas très souple, je le reconnais, mais un prog ne va pas forcement planter dans la fonction entmake, mais ailleurs, et de plus, ça évite de faire dérouler tout le listing du prog (quand il n'est pas protégé). Remarque, si il est parfait, pas de raison ;) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
bru Posté(e) le 2 juillet 2004 Auteur Posté(e) le 2 juillet 2004 Ce n'est pas très souple, je le reconnais, mais un prog ne va pas forcement planter dans la fonction entmake, mais ailleurs, et de plus, ça évite de faire dérouler tout le listing du prog (quand il n'est pas protégé). Remarque, si il est parfait, pas de raison ;) @+ tu parles des lignes de codes affichées lors d'erreur, par "étages" depuis la fonction qui a plantée jusqu'au (defun ...), comme sous acad14 ?pour ma part, je trouvais cela bien pratique ;-) ca change des enigmatiques "; error: bad association list: (D)"sais tu comment réactiver celà sous acad2k ?
Patrick_35 Posté(e) le 2 juillet 2004 Posté(e) le 2 juillet 2004 C'est bien de cela dont je parle, et comme je gère les erreurs depuis la v12, je n'ai pas regardé si ça avait évolué. Maintenant, avec la console visual lisp, ce doit être différent. Je ne connais pas trop car je reste avec le bon vieux bloc-notes pour faire mes lisps (l'habitude...), et comme je fais souvent des copier/coller d'anciennes fonctions que j'adapte sur mon nouveau lisp, je n’ai pas évolué. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
bonuscad Posté(e) le 5 juillet 2004 Posté(e) le 5 juillet 2004 Je reviens sur le sujet, car je viens d'être confronté à un problème que seul (entmake) à pu résoudre. J'ai voulu faire un code avec la commande ATTDEF pour définir des attributs. Le problème était qu'il m'était impossible de savoir comment était positionnés les drapeaux d'attribut (constant, invisible etc...) car se sont des bascules. Je n'ai trouvé aucun moyen de connaître leur état au lancement de la commande (si quelqu'un à la solution, ça m'interesse quand même ;) )Par ENTMAKE ce problème ne s'est pas posé. Je vous donne le code en exemple: il sert à positionner des bornes (bornage de terrain) et de les repérer en XYZ sur un calque inactif et verrouillé. Comme ca on peut les basculer vers excel sur un tableau avec un extracteur d'attribut. (defun c:borne (/ pto x y z) (cond ((eq (getvar "cvport") 1) (princ "\n** Commande autorisée uniquement dans l'espace objet." ) ) (T (if (not (tblsearch "LAYER" "borne_attributs")) (entmake '((0 . "LAYER") (100 . "AcDbSymbolTableRecord") (100 . "AcDbLayerTableRecord") (2 . "borne_attributs") (70 . 4) (62 . -3) (6 . "Continuous") (290 . 1) (370 . -3) ) ) ) (if (not (tblsearch "LAYER" "borne")) (entmake '((0 . "LAYER") (100 . "AcDbSymbolTableRecord") (100 . "AcDbLayerTableRecord") (2 . "borne") (70 . 4) (62 . 4) (6 . "Continuous") (290 . 1) (370 . -3) ) ) ) (if (not (tblsearch "STYLE" "$borne")) (entmake '((0 . "STYLE") (5 . "40") (100 . "AcDbSymbolTableRecord") (100 . "AcDbTextStyleTableRecord") (2 . "$borne") (70 . 0) (40 . 0.0) (41 . 1.0) (50 . 0.0) (71 . 0) (42 . 2.5) (3 . "monotxt.shx") (4 . "") ) ) ) (setvar "textstyle" "$borne") (if (not (tblsearch "BLOCK" "$borne")) (progn (entmake '((0 . "BLOCK") (2 . "$borne") (70 . 2) (10 0.0 0.0 0.0)) ) (entmake '((0 . "ATTDEF") (67 . 0) (8 . "borne_attributs") (62 . 1) (10 1.0 0.0 0.0) (40 . 1.0) (1 . "0") (50 . 0.0) (41 . 1.0) (51 . 0.0) (7 . "$borne") (210 0.0 0.0 1.0) (3 . "Numéro de la borne: ") (2 . "NO") (70 . 0) ) ) (entmake '((0 . "ATTDEF") (67 . 0) (8 . "borne_attributs") (10 1.0 -1.66667 0.0) (40 . 1.0) (1 . "X=0.0") (50 . 0.0) (41 . 1.0) (51 . 0.0) (7 . "$borne") (210 0.0 0.0 1.0) (3 . "Entrer le X du point: ") (2 . "ID-X") (70 . 0) ) ) (entmake '((0 . "ATTDEF") (67 . 0) (8 . "borne_attributs") (10 1.0 -3.33333 0.0) (40 . 1.0) (1 . "Y=0.0") (50 . 0.0) (41 . 1.0) (51 . 0.0) (7 . "$borne") (210 0.0 0.0 1.0) (3 . "Entrer le Y du point: ") (2 . "ID-Y") (70 . 0) ) ) (entmake '((0 . "ATTDEF") (67 . 0) (8 . "borne_attributs") (10 1.0 -5.0 0.0) (40 . 1.0) (1 . "Z=0.0") (50 . 0.0) (41 . 1.0) (51 . 0.0) (7 . "$borne") (210 0.0 0.0 1.0) (3 . "Entrer le Z du point: ") (2 . "ID-Z") (70 . 0) ) ) (entmake '((0 . "CIRCLE") (67 . 0) (8 . "borne") (10 0.0 0.0 0.0) (40 . 0.25) (210 0.0 0.0 1.0) ) ) (entmake '((0 . "CIRCLE") (67 . 0) (8 . "borne") (10 0.0 0.0 0.0) (40 . 0.40) (210 0.0 0.0 1.0) ) ) (entmake '((0 . "ENDBLK"))) ) ) (if (not nob) (setq nob 1) ) (initget 8) (while (setq pto (getpoint "\nPoint de la borne: ")) (initget 6) (setq nb (getint (strcat "\nNo de la borne<" (itoa nob) ">: "))) (if (not nb) (setq nb nob) ) (setq pto (trans pto 1 0) x (car pto) y (cadr pto) z (caddr pto) ) (entmake (append '((0 . "INSERT") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "borne") (100 . "AcDbBlockReference") (66 . 1) (2 . "$borne") (41 . 1.0) (42 . 1.0) (43 . 1.0) (50 . 0.0) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0 0.0 1.0) ) (list (cons 10 pto)) ) ) (entmake (append '((0 . "ATTRIB") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "borne_attributs") (62 . 1) (100 . "AcDbText") (40 . 1.0) (50 . 0.0) (41 . 1.0) (51 . 0.0) (7 . "$borne") (71 . 0) (72 . 0) (11 0.0 0.0 0.0) (210 0.0 0.0 1.0) (100 . "AcDbAttribute") (2 . "NO") (70 . 0) (73 . 0) (74 . 0) ) (list (cons 1 (strcat "Borne N°:" (itoa nb)))) (list (cons 10 (list (+ (car pto) 1.0) (cadr pto)))) ) ) (entmake (append '((0 . "ATTRIB") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "borne_attributs") (100 . "AcDbText") (40 . 1.0) (50 . 0.0) (41 . 1.0) (51 . 0.0) (7 . "$borne") (71 . 0) (72 . 0) (11 0.0 0.0 0.0) (210 0.0 0.0 1.0) (100 . "AcDbAttribute") (2 . "ID-X") (70 . 0) (73 . 0) (74 . 0) ) (list (cons 1 (strcat "X=" (rtos x 2 4)))) (list (cons 10 (list (+ (car pto) 1.0) (+ (cadr pto) -1.66667))) ) ) ) (entmake (append '((0 . "ATTRIB") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "borne_attributs") (100 . "AcDbText") (40 . 1.0) (50 . 0.0) (41 . 1.0) (51 . 0.0) (7 . "$borne") (71 . 0) (72 . 0) (11 0.0 0.0 0.0) (210 0.0 0.0 1.0) (100 . "AcDbAttribute") (2 . "ID-Y") (70 . 0) (73 . 0) (74 . 0) ) (list (cons 1 (strcat "Y=" (rtos y 2 4)))) (list (cons 10 (list (+ (car pto) 1.0) (+ (cadr pto) -3.33333))) ) ) ) (entmake (append '((0 . "ATTRIB") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "borne_attributs") (100 . "AcDbText") (40 . 1.0) (50 . 0.0) (41 . 1.0) (51 . 0.0) (7 . "$borne") (71 . 0) (72 . 0) (11 0.0 0.0 0.0) (210 0.0 0.0 1.0) (100 . "AcDbAttribute") (2 . "ID-Z") (70 . 0) (73 . 0) (74 . 0) ) (list (cons 1 (strcat "Z=" (rtos z 2 4)))) (list (cons 10 (list (+ (car pto) 1.0) (+ (cadr pto) -5.0))) ) ) ) (entmake '((0 . "SEQEND"))) (setq nob (1+ nob)) (initget 8) ) ) ) (princ) ) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
Patrick_35 Posté(e) le 5 juillet 2004 Posté(e) le 5 juillet 2004 Salut BonusCad Je pense que la solution est dans le code 70 des attdef avec un (logand attribut n)Ce serait sûrement dans le même logique du code 70 pour les calques Un exemple que j'ai déjà utilisé pour des calques (mais pas pour des attributs, malheureusement) (setq couche (tblsearch "layer" (cdr (assoc 8 obj))) etat_plan (cdr (assoc 70 couche)) acti_plan (cdr (assoc 62 couche)) gele_plan (logand etat_plan 1) verr_plan (logand etat_plan 4) xref_plan (logand etat_plan 16)) gele_plan=1 --> Calque geléverr_plan=4 --> Calque verrouilléxref_plan=16 --> Calque dépendants des xref @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
bonuscad Posté(e) le 6 juillet 2004 Posté(e) le 6 juillet 2004 Bien saisi l'état d'un attdef par le code 70. Mais le problème n'était pas là, je voulais connaitre l'état des drapeaux AVANT de lancer la commande ATTDEF et de définir de nouvaux attributs.Ces drapeaux prennent la dernière valeur qui leur ont été attribués lors des précédentes utilisations dans la même session.Trouver le dernier attribut qui a été créer pour récupérer l'état des drapeaux n'est pas évident et pas fiable (si cela a été fait sous une autre session) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
Patrick_35 Posté(e) le 6 juillet 2004 Posté(e) le 6 juillet 2004 Ah, alors c'est dans la variable aflags @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
bonuscad Posté(e) le 6 juillet 2004 Posté(e) le 6 juillet 2004 Merci de m'avoir rafraichi la mémoire! :D Comme dirait Dutronc J'y pense puis j'oublie, c'est la, c'est la vie! Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
bru Posté(e) le 7 juillet 2004 Auteur Posté(e) le 7 juillet 2004 Comme dirait Dutronc J'y pense puis j'oublie, c'est la, c'est la vie! l'homme qui revait d'être une hotesse de l'air ?
gile Posté(e) le 24 avril 2005 Posté(e) le 24 avril 2005 A propos du début de la discussion (avantages et incovénients des méthodes entmake et command), une entité créée avec entmake n'est pas enregistrée par "undo", donc si on fait un undo après une expression LISP utilisant entmake on annule la commande précédent cette expression (à moins qu'il y ait un paramétrage que je ne connais pas). Sinon, j'ai eu pas mal de difficultés à faire une lwpolyline avec entmake dans un SCU différent du SCG (en 3D).Alors, pour ceux que çà intéresse, ce code semble marcher dans tous les cas : (entmake (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(100 . "AcDbPolyline") '(90 . 4) ; nombre de sommets '(70 . 1) ; ouverte (0) ou fermée (1) (cons 38 (caddr (trans '(0 0) 1 (extr_dir)))) ; élévation (cons 10 (trans pt1 1 (extr_dir))) (cons 10 (trans pt4 1 (extr_dir))) (cons 10 (trans pt2 1 (extr_dir))) (cons 10 (trans pt3 1 (extr_dir))) (cons 210 (extr_dir)) ; direction d'extrusion ) ) Pour la direction d'extrusion : (defun extr_dir (/ vec org) (setq vec (trans '(0 0 1) 1 0) org (trans '(0 0 0) 1 0); (getvar "ucsorg") ) (list (- (car vec) (car org)) (- (cadr vec) (cadr org)) (- (caddr vec) (caddr org)) ) )
gile Posté(e) le 25 avril 2005 Posté(e) le 25 avril 2005 Oups ! ... Je n'avais pas tout bien vérifié, le calcul pour l'élévation ne fonctionnait pas dans tous les cas. Voilà le nouveau code : (entmake (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(100 . "AcDbPolyline") '(90 . 4) '(70 . 1) (1) (cons 38 (- (caddr pt1) (caddr (trans '(0 0) 0 1)))) (cons 10 (trans pt1 1 (extr_dir))) (cons 10 (trans pt2 1 (extr_dir))) (cons 10 (trans pt3 1 (extr_dir))) (cons 10 (trans pt4 1 (extr_dir))) (cons 210 (extr_dir)) ) ) ) Toujours avec (extr_dir) et les coordonnées de pt1, pt2, pt3, pt4 dans le SCU courant.
Messages recommandés
Créer un compte ou se connecter pour commenter
Vous devez être membre afin de pouvoir déposer un commentaire
Créer un compte
Créez un compte sur notre communauté. C’est facile !
Créer un nouveau compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant