Aller au contenu

Lisp MDA


nen
 Partager

Messages recommandés

Bonjour le forum :D,

 

Je me permets de revenir de vers vous avec cette problématique récurrente :blink: .

J’avais mis le post [RESOLU] à ma première question de l’époque mais jamais eu de réponse à ma dernière question et aujourd’hui j’en aurais besoin. Mon lien

 

En effet je voudrais récupérer une valeur d'un bloc avec plusieurs attributs vers un autre bloc avec un attribut. Le nom des blocs est différent, le nom des étiquettes est différente, sur des calques différents et de couleur différente en faite rien est identique.

Je joins aussi le lisp mda.lsp qui semble être très bien mais malheureusement ne fonctionne pas une fois validé mon choix.

Je l’ai essayé avec plusieurs blocs, il n’a jamais fonctionné.

 

Je joins un dwg avec deux blocs différent.

Je voudrais récupérer la valeur en rouge du bloc A vers le bloc B et si possible pouvoir aller dans les deux sens.

 

Ma question est pourquoi le lisp mda ne fonctionne pas ?, même si les blocs sont dans le même calque.

 

 

Je vous remercie de votre aide vous me sauveriez la vie :( .

 

Meilleures salutations

 

(defun c:mda (/)
 (setvar "cmdecho" 0)
 (setvar "CURSORSIZE" 10)
 (setq osm (getvar "osmode"))
 (if (and (setq source (car (entsel "\nCLIQUER SUR LE BLOC DE REFERENCE : ")))
          (setq source (vlax-ename->vla-object source))
          (= (vla-get-objectname source) "AcDbBlockReference")
     )
   (progn (setq layerbloc (vla-get-layer source)
                namebloc  (vla-get-effectivename source)
          )
   )
 )
 (setq compt 0
       propdynnom nil
       propdynnom2 nil
       propdynnom3 nil
       pop2 nil
 )
 (foreach att (vlax-invoke source 'getattributes)
   (setq propdynnom2 (cons (cons (vla-get-tagstring att) (vla-get-textstring att)) propdynnom2))
 )
 (setq propdynnom (vl-sort propdynnom2 (function (lambda (p1 p2) (< (car p1) (car p2))))))
 (prompt "\nSELECTIONNER LES BLOCS A MODIFIER:")
 (setq selinsert (ssget (list (cons 0 "INSERT") )))
 (setq com (sslength selinsert))
 (boitepropdyn3)
 (foreach att (vlax-invoke source 'getattributes)
   (progn
     (if (member (vla-get-tagstring att) listeparam)
       (setq propdynnom3 (cons (cons (vla-get-tagstring att) (vla-get-textstring att)) propdynnom3))
     )
   )
 )
 (setvar "CURSORSIZE" 100)
 (setq compt 0)
 (acet-ui-progress-init "Avancement" com)
 (while (< compt com)
;;;    (boiteavancement)
   (if (= (vla-get-effectivename (vlax-ename->vla-object (cdr (assoc -1 (entget (ssname selinsert compt))))))
          namebloc
       )
     (progn
       (foreach bidyn propdynnom3
         (progn (setq nomprop (car bidyn)
                      valprop (cdr bidyn)
                )
                (foreach prop (vlax-invoke (vlax-ename->vla-object (cdr (assoc -1 (entget (ssname selinsert compt)))))
                                           'getattributes
                              )
                  (if (= (vla-get-tagstring prop) nomprop)
                    (vla-put-textstring prop valprop)
                  )
                )
         )
       )
     )
   )
;;;    (prompt (strcat "\rENTITE(S) TRAITEE(S) : "
;;;                    (rtos compt 2 0)
;;;                    " SUR : "
;;;                    (rtos com 2 0)
;;;            )
;;;    )
   (acet-ui-progress-init (strcat "Avancement " (rtos (/ (* compt 100) (float com)) 2 2) " %") com)
   (acet-ui-progress-safe compt)
   (setq compt (1+ compt))
 )
 (acet-ui-progress-done)
 (setvar "osmode" osm)
 (princ)
)



(defun boitepropdyn3 (/ tmp file fuzz
                     ;;ret
                     pn av dcl_id val)
 (setq tmp  (vl-filename-mktemp "Tmp.dcl")
       file (open tmp "w")
       ret  nil
 )
 (write-line (strcat "DynBlkProps:dialog{label=\"Blocs dynamiques\";"
                     "
             :text{label=\"Nom du bloc : \""
                     (vl-prin1-to-string namebloc)
                     ";}
             :text{label=\"Nombre de bloc : "
                     (itoa com)
                     "\"; }

             :boxed_column{label=\"Propriétés dynamiques\";"
             )
             file
 )
 (foreach pn propdynnom
   (progn (if (= (numberp (cdr pn)) nil)
            (setq lab1 (strcat (car pn) "  =  " (cdr pn)))
            (setq lab1 (strcat (car pn) "  =  " (rtos (cdr pn) 2)))
          )
          (write-line (strcat ":row{:toggle {key = \"" (car pn) "\"; label =" (vl-prin1-to-string lab1) ";}}")
                      file
          )
   )
 )
 (write-line "}spacer;ok_cancel;}" file)
 (close file)
 (setq dcl_id (load_dialog tmp))
 (if (not (new_dialog "DynBlkProps" dcl_id))
   (exit)
 )
 (action_tile
   "accept"
   "(foreach p propdynnom
(if (assoc (car p ) POP2)
(setq val (nth (atoi (get_tile (car p ))) (cdr (assoc (car p ) POP2))))
(setq val (get_tile (car p ))))

(if (and val (/= val \"\"))
(setq ret (cons (cons (car p ) val) ret)))
)
(and (not ret) (setq ret T))
(done_dialog)"
 )
 (action_tile "cancel" "(setq ret nil)")
 (start_dialog)
 (unload_dialog dcl_id)
 (vl-file-delete tmp)
 (setq listeparam nil)
 (foreach p ret
   (if (= (atoi (cdr p)) 1)
     (setq listeparam (cons (car p) listeparam))
   )
 )
)

Lisp_MDA-dwg.zip

Lien vers le commentaire
Partager sur d’autres sites

Coucou,

 

Pour commencer je te conseille de limiter au maximum le nombre de variables globales (surtout lors de l'utilisation de boucles) et pour chat, de favoriser l'utilisation d'arguments pour tes fonctions.

Typiquement, rien ne t'empêche d'ajouter l'argument "propdynnom" à ta fonction boitepropdyn3 pour éviter de devoir l'utiliser comme variable globale. Et d'utiliser également les fonctions pour créer un retour permettant l'utilisation d'un (setq var (function arg1 ar2)).

 

Ensuite, que te renvoie l'historique de commande après le lancement de ton programme ? Ou bien sais-tu à quel endroit cela bug-t-il ?

 

Bisous,

Luna

Lien vers le commentaire
Partager sur d’autres sites

Déjà je ne saisis pas bien, car tu as dis que ton programme doit permettre de modifier un attribut par rapport à un autre, sauf que ces attributs n'ont rien à voir en commun (donc en clair, il s'agit de blocs totalement différents) or dans ton programme, tu filtres tes blocs par rapport à leur effectivename et leur correspondance exacte avec le bloc de référence...

 

Normalement le bloc de référence (ou source) doit correspondre à la liste de valeurs souhaitées et le jeu de sélection se compose de blocs différents dans lesquels tu viens modifier la valeur de leur attribut, sans connaître la correspondance avec l'attribut source, nan ?

 

Bisous,

Luna

Lien vers le commentaire
Partager sur d’autres sites

Bonjour Luna,

 

Je te remercie pour tes messages :D .

Malheureusement ce lisp n’est pas de moi, je n’ai pas les compétences pour l’écrire :( .

Il est de PHILPHIL, transmis lors de l’un de mes précédents postelien, je trouve l’idée très bien, sauf qu’il ne fonctionne pas quand je valide :blink: .

 

Oui en effet les blocs sont différents et n’ont rien en commun. Ma problématique, je reçois un plan avec des blocs qui contient plusieurs attributs et je dois récupérer une des valeurs et la copier dans un autre bloc qui m’est imposer pour la réalisation d’un plan.

 

Il y a environ 300 blocs sur le plan, si je peux éviter de les remplir manuellement cela m’arrangerait et vu le nombre me ferait gagner beaucoup de temps.

 

S’il est possible de faire quelques choses, je t’en remercie d’avance :D

 

 

Meilleures salutations

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Avec ce simple code, on doit cliquer l'attribut source puis l'attribut destination et le contenu du 1er est recopié dans le second et ça boucle

 

(defun C:ATT2ATT ( / oAtt1 oAtt2 oAtt1Lst oAtt2Lst sVal)
 (while (and (setq oAtt1 (car (nentsel "\nAttribut source : ")))
     	(setq oAtt1Lst (entget oAtt1))
     	(= "ATTRIB" (cdr (assoc 0 oAtt1Lst)))
     	(setq oAtt2 (car (nentsel "\nAttribut destination : ")))
     	(setq oAtt2Lst (entget oAtt2))
     	(= "ATTRIB" (cdr (assoc 0 oAtt2Lst)))
	)
   (setq sVal (cdr (assoc 1 oAtt1Lst)))
   (setq oAtt2Lst (subst (cons 1 sVal) (assoc 1 oAtt2Lst) oAtt2Lst))
   (entmod oAtt2Lst)
   (entupd oAtt2)
 )
)

 

 

Olivier

Lien vers le commentaire
Partager sur d’autres sites

hello NEN

 

je ne suis pas informaticien dans l'ame, mes LISP sont loin d'etre parfait et pure dans leurs écriture, ils fonctionnent tout simplement.

 

celui ci ne marche effectivement que entre blocs ayant des attributs de meme NOM, il faut qu'il y est un minimum de correspondance pour que ce marche.

en enlevant certaines lignes de code, ca fonctionne entre blocs de nom différent, calque différent mais pas de NOM d'attribut différent.

 

A => A

B => B

C => C

 

ta demande est :

 

A => C

B => D

C => Z

 

en essayant avec un Lisp ( je sais plus le nom ) de Gile ou Patrick35 ( je ne sais plus ) exportant les attributs dans un fichier excel et apres manipulation dans excel tu réimportes, ca devrait marcher

 

A+, Phil

Autodesk Architecture 2019 sous windows 10 64

24 pouces vertical + 30 pouces horizontal + 27 pouces horizontal

Lien vers le commentaire
Partager sur d’autres sites

Hello Mr nen

 

Comme le dit "si bien" Mr PHILPHIL, il y a l excellente routine "CAT" de notre regrette Patrick_35 !

https://forums.autodesk.com/t5/autocad-tous-produits-francais/lisp-les-lisp-de-patrick-35/td-p/8884693

 

Tu selectionnes un Bloc origine puis les Blocs destinations ...

TOUS les attributs du Bloc origine sont copies dans les attributs des Blocs destinations !

Aucun controle de coherence : par exemple etiquettes d attributs (ATTDEF) identiques !!

C une copie "bete et mechante" des attributs dans l'ordre du Bloc origine

vers les attributs des Blocs destinations (dans leur ordre) ...Aucun test sur ATTDEF !

 

LA SANTE, Bye, lecrabe ... Deja 41 jours de retraite ...

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Hello

 

Et vous trouverez ci-apres une version speciale de "CAT" nommee "CATP"

Selection de 1 Bloc Origine ...

Selection successive UN PAR UN du Bloc destination

et transfert/copie des attributs avec le MEME Nom d etiquette (ATTDEF)

 

Routine tiree de mon stock de 3001 routines ...

 

LA SANTE, Bye, lecrabe ... Deja 41 jours de retraite ...

 


;; 
;; http://cadxp.com/topic/43655-resolu-recuper-donnees-dun-bloc-vers-un-autre-bloc/page__pid__269444#entry269444
;;
;; Une modification de CAT pour recopier la valeur des etiquettes si elles ont le même nom! 
;; 

;;;=================================================================
;;;
;;; CATP.LSP V1.00
;;;
;;; Copier des attributs si les etiquettes sont identiques
;;;
;;; Copyright (C) Patrick_35
;;;
;;;=================================================================

(defun c:catp(/ att bl doc ent s sel *errcat*)

;=========================================================================
; Gestion des erreurs
;=========================================================================

 (defun *errcat* (msg)
   (or (member (strcase msg) '("FUNCTION CANCELLED" ""QUIT / EXIT ABORT"" "FONCTION ANNULEE" "QUITTER / SORTIR ABANDON"))
     (princ (strcat "\nErreur : " msg))
   )
   (vla-endundomark doc)
   (setq *error* s)
   (princ)
 )

 (vl-load-com)
 (setq s *error*
       *error* *errcat*
       doc (vla-get-activedocument (vlax-get-acad-object))
 )
 (vla-startundomark doc)
 (and  (setq ent (entsel "\nSelectionnez le bloc d'origine : "))
       (setq ent (vlax-ename->vla-object (car ent)))
       (eq (vla-get-objectname ent) "AcDbBlockReference")
       (eq (vla-get-hasattributes ent) :vlax-true)
       (setq att (vlax-invoke ent 'getattributes))
   (progn
     (while (setq ent (entsel "\nSelectionnez les blocs destinataires : "))
       (setq ent (vlax-ename->vla-object (car ent)))
       (and (eq (vla-get-objectname ent) "AcDbBlockReference")
         (mapcar '(lambda(a / B)
                   (foreach b (vlax-invoke ent 'getattributes)
                     (and (eq (strcase (vla-get-tagstring a)) (strcase (vla-get-tagstring B)))
                       (vla-put-textstring b (vla-get-textstring a))
                     )
                   )
                 )
                 att
         )
       )
     )
   )
 )
 (vla-endundomark doc)
 (setq *error* s)
 (princ)
)

(setq nom_lisp "CATP")
(if (/= app nil)
 (if (= (strcase (substr app (1+ (- (strlen app) (strlen nom_lisp))) (strlen nom_lisp))) nom_lisp)
   (princ (strcat "..." nom_lisp " charge. "))
   (princ (strcat "\n" nom_lisp ".LSP Charge.....Tapez " nom_lisp " pour l'executer. ")))
 (princ (strcat "\n" nom_lisp ".LSP Charge......Tapez " nom_lisp " pour l'executer. ")))
(setq nom_lisp nil)
(princ)

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Bonsoir Philphil,

Bonsoir lecrabe,

 

Je vous remercie pour votre message, vos conseils et votre précieuse aide :) .

En effet j’utilise le Lisp MDA souvent et il fonctionne très bien, sauf dans mon cas actuel.

Je viens aussi d’essayer le Lisp Cat et CatP avec le même résultat.

 

Est-il possible de copier un attribut d’un bloc qui en comporte plusieurs à un autre bloc sans qu’il y ait aucune correspondance entre ses deux blocs ?

 

PS : Félicitation et profiter bien de votre retraite et sortez couvert

 

Meilleures salutations

Lien vers le commentaire
Partager sur d’autres sites

Hello

 

Bon désolé j avais reteste CAT et CATP sur des Blocs multi-attributs Persos !

 

J aurais du tester avec TES Blocs !

 

Des que j ai du temps, je le fais...

 

SVP tu es avec quelle version de AutoCAD: 2021/2020/2019/2018/etc ??

 

LA SANTE, Bye, lecrabe

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Bonjour lecrabe :D ,

 

En effet si tu essayes avec les miens c’est mieux ;) .

J’ai des plans avec des blocs de différentes provenances, ils n’ont donc rien en commun.

L’idée, avec mes blocs je voudrais pouvoir copier la valeur X(1), Y(2) ou Z(3) du bloc A et la coller sur le bloc B avec ou sans donnée (vide).

J’ai la version AutoCAD 2021.

Pas de soucis ;) .

 

Merci pour ton aide :)

 

Meilleures salutations

Lien vers le commentaire
Partager sur d’autres sites

Hello

 

1) OK j ai teste CAT et CATP (avec AutoCAD 2016 et 2021) sur ton DWG exemple !

 

2) CATP ne fait RIEN : normal car les Etiquettes (ATTDEF) sont differentes !

 

3) CAT fonctionne comme prevu !

En effet il copie le contenu des attributs du Bloc A vers le Bloc B dans l'ordre des attributs TROUVES !

Le Bloc A a 3 attrs et le Bloc B a 1 seul attr :

donc le seul attr du Bloc B est "ecrase" par le contenu du 1er attr du Bloc A = OK pour moi !

 

4) J ai teste ton Lisp MDA qui fonctionne bien pour moi sur AutoCAD 2016 et AutoCAD 2021

MAIS il ne fonctionne pas depuis le Bloc A vers le Bloc B !

En fait il ne fonctionne que depuis un Bloc A vers N Blocs A ...

 

5) SVP peux tu expliciter un peu plus !?

 

LA SANTE, Bye, lecrabe ... Deja 43 jours de retraite ...

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

hello

 

4) J ai teste ton Lisp MDA qui fonctionne bien pour moi sur AutoCAD 2016 et AutoCAD 2021

MAIS il ne fonctionne pas depuis le Bloc A vers le Bloc B !

En fait il ne fonctionne que depuis un Bloc A vers N Blocs A ...

 

c'est normal c'est son boulot.

 

je dois avoir une autre version, mais seulement pour des blocs qui ne soit pas sur le meme calque ou de nom different,

mais il faut absolument qu'il y est concordance de nom d'attribut

 

a+, Phil

Autodesk Architecture 2019 sous windows 10 64

24 pouces vertical + 30 pouces horizontal + 27 pouces horizontal

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Je vous remercie pour votre aide :) .

 

Pour répondre sur le point 3), en effet il fait une copie de l’attribut, mais uniquement la première valeur sur un bloc qui en contient plusieurs.

 

Ma problématique c’est que je reçois des plans avec blocs avec plusieurs attributs de différentes sociétés

et je dois récupérer une valeur pour la copier sur mon bloc (bloc B ) à un seul attribut.

Les blocs ont différentes provenances, ils n’ont rien en commun.

 

Ci-joint un dwg (Dessin1.zip) avec deux blocs, bloc A et bloc B (mon bloc).

Je voudrais copier la valeur de l’étiquette « ZONE » du bloc A vers le bloc B.

 

Merci d’avance, Meilleures salutations

Dessin1.zip

Lien vers le commentaire
Partager sur d’autres sites

Hello

 

1) Tres mauvaise idee d avoir un Bloc avec un Attribut contenant des caracteres speciaux / accentues :

SVP il faudrait changer "N°" en "NO" ou "NUMERO" !

 

2) TOUJOURS pas sur d avoir compris ta demande !

 

3) Veux tu simplement une Routine Lisp qui "prennent" TOUS les attributs du Bloc A

pour les concatener et copier le contenu vers le seul attribut du Bloc B ??

 

SI OUI, SVP quel sera le separateur entre les N attributs ?

Qq exemple : "/" , " / " , "-" , " - " , "_" , " _ " , etc

 

4) Ou bien veux tu transferer simplement l attribut ZONE vers l attribut "NO / NUMERO" ??

 

LA SANTE, Bye, lecrabe

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

hello nen

 

tite question

 

tes blocs que tu recois, ce sont toujours les meme, des meme interlocuteurs ?

ou chaque semaine tu en as des nouveaux avec des noms d'attributs qui changent, ou tu veux récupérer les données vers TES blocs avec TES noms d'attribut.

ca change tout pour l'élaboration d'un lisp spécifique a toi, et toi seul.

 

ca peut etre

 

lecture d'un blocs, récupération du nom de l'attribut et de sa valeur.( ceux donné par tes interlocuteur, sur une couche determiné )

recherche d'un bloc ( le tiens ) le plus proche a quelque unites a la ronde je crois qu'il y a un lisp pour ca ) sur une couche bien déterminé.

correspondance des attributs,

ecriture dans TON blocs des données récupérer.

 

sans que tu es a cliquer bloc par blocs

 

 

a+

 

Phil

Autodesk Architecture 2019 sous windows 10 64

24 pouces vertical + 30 pouces horizontal + 27 pouces horizontal

Lien vers le commentaire
Partager sur d’autres sites

Hello

 

Voir ci-apres la routine VLisp "AttA_to_AttB" magique ... MERCI Mr pbejse !

 

1) Tu cliques SUR l attribut qui t interesse

2) Ensuite tu selectionnes tes N Blocs destination

3) Enfin tu donnes le nom exact de l attribut concerne (sur les Blocs destination)

 

Routine testee sur TON DWG et mes DWGs ...

 

LA SANTE, Bye, lecrabe ... Deja 43 jours de retraite ...

 

;; 
;; Routine: AttA_to_AttB by pbejse pour Patrice
;; 

(vl-load-com) 

(defun c:AttA_to_AttB (/ TagSource TagString TagTarget TargetBlocks)

 (if (and
(setq TagSource (car (nentselp "\nSelect Attribute ")))
(eq "ATTRIB" (cdr (assoc 0 (setq ent (entget TagSource)))))
(setq TagString (Cdr (Assoc 1 ent)))
(princ "\nSelect Attribute Blocks to process")
(setq TargetBlocks (ssget "_:L" '((0 . "INSERT") (66 . 1))))
(setq TagTarget (strcase (getstring "\nEnter target TAG name : ")))
     )
   (repeat (setq i (sslength TargetBlocks))
     (vl-some
'(lambda (atb)
   (if (eq (strcase (vla-get-tagstring atb)) TagTarget)
     (progn
       (setq b (vla-get-textstring atb))
       (Vla-put-textstring atb TagString)
       (princ
	 (strcat "\nReplaced " B) 
       )
     )
   )
 )
(vlax-invoke
  (vlax-ename->vla-object
    (ssname TargetBlocks (setq i (1- i)))
  )
  'GetAttributes
)
     )
   )
 )
 (princ)
)

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Super merci lecrabe :)

 

En effet cela fonctionne nickel :D .

Pour copier la valeur d’un attribut vers plusieurs blocs ayant le même nom d’attribut, il est nickel

 

Dans mon cas j’ai environ 300 blocs avec des valeurs différentes sur lesquels je dois faire cette manipulation… cela va vite devenir pénible.

 

Est-il possible qu’il ne demande pas le nom de l’attribut sur le bloc de destination ?

Une fois l’objets sélectionner il copie directement sans demander le nom de l’attribut.

 

Meilleures salutations - Sortez couvert

Lien vers le commentaire
Partager sur d’autres sites

Hello

 

Voir ci-apres la routine VLisp "AttA_to_Att1" magique ... MERCI Mr pbejse !

 

Routine IDEM a la precedente "AttA_to_AttB"

SAUF que on ne pose pas la question pour l Attribut destination !

DONC on copie dans le 1er Attribut TROUVE !

 

LA SANTE, Bye, lecrabe ... Deja 46 jours de retraite ...

 

;; 
;; Routine: AttA_to_Att1 by pbejse pour Patrice - Version derivee de "AttA_to_AttB"
;; 
;; VLisp version 
;; 

(vl-load-com) 

(defun c:AttA_to_Att1 (/ TagSource TagString TargetBlocks)
 (and
   (setq TagSource (car (nentselp "\nSelect Attribute ")))
   (eq "ATTRIB" (cdr (assoc 0 (setq ent (entget TagSource)))))
   (setq TagString (Cdr (Assoc 1 ent)))
   (princ "\nSelect Attribute Blocks to process")
   (setq TargetBlocks (ssget "_:L" '((0 . "INSERT") (66 . 1))))
   (princ (strcat "\n"
	   (itoa (setq i (sslength TargetBlocks)))
	   " item(s) replaced with "
	   TagString
   )
   )
   (repeat i
     (Vla-put-textstring
(Car (vlax-invoke
       (vlax-ename->vla-object
	 (ssname TargetBlocks (setq i (1- i)))
       )
       'GetAttributes
     )
)
TagString
     )
   )
 )
 (princ)
) 

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

Chargement
 Partager

×
×
  • Créer...