-
Compteur de contenus
1 113 -
Inscription
-
Dernière visite
-
Jours gagnés
42
Type de contenu
Profils
Forums
Calendrier
Blogs
Tout ce qui a été posté par Luna
-
[CAD MAP 3D] Polyligne ou ligne avec distance affiché sur l'élément
Luna a répondu à un(e) sujet de drault dans AutoCAD 2018
Coucou, Tu ne peux pas demander à ton SI de vous installer le fichier .msi "OVERRULE" ? Je doute que cela pose un réel soucis en soit, et utilisant personnellement ce programme il est très efficace et complet 😉 Quand tu dis, SEGLEN ne se lance pas, peux-tu être plus précis sur l'erreur rencontrée ? Car je viens de l'essayer sur mon poste et je n'ai aucun soucis... Après si tu n'as aucun droit d'écriture, peut-être que la création du fichier temporaire .dcl pour la boîte de dialogue pose un problème mais je n'en sais trop rien.. Je n'ai aucun problème non plus avec le programme de BonusCAD... On est bien d'accord que tu te contentes de copier l'intégralité du texte située dans la fenêtre balisée <code> de CADxp, que tu colles cela dans un fichier bloc note vierge, et que tu fais "enregistrer sous" en ajoutant l'extension ".lsp" à la suite du nom de ton fichier ?! Ensuite il te suffit de faire APPLOAD et d'importer le fichier .lsp nouvellement crée dans ton dessin et de lancer la commande SEGLEN (pour le programme de (gile)) ou la commande LABEL_DIST_VTX (pour le programme de BonusCAD) !! Du coup si tu veux dans l'ordre : - Le fichier .msi Overrule permet d'ajouter une option 'Polyligne Overrule' dans les options du clic droit lorsque tu as sélectionné uniquement une ou plusieurs polylignes ("LWPOLYLINE", non fonctionnel avec les lignes, arcs, polylignes 3D, ...). Cette option possède deux états : Actif ou Inactif. La valeur Actif permet d'ajouter les longueurs de chaque segments aux polylignes sélectionnées et utilise les valeurs de "TEXTSIZE" (pour la hauteur des textes) et "LUPREC" (pour le nombre de décimales après la virgule), à savoir que si tu veux mettre à jour la hauteur de texte ou le nombre de décimale, il suffit de refaire actifs sur les polylignes en questions. L'option Inactif permet de supprimer les textes des polylignes sélectionnées. L'atout principal de cette commande c'est que les textes sont directement intégrés à la polyligne donc il n'y a pas d'entités supplémentaires dans le dessin, les textes suivent en temps réel le segment avec lequel ils sont associés (position milieu, direction, sens, longueur, ...) et ainsi tout est dynamique ! Sans passer par le clic droit, tu peux passer par les commandes SEGLEN_OVERRULE_ON et SEGLEN_OVERRULE_OFF 😉 - La commande SEGLEN permet de paramétrer de manière assez détaillée les textes qui seront ajoutés au-dessus de chaque segments des polylignes sélectionnées (fonctionnel aussi bien avec les polylignes, lignes, polylignes 3D) grâce à une boîte de dialogue. Les options dispo dans la boîte de dialogue sont : Style de texte, Justification du texte, Hauteur de texte, préfixe, suffixe, Orientation du texte (Horizontal ou Aligné au segment) et l'option "Forcer le sens de lecture". Cependant, les textes sont des entités supplémentaires, non dynamiques et non liés à la polyligne (donc si tu déplaces la polylignes, modifie ses sommets etc... les textes ne seront plus cohérents avec le tracé. En clair, le programme permet de faire un linéaire à un instant T, sans suivre l'évolution des objets). Le nombre de décimale est définie également par "LUPREC". - La commande LABEL_DIST_VTX permet d'ajouter les longueurs de chaque segments de manière rapide en n'ayant que la hauteur du texte comme option. Le nombre de décimale semble être défini à 2 mais les textes insérés appartiennent à un calque nommé "DIMENSIONS" et ont le style de texte "DIM-VERTEX" (donc facilement sélectionnables). Cependant, il ne fonctionne qu'avec les polylignes (donc pas les lignes, les arcs, polylignes 3D, ...) et au même titre que le programme SEGLEN de (gile), il n'y a pas de dynamisme entre les textes et les objets Polylignes. Donc après, tu choisis ce qui te correspond le mieux, mais aucun de ces programmes ne présentent d'erreur(s) lors de l'exécution (seul le .msi peut poser problème à l'installation car nécessite des droits Admin) ! Bisous, Luna -
[CAD MAP 3D] Exporter Propriétés du dessin personnalisées
Luna a répondu à un(e) sujet de drault dans AutoCAD 2018
@drault, Comme je l'ai dit précédemment, cela n'est qu'une simple suggestion. Je pense qu'à ce stade, il est préférable d'utiliser SuperAutoScript pour le faire fonctionner sur un ensemble de dessins au lieu d'utiliser le programme LISP que j'ai écrit. De plus, j'ai remarqué que la fonction (OpenDrawingDBX) de (gile) permet de récupérer des informations d'un dessin fermé, mais pas de le modifier donc ce programme ne peut pas exporter des données sur un dessin fermé. Le programme MISI était un simple exemple, mais mon premier conseil était d'utiliser les fonctions (ExportSumInfo) et (ImportSumInfo) dans un script (ne sachant pas comment fonctionnent les scripts, je ne peux pas t'aider sur ce point...) pour obtenir ce que tu désires. Travaillant peu sur la gestion des fichiers en masse, mes compétences de programmation dans ce domaine sont également très faibles donc je ne sais pas combien de temps il me faudrait pour corriger cette histoire de .dwg non-ouverts pour l'import. Pour ce qui est de l'utilisation actuelle du programme, si tu parles de la fenêtre intitulée "Sélection du fichier .dwg cible" qui s'ouvre en boucle, c'est tout à fait normal car comme je l'ai dit précédemment je ne sais pas comment tu voulais sélectionner tes fichiers, donc le seul moyen viable que j'ai trouvé, c'est d'ouvrir une fenêtre de sélection de fichier pour les sélectionner un par un. Si le programme fonctionne correctement, tu devrais avoir un récapitulatif dans ton historique de commande (F2), sinon, merci de me dire qu'elle erreur tu obtiens vraiment dans ton historique de commande. Pour mettre fin à la commande, il suffit de cliquer sur le bouton "Annuler" lors de la sélection du fichier cible. Si tu regardes bien le code que j'ai posté ci-dessus, j'ai ajouté de nombreux commentaires pour expliquer le fonctionnement du programme (certes en anglais, mais il existe des traducteurs si besoin). Je n'ai pas eut le temps d'aller TROP dans le détails mais de mon point de vue, c'est déjà pas mal :s Bref, je le répète au cas où : si tu veux plus de liberté dans la sélection des fichiers, je te conseille très fortement d'utiliser uniquement les fonctions (ExportSumInfo) et (ImportSumInfo) car le chemin d'accès complet + nom du fichier .dwg et .txt sont nécessaires en arguments de ces deux fonctions puis de l'intégrer dans SuperAutoScript. Donc tu peux utiliser ton script pour récupérer ces infos 😉 Je remet les bonnes versions de ces fonctions ci-dessous car elles ont légèrement changée depuis le premier post : (ExportSumInfo) - v1.0.0, 17/03/2022 (defun ExportSumInfo (DWG_file TXT_file / *error* doc SumInfo file n odbx key val) (defun *error* (msg) (if file (close file)) (and odbx (vlax-release-object doc)) (princ msg) ) (cond ( (null DWG_file) (setq doc (vla-get-ActiveDocument (vlax-get-acad-object))) ) ( (not (and (setq doc (GetItem (vla-get-Documents (vlax-get-acad-object)) (strcat (vl-filename-base DWG_file) ".dwg") ) ) (= DWG_file (vla-get-FullName doc)) ) ) (setq doc (OpenDrawingDBX DWG_file) odbx T ) ) ) (setq SumInfo (vla-get-SummaryInfo doc) n -1 ) (if (setq file (open TXT_file "W")) (progn (foreach p '(Author Comments HyperlinkBase KeyWords Subject Title) (write-line (strcat (vl-prin1-to-string p) ";" (vl-prin1-to-string (vlax-get SumInfo p))) file ) ) (write-line "" file) (repeat (vla-NumCustomInfo SumInfo) (vla-GetCustomByIndex SumInfo (setq n (1+ n)) 'key 'val) (write-line (strcat key ";" (vl-prin1-to-string val)) file ) ) (setq file (close file)) (and odbx (vlax-release-object doc)) TXT_file ) ) ) (ImportSumInfo) - v2.0.0, 18/03/2022 (defun ImportSumInfo (DWG_file TXT_file / *error* doc SumInfo n i file odbx line lst) (defun *error* (msg) (if file (close file)) (and odbx (vlax-release-object doc)) (princ msg) ) (cond ( (null DWG_file) (setq doc (vla-get-ActiveDocument (vlax-get-acad-object))) ) ( (not (and (setq doc (GetItem (vla-get-Documents (vlax-get-acad-object)) (strcat (vl-filename-base DWG_file) ".dwg") ) ) (= DWG_file (vla-get-FullName doc)) ) ) (setq doc (OpenDrawingDBX DWG_file) odbx T ) ) ) (setq SumInfo (vla-get-SummaryInfo doc) n 0 i 0 ) (if (setq file (open TXT_file "R")) (progn (while (and (setq line (read-line file)) (setq lst (mapcar 'read (str2lst line ";"))) (member (car lst) '(Author Comments HyperlinkBase KeyWords Subject Title)) ) (if (/= "" (cadr lst)) (vlax-put SumInfo (car lst) (cadr lst)) ) (setq n (1+ n)) ) (while (setq line (read-line file)) (setq lst (str2lst line ";")) (or (not (vl-catch-all-error-p (vl-catch-all-apply 'vla-AddCustomInfo (list SumInfo (car lst) (read (cadr lst)))))) (not (vl-catch-all-error-p (vl-catch-all-apply 'vla-SetCustomByKey (list SumInfo (car lst) (read (cadr lst)))))) (setq i (1+ i)) ) (setq n (1+ n)) ) (setq file (close file)) (and odbx (vlax-release-object doc)) (cons (- n i) n) ) ) ) Fonctions complémentaires pour ces fonctions : (GetItem), (OpenDrawingDBX) et (str2lst) (defun OpenDrawingDBX (filename / objdbx release) (setq objdbx (vlax-create-object (if (< (setq release (atoi (getvar "ACADVER"))) 16) "ObjectDBX.AxDbDocument" (strcat "ObjectDBX.AxDbDocument." (itoa release)) ) ) ) (vla-open objdbx filename) objdbx ) (defun GetItem (col name / obj) (vl-catch-all-apply (function (lambda () (setq obj (vla-item col name)))) ) obj ) (defun str2lst (str sep / pos) (if (setq pos (vl-string-search sep str)) (cons (substr str 1 pos) (str2lst (substr str (+ (strlen sep) pos 1)) sep) ) (list str) ) ) Bisous, Luna -
Vui j'avais bien compris, mon but était simplement de faire le lien entre les deux forums pour éviter d'avoir des doubles réponses. Bisous, Luna
-
[CAD MAP 3D] Exporter Propriétés du dessin personnalisées
Luna a répondu à un(e) sujet de drault dans AutoCAD 2018
Comme promis la version corrigée de MISI, avec quelques améliorations supplémentaires (+ correction de légers bugs). Je poste le code pour ceux que chat intéresse et si l'encodage du fichier ci-joint pose soucis avec les accents et caractères spéciaux : ; +-----------------------------------------------------------------------------------------------------------------------------------------------+ ; ; | | ; ; | FICHIER DE SUIVI HISTORIQUE DE LA COMMANDE MISI | ; ; | | ; ; +-----------------------------------------------------------------------------------------------------------------------------------------------+ ; ; []-----------------------[] MISI []-----------------------[] ; ;--- Date of creation > 17/03/2022 ; ;--- Last modification date > 18/03/2022 ; ;--- Author > Luna ; ;--- Version > 2.0.0 ; ;--- Class > "UtFiles" ; ;--- Goal and utility of the command ; ; The purpose of the MISI (= Multiple Import for SummaryInfo) command is to export all the data stored in the drawing properties (Author, ; ; Comments, HyperlinkBase, Keywords, Subject and Title) to an external .txt file. The program works on both open and unopened files. Once the ; ; .txt file is created, you can import the data recorded in the file to other .dwg files, open or not. It is also possible to use the command ; ; only to create the .txt file first, modify the information contained in the file (respecting its initial structure), then use the existing file ; ; as new data to import. ; ; ; ;--- Explanation of how the command works step by step ; ; Step n°1 : Retrieves the "LOCALE" system variable value to determine the language used for the program ; ; Step n°2 : Asks the user for the drawing name to export its SummaryInfo datas ; ; Step n°2.a : If "Current" (or ENTER as default value), the ActiveDocument will be used as source drawing ; ; Step n°2.b : If "Browse", opens a file explorer window and lets you select an existing .dwg or .dwt file ; ; Step n°2.a/b.1 : Asks the user for the .txt file location and name that will be used for the export (if you specify an existing file, it ; ; will be overwritten) ; ; Step n°2.a/b.1.a : If "Source" (or ENTER as default value), it will be stored in the source drawing folder with the name of the drawing plus ; ; "_ExportSummaryInfo.txt" ; ; Step n°2.a/b.1.b : If "Browse", opens a file explorer window and lets you select the location and name for a new file, or an existing one ; ; Step n°2.a/b.1.c : If "Temporary", it will create a file in "%TEMP%" folder and it will be deleted at the end of the program ; ; Step n°2.c : If "Skip", it will not export the data of an existing .dwg file but only import the data of an existing .txt file ; ; Step n°2.c.1 : Opens a file explorer window and lets you select an existing .txt file ; ; Step n°3 : While you specify an existing .dwg file in the file explorer window, it will import the settings stored in the .txt file into ; ; the drawing ; ; ; ;--- List of dependent's functions ; ; --• "BaStr" ---> GetFolder | v2.0.0 - 18/03/2022 (Luna) ; ; --• "UtFil" ---> ExportSumInfo | v1.0.0 - 17/03/2022 (Luna) ; ; --• "UtFil" ---> ImportSumInfo | v2.0.0 - 18/03/2022 (Luna) ; ; --• "UtFil" ---> OpenDrawingDBX | v1.0.0 - ##/##/#### ((gile)) ; ; --• "VlCol" ---> GetItem | v1.0.0 - ##/##/#### ((gile)) ; ; --• "UtDac" ---> str2lst | v1.0.0 - 15/04/2017 ((gile)) ; ; ; ;--- Return on drawing ; ; The command (MISI) returns the number of successfully imported drawing properties in the historic line, with the name of the files used. ; ; Ex. : ; ; MISI ; ; Please select the source .dwg file [Current/Browse/Skip] <Current> : _B ; ; Please select the .txt file for export [Source/Browse/Temporary] <Source> : _B ; ; 13 / 13 drawing properties successfully imported... ; ; | Source drawing : "Dessin3.dwg" ; ; | Folder : "C:\Users\luna\OneDrive\Documents\C3042 - CS PA\" ; ; | ; ; | Target drawing : "Dessin5.dwg" ; ; | Folder : "C:\Users\luna\OneDrive\Documents\C3042 - CS PA\Nouveau dossier\" ; ; | ; ; | TXT file used : "C:\Users\luna\OneDrive\Documents\C3042 - CS PA\Nouveau dossier\Dessin3_ExportSummaryInfo.txt" ; ; | ; ; command: ; ; MISI ; ; Please select the source .dwg file [Current/Browse/Skip] <Current> : ; ; Please select the .txt file for export [Source/Browse/Temporary] <Source> : _T ; ; 8 / 8 drawing properties successfully imported... ; ; | Source drawing : "Dessin1.dwg" ; ; | Folder : "C:\Users\luna\OneDrive\Documents\C3042 - CS PA\" ; ; | ; ; | Target drawing : "Dessin5.dwg" ; ; | Folder : "C:\Users\luna\OneDrive\Documents\C3042 - CS PA" ; ; | ; ; | TXT file used : ""C:\Users\luna\AppData\Local\Temp\MISI001.txt" ; ; | ; ; 8 / 8 drawing properties successfully imported... ; ; | Source drawing : "Dessin1.dwg" ; ; | Folder : "C:\Users\luna\OneDrive\Documents\C3042 - CS PA\" ; ; | ; ; | Target drawing : "Dessin3.dwg" ; ; | Folder : "C:\Users\luna\OneDrive\Documents\C3042 - CS PA" ; ; | ; ; | TXT file used : ""C:\Users\luna\AppData\Local\Temp\MISI001.txt" ; ; | ; ; ; ;--- Historic list of the version with their modification status ; ; +------------+----------------------------------------------------------------------------------------------------------------------------------+ ; ; | v2.0.0 | Update of the functions (GetFolder) and (ImportSumInfo), correcting the issue if CustomKey does already exist, displays info | ; ; +------------+----------------------------------------------------------------------------------------------------------------------------------+ ; ; | v1.0.0 | Creation of the command | ; ; +------------+----------------------------------------------------------------------------------------------------------------------------------+ ; ; ; (defun c:MISI (/ getfolder ExportSumInfo ImportSumInfo OpenDrawingDBX GetItem str2lst lg DWG_file TXT_file d Sfolder Tfolder r) ;;; Definition of local functions (defun getfolder (filename / pos) (setq pos (vl-string-position (ascii "\\") filename 0 T)) (cons (substr filename 1 (1+ pos)) (substr filename (+ pos 2))) ) (defun ExportSumInfo (DWG_file TXT_file / *error* doc SumInfo file n odbx key val) (defun *error* (msg) (if file (close file)) (and odbx (vlax-release-object doc)) (princ msg) ) (cond ( (null DWG_file) (setq doc (vla-get-ActiveDocument (vlax-get-acad-object))) ) ( (not (and (setq doc (GetItem (vla-get-Documents (vlax-get-acad-object)) (strcat (vl-filename-base DWG_file) ".dwg") ) ) (= DWG_file (vla-get-FullName doc)) ) ) (setq doc (OpenDrawingDBX DWG_file) odbx T ) ) ) (setq SumInfo (vla-get-SummaryInfo doc) n -1 ) (if (setq file (open TXT_file "W")) (progn (foreach p '(Author Comments HyperlinkBase KeyWords Subject Title) (write-line (strcat (vl-prin1-to-string p) ";" (vl-prin1-to-string (vlax-get SumInfo p))) file ) ) (write-line "" file) (repeat (vla-NumCustomInfo SumInfo) (vla-GetCustomByIndex SumInfo (setq n (1+ n)) 'key 'val) (write-line (strcat key ";" (vl-prin1-to-string val)) file ) ) (setq file (close file)) (and odbx (vlax-release-object doc)) TXT_file ) ) ) (defun ImportSumInfo (DWG_file TXT_file / *error* doc SumInfo n i file odbx line lst) (defun *error* (msg) (if file (close file)) (and odbx (vlax-release-object doc)) (princ msg) ) (cond ( (null DWG_file) (setq doc (vla-get-ActiveDocument (vlax-get-acad-object))) ) ( (not (and (setq doc (GetItem (vla-get-Documents (vlax-get-acad-object)) (strcat (vl-filename-base DWG_file) ".dwg") ) ) (= DWG_file (vla-get-FullName doc)) ) ) (setq doc (OpenDrawingDBX DWG_file) odbx T ) ) ) (setq SumInfo (vla-get-SummaryInfo doc) n 0 i 0 ) (if (setq file (open TXT_file "R")) (progn (while (and (setq line (read-line file)) (setq lst (mapcar 'read (str2lst line ";"))) (member (car lst) '(Author Comments HyperlinkBase KeyWords Subject Title)) ) (if (/= "" (cadr lst)) (vlax-put SumInfo (car lst) (cadr lst)) ) (setq n (1+ n)) ) (while (setq line (read-line file)) (setq lst (str2lst line ";")) (or (not (vl-catch-all-error-p (vl-catch-all-apply 'vla-AddCustomInfo (list SumInfo (car lst) (read (cadr lst)))))) (not (vl-catch-all-error-p (vl-catch-all-apply 'vla-SetCustomByKey (list SumInfo (car lst) (read (cadr lst)))))) (setq i (1+ i)) ) (setq n (1+ n)) ) (setq file (close file)) (and odbx (vlax-release-object doc)) (cons (- n i) n) ) ) ) (defun OpenDrawingDBX (filename / objdbx release) (setq objdbx (vlax-create-object (if (< (setq release (atoi (getvar "ACADVER"))) 16) "ObjectDBX.AxDbDocument" (strcat "ObjectDBX.AxDbDocument." (itoa release)) ) ) ) (vla-open objdbx filename) objdbx ) (defun GetItem (col name / obj) (vl-catch-all-apply (function (lambda () (setq obj (vla-item col name)))) ) obj ) (defun str2lst (str sep / pos) (if (setq pos (vl-string-search sep str)) (cons (substr str 1 pos) (str2lst (substr str (+ (strlen sep) pos 1)) sep) ) (list str) ) ) ;;; End of definition for local functions (if (member (getvar "LOCALE") '("FR" "FRA")) (setq lg T) ) (initget "Courant Parcourir Ignorer _Current Browse Skip") (setq DWG_file (getkword (if lg "\nVeuillez sélectionner le fichier .dwg source [Courant/Parcourir/Ignorer] <Courant> : " "\nPlease select the source .dwg file [Current/Browse/Skip] <Current> : " ) ) ) (setq DWG_file (cond ( (= DWG_file "Browse") (getfiled (if lg "Sélection du fichier .dwg source" "Selection of source .dwg file" ) (getvar "DWGPREFIX") "dwg;dwt" 0 ) ) ( (= DWG_file "Skip") nil) ((strcat (getvar "DWGPREFIX") (getvar "DWGNAME"))) ) ) (if DWG_file (progn (initget "Source Parcourir Temporaire _Source Browse Temporary") (setq TXT_file (getkword (if lg "\nVeuillez sélectionner le fichier .txt pour l'export [Source/Parcourir/Temporaire] <Source> : " "\nPlease select the .txt file for export [Source/Browse/Temporary] <Source> : " ) ) ) (setq TXT_file (cond ( (or (= TXT_file "Source") (null TXT_file)) (strcat (substr DWG_file 1 (- (strlen DWG_file) 4)) "_ExportSummaryInfo.txt") ) ( (= TXT_file "Browse") (getfiled (if lg "Sélection du fichier .txt d'export" "Selection of .txt export file" ) (strcat (substr DWG_file 1 (- (strlen DWG_file) 4)) "_ExportSummaryInfo") "txt" 1 ) ) ( (= TXT_file "Temporary") (setq d T) (vl-filename-mktemp "MISI.txt") ) ) ) (setq Sfolder (getfolder DWG_file)) (setq Tfolder Sfolder) (setq TXT_file (ExportSumInfo DWG_file TXT_file)) ) (progn (setq TXT_file (getfiled (if lg "Sélection du fichier .txt existant" "Selection of existing .txt file" ) (getvar "DWGPREFIX") "txt" 0 ) ) (setq Sfolder (cons "..." "...") Tfolder (cons (getvar "DWGPREFIX") (getvar "DWGNAME")) ) ) ) (if TXT_file (while (setq filename (getfiled (if lg "Sélection du fichier .dwg cible" "Selection of targetted .dwg file" ) (car Tfolder) "dwg;dwt" 0 ) ) (setq Tfolder (getfolder filename)) (if (and (/= filename DWG_file) (setq r (ImportSumInfo filename TXT_file)) ) (princ (if lg (strcat "\n" (itoa (car r)) " / " (itoa (cdr r)) " propriétés du dessin importées avec succès..." "\n| Dessin source : \"" (cdr Sfolder) "\"" "\n| Dossier : \"" (car Sfolder) "\"" "\n|" "\n| Dessin cible : \"" (cdr Tfolder) "\"" "\n| Dossier : \"" (car Tfolder) "\"" "\n|" "\n| Fichier TXT : \"" TXT_file "\"" "\n|" ) (strcat "\n" (itoa (car r)) " / " (itoa (cdr r)) " drawing properties successfully imported..." "\n| Source drawing : \"" (cdr Sfolder) "\"" "\n| Folder : \"" (car Sfolder) "\"" "\n|" "\n| Target drawing : \"" (cdr Tfolder) "\"" "\n| Folder : \"" (car Tfolder) "\"" "\n|" "\n| TXT file used : \"" TXT_file "\"" "\n|" ) ) ) ) ) ) (if d (vl-file-delete TXT_file)) (princ) ) A savoir que si la variable système "LOCALE" est différente de "FR" ou "FRA", le programme (devrait) s'exécuter en anglais mais je n'ai pas testé en vrai... Si jamais il y a des questions ou autres remarques, je suis dispo et ouverte à toute proposition 😉 Bisous, Luna UtFiles . MultipleImportforSummaryInfo.lsp -
Coucou, Sujet en doublon ici : https://forums.autodesk.com/t5/autocad-tous-produits-francais/communication-excel-autocad/td-p/11010886 Bisous, Luna
-
[CAD MAP 3D] Exporter Propriétés du dessin personnalisées
Luna a répondu à un(e) sujet de drault dans AutoCAD 2018
Coucou, Je pense que ceci devrait répondre (partiellement) au problème, mais est ensuite utilisable avec SuperAutoScript pour le faire fonctionner correctement : (defun ExportSumInfo (DWG_file TXT_file / *error* doc SumInfo file n odbx key val) (defun *error* (msg) (if file (close file)) (and odbx (vlax-release-object doc)) (princ msg) ) (cond ( (null DWG_file) (setq doc (vla-get-ActiveDocument (vlax-get-acad-object))) ) ( (not (and (setq doc (GetItem (vla-get-Documents (vlax-get-acad-object)) (strcat (vl-filename-base DWG_file) ".dwg") ) ) (= DWG_file (vla-get-FullName doc)) ) ) (setq doc (OpenDrawingDBX DWG_file) odbx T ) ) ) (setq SumInfo (vla-get-SummaryInfo doc) n -1 ) (if (setq file (open TXT_file "W")) (progn (foreach p '(Author Comments HyperlinkBase KeyWords Subject Title) (write-line (strcat (vl-prin1-to-string p) ";" (vl-prin1-to-string (vlax-get SumInfo p))) file ) ) (write-line "" file) (repeat (vla-NumCustomInfo SumInfo) (vla-GetCustomByIndex SumInfo (setq n (1+ n)) 'key 'val) (write-line (strcat key ";" (vl-prin1-to-string val)) file ) ) (setq file (close file)) (and odbx (vlax-release-object doc)) TXT_file ) ) ) (defun ImportSumInfo (DWG_file TXT_file / *error* doc SumInfo file odbx line lst) (defun *error* (msg) (if file (close file)) (and odbx (vlax-release-object doc)) (princ msg) ) (cond ( (null DWG_file) (setq doc (vla-get-ActiveDocument (vlax-get-acad-object))) ) ( (not (and (setq doc (GetItem (vla-get-Documents (vlax-get-acad-object)) (strcat (vl-filename-base DWG_file) ".dwg") ) ) (= DWG_file (vla-get-FullName doc)) ) ) (setq doc (OpenDrawingDBX DWG_file) odbx T ) ) ) (setq SumInfo (vla-get-SummaryInfo doc) ) (if (setq file (open TXT_file "R")) (progn (while (and (setq line (read-line file)) (setq lst (mapcar 'read (str2lst line ";"))) (member (car lst) '(Author Comments HyperlinkBase KeyWords Subject Title)) ) (if (/= "" (cadr lst)) (vlax-put SumInfo (car lst) (cadr lst)) ) ) (while (setq line (read-line file)) (setq lst (str2lst line ";")) (vla-AddCustomInfo SumInfo (car lst) (read (cadr lst))) ) (setq file (close file)) (and odbx (vlax-release-object doc)) T ) ) ) ;;; Accéder à un dessin fermé (defun OpenDrawingDBX (filename / objdbx release) (setq objdbx (vlax-create-object (if (< (setq release (atoi (getvar "ACADVER"))) 16) "ObjectDBX.AxDbDocument" (strcat "ObjectDBX.AxDbDocument." (itoa release)) ) ) ) (vla-open objdbx filename) objdbx ) ;;; GetItem (gile) ;;; Retourne le vla-object de l'item s'il est présent dans la collection ;;; ;;; Arguments ;;; col : la collection (vla-object) ;;; name : le nom de l'objet (string) ou son indice (entier) ;;; ;;; Retour : le vla-object ou nil (defun GetItem (col name / obj) (vl-catch-all-apply (function (lambda () (setq obj (vla-item col name)))) ) obj ) (defun str2lst (str sep / pos) (if (setq pos (vl-string-search sep str)) (cons (substr str 1 pos) (str2lst (substr str (+ (strlen sep) pos 1)) sep) ) (list str) ) ) Le but de la démarche c'est simplement de créer un fichier .txt qui servira d'export pour ensuite pouvoir être ré-importer plus tard. Il s'agit ci-dessus de fonctions qui nécessitent 2 arguments !!! Le principe est simple : - Le premier argument correspond au nom complet du fichier DWG (source pour (ExportSumInfo) ou cible pour (ImportSumInfo)) - Le second argument correspond au nom complet du fichier TXT où seront stockées les Info du dessin Voici un exemple d'utilisation succinct (correspondant au fonctionnement du programme initial de @(gile)) : (ImportSumInfo nil (ExportSumInfo (getfiled "Choisir le fichier source" (getvar 'dwgprefix) "dwg;dwt" 0) (strcat (getvar 'dwgprefix) "ExportSumInfo.txt") ) ) On peut donc l'utiliser dans un script (je ne sais pas comment tu comptes sélectionner un ensemble de fichiers) avec dans un premier temps, la création du fichier via (ExportSumInfo) puis en bouclant la fonction (ImportSumInfo) sur l'ensemble des fichiers cibles choisis. Voici un exemple en programmation LISP via la commande MISI (= Multiple Import Summary Info) : (defun c:MISI (/ getfolder ExportSumInfo ImportSumInfo OpenDrawingDBX GetItem str2lst lg DWG_file TXT_file d folder) ;;; Definition of local functions (defun getfolder (filename / pos) (setq pos (vl-string-position (ascii "\\") filename 0 T)) (substr filename 1 (1+ pos)) ) (defun ExportSumInfo (DWG_file TXT_file / *error* doc SumInfo file n odbx key val) (defun *error* (msg) (if file (close file)) (and odbx (vlax-release-object doc)) (princ msg) ) (cond ( (null DWG_file) (setq doc (vla-get-ActiveDocument (vlax-get-acad-object))) ) ( (not (and (setq doc (GetItem (vla-get-Documents (vlax-get-acad-object)) (strcat (vl-filename-base DWG_file) ".dwg") ) ) (= DWG_file (vla-get-FullName doc)) ) ) (setq doc (OpenDrawingDBX DWG_file) odbx T ) ) ) (setq SumInfo (vla-get-SummaryInfo doc) n -1 ) (if (setq file (open TXT_file "W")) (progn (foreach p '(Author Comments HyperlinkBase KeyWords Subject Title) (write-line (strcat (vl-prin1-to-string p) ";" (vl-prin1-to-string (vlax-get SumInfo p))) file ) ) (write-line "" file) (repeat (vla-NumCustomInfo SumInfo) (vla-GetCustomByIndex SumInfo (setq n (1+ n)) 'key 'val) (write-line (strcat key ";" (vl-prin1-to-string val)) file ) ) (setq file (close file)) (and odbx (vlax-release-object doc)) TXT_file ) ) ) (defun ImportSumInfo (DWG_file TXT_file / *error* doc SumInfo file odbx line lst) (defun *error* (msg) (if file (close file)) (and odbx (vlax-release-object doc)) (princ msg) ) (cond ( (null DWG_file) (setq doc (vla-get-ActiveDocument (vlax-get-acad-object))) ) ( (not (and (setq doc (GetItem (vla-get-Documents (vlax-get-acad-object)) (strcat (vl-filename-base DWG_file) ".dwg") ) ) (= DWG_file (vla-get-FullName doc)) ) ) (setq doc (OpenDrawingDBX DWG_file) odbx T ) ) ) (setq SumInfo (vla-get-SummaryInfo doc) ) (if (setq file (open TXT_file "R")) (progn (while (and (setq line (read-line file)) (setq lst (mapcar 'read (str2lst line ";"))) (member (car lst) '(Author Comments HyperlinkBase KeyWords Subject Title)) ) (if (/= "" (cadr lst)) (vlax-put SumInfo (car lst) (cadr lst)) ) ) (while (setq line (read-line file)) (setq lst (str2lst line ";")) (vla-AddCustomInfo SumInfo (car lst) (read (cadr lst))) ) (setq file (close file)) (and odbx (vlax-release-object doc)) T ) ) ) (defun OpenDrawingDBX (filename / objdbx release) (setq objdbx (vlax-create-object (if (< (setq release (atoi (getvar "ACADVER"))) 16) "ObjectDBX.AxDbDocument" (strcat "ObjectDBX.AxDbDocument." (itoa release)) ) ) ) (vla-open objdbx filename) objdbx ) (defun GetItem (col name / obj) (vl-catch-all-apply (function (lambda () (setq obj (vla-item col name)))) ) obj ) (defun str2lst (str sep / pos) (if (setq pos (vl-string-search sep str)) (cons (substr str 1 pos) (str2lst (substr str (+ (strlen sep) pos 1)) sep) ) (list str) ) ) ;;; End of definition for local functions (if (member (getvar "LOCALE") '("FR" "FRA")) (setq lg T) ) (initget "Courant Parcourir _Current Browse") (setq DWG_file (getkword (if lg "\nVeuillez sélectionner le fichier .dwg source [Courant/Parcourir] <Courant> : " "\nPlease select the source .dwg file [Current/Browse] <Current> : " ) ) ) (setq DWG_file (cond ( (= DWG_file "Browse") (getfiled (if lg "Sélection du fichier .dwg source" "Selection of source .dwg file" ) (getvar "DWGPREFIX") "dwg;dwt" 0 ) ) ((strcat (getvar "DWGPREFIX") (getvar "DWGNAME"))) ) ) (initget "Source Parcourir Temporaire _Source Browse Temporary") (setq TXT_file (getkword (if lg "\nVeuillez sélectionner le fichier .txt pour l'export [Source/Parcourir/Temporaire] <Source> : " "\nPlease select the .txt file for export [Source/Browse/Temporary] <Source> : " ) ) ) (setq TXT_file (cond ( (or (= TXT_file "Source") (null TXT_file)) (strcat (substr DWG_file 1 (- (strlen DWG_file) 4)) "ExportSummaryInfo.txt") ) ( (= TXT_file "Browse") (getfiled (if lg "Sélection du fichier .txt d'export" "Selection of .txt export file" ) (strcat (substr DWG_file 1 (- (strlen DWG_file) 4)) "ExportSummaryInfo") "txt" 1 ) ) ( (= TXT_file "Temporary") (setq d T) (vl-filename-mktemp "ExportSummaryInfo.txt") ) ) ) (setq folder (getfolder DWG_file)) (if (setq TXT_file (ExportSumInfo DWG_file TXT_file)) (while (setq filename (getfiled (if lg "Sélection du fichier .dwg cible" "Selection of targetted .dwg file" ) folder "dwg;dwt" 0 ) ) (if (/= filename DWG_file) (ImportSumInfo filename TXT_file) ) ) ) (if d (vl-file-delete TXT_file)) (princ) ) PS: Je ferais un version v2 car pour l'instant cela fonctionne si les propriétés custom n'existent pas encore dans le dessin cible mais sur une clé existe déjà, alors cela génère une erreur donc il faut que je corrige cela... En espérant que cela corresponde un peu plus à ton besoin 😉 Bisous, Luna -
Panoramique dans les 4 directions [réglé]
Luna a répondu à un(e) sujet de barbichette dans Routines LISP
Coucou, Une macro ferait parfaitement l'affaire si tu désires cliquer sur des boutons 😉 Pour cela il te faut ouvrir le panneau de personnalisation d'interface utilisateur, créer 4 commandes avec respectivement les macros : ^C^C_-PAN;0,0;100,0; ^C^C_-PAN;0,0;-100,0; ^C^C_-PAN;0,0;0,100; ^C^C_-PAN;0,0;0,-100; Et tu les nommes comme tu veux, ci-dessus dans l'ordre : PAN_X+ PAN_X- PAN_Y+ PAN_Y- EDIT : Bon et comme il y a déjà eut des réponses, je te propose ceci juste pour l'amour du jeu : ^C^C^P_-PAN;0,0;$M=$(getvar,USERR1),0; ^C^C^P_-PAN;0,0;$M=$(-,0,$(getvar,USERR1)),0; ^C^C^P_-PAN;0,0;0,$M=$(getvar,USERR1); ^C^C^P_-PAN;0,0;0,$M=$(-,0,$(getvar,USERR1)); Il te suffit d'écrire la ligne suivante dans ton dessin : (setvar "USERR1" 100) La valeur est enregistrée dans le dessin (donc c'est à définir qu'une seule fois par dessin pour l'initialiser), sinon tu écris la ligne dans un fichier nommé "acaddoc.lsp" que tu ranges dans le dossier Support d'AutoCAD (même endroit que les CUIX, PGP, etc... et ainsi tu peux changer la valeur comme tu en as envie sans être obligé de modifier les commandes 😉 (Bon j'avoue j'aurais préféré pouvoir définir la variable "USERR1" directement dans la définition des commandes mais...évidemment il n'y a pas de $(setvar) en langage DIESEL... sad..) Bisous, Luna -
Jeu de selection hachures et changement d'échelle
Luna a répondu à un(e) sujet de Jiro dans Routines LISP
Coucou, Il me semble qu'il faut mettre des guillemets vides "" après l'argument correspondant au jeu de sélection afin de valider la sélection (car il est possible de faire plusieurs jeu de sélection durant les commandes). De plus, je te conseille d'ajouter un underscore devant la méthode X de ton (ssget) ("_X") pour permettre d'utiliser les méthodes internationales 😉 Donc un truc du genre (pas testé) : (DEFUN C:TEST (/ JS) (SETQ JS (SSGET "_X" (LIST (CONS 0 "HATCH")))) (COMMAND "-EDITHACH" JS "" "PR" "" "4" "" ) (princ) ) Bisous, Luna -
Bon bah c'est réglé alors 😉 Bisous, Luna
-
Coucou, J'ai une question, plus qu'une réponse pour toi : Le problème que tu rencontre est-il uniquement lié à l'option <Déplacement> des commandes DEPLACER et COPIER qui est choisie directement sans te poser la question ou bien est-ce un problème plus général où à chaque validation effectuée (ESPACE ou ENTREE) au cours ou pour lancer une commande, AutoCAD fait une double validation ? Cf. ce sujet similaire : Si c'est la seconde option, c'est un problème que j'ai déjà rencontrée et d'autres également et pour le moment le seul moyen de le corriger c'est de fermer l'application AutoCAD et de relancer une nouvelle session d'AutoCAD. Si c'est la première option, je n'ai pas trouvé de variable système pouvant altérer l'utilisation de cette option en particulier. C'est pourquoi je pense que ton soucis est assez proche de la seconde option, ou bien il s'agit d'une troisième option que je n'ai pas compris... Bisous, Luna
-
attin/attout pour les repères de lignes multiples
Luna a répondu à un(e) sujet de philsogood dans Routines LISP
Coucou, En regardant un peu les listes DXF de ton objet, on peut retrouver les valeurs des attributs directement dans la liste DXF de ton objet (entget ename), au code DXF 302 (attention ! Il faut que se soit le code 302 à la fin de la liste car le code 302 est ici utilisé pour (302 . "LEADER{") également). Cependant tu n'as du coup accès qu'aux valeurs, or je présume que ATTIN/ATTOUT permettent d'extraire les valeurs et le nom des attributs 😉 Donc tu peux accéder au nom de la définition de bloc utilisée en suivant ce chemin DXF : (entget (cdr (assoc 341 (entget ename)))) et donc tu auras le nom de la définition de bloc au code DXF 2 comme ci-dessous : ( (-1 . <Nom d'entité: 12806358cd0>) (0 . "BLOCK_RECORD") (5 . "C5") (102 . "{ACAD_XDICTIONARY") (360 . <Nom d'entité: 12806358ce0>) (102 . "}") (330 . <Nom d'entité: 1280635b810>) (100 . "AcDbSymbolTableRecord") (100 . "AcDbBlockTableRecord") (2 . "_DetailCallout") (360 . <Nom d'entité: 12806358cf0>) (340 . <Nom d'entité: 0>) (70 . 4) (280 . 1) (281 . 0) ) Tu peux ensuite récupérer la liste des attributs en suivant la méthode habituelle à partir de la liste DXF de la définition de bloc située à la 2ème occurrence du code DXF 360 dans la liste ci-dessus, et donc ensuite tu parcours les sous-objets de la définition de bloc à partir du code DXF -2 puis en utilisant (entnext) et en ne conservant que les objets "ATTDEF". Désolée si ce n'est pas clair, ce n'est pas un sujet que j'ai l'habitude de travailler donc je suis sûr qu'il y a d'autres méthodes plus élégantes et surtout qui permettent d'avoir accès à la référence de bloc, et non la définition séparée de ses valeurs... Bisous, Luna -
Coucou, Vui je te confirme ! Même si je reconnais que c'est stupide, je suppose qu'AutoCAD ne comprend pas correctement le principe de filtres et sous-filtres et donc même si deux sous-filtres appartiennent à deux filtres différents, il n'auront pas le préfixe correspondant au filtre parent, obligeant ainsi d'avoir deux nom différents pour les sous-filtres. Donc comme suggéré, le plus simple est d'ajouter un numéro pour éviter les doublons sans faire trop lourd Bisous, Luna
-
Coucou, Alors j'ai du mal à comprendre ton problème car le programme semble déjà prendre en compte plusieurs Multilignes... Il travail déjà avec un jeu de sélection : (setq s1 (ssget "_:L" '((0 . "MLINE")))) Donc je vois difficilement quoi faire de plus...car le "_:L" correspondant à la méthode de sélection, signifie que tu peux choisir autant d'objets que tu souhaites, avec n'importe qu'elle système de sélection à partir du moment que les objets ne sont pas sur un calque verrouillé... Donc en l'état, je dirais que ton programme fonctionne déjà selon ta demande ! Bisous, Luna
-
Cumuler les longueurs de plusieurs lignes ou polyligne
Luna a répondu à un(e) sujet de LudoB dans AutoCAD LT 2020-2023
Coucou, Je réponds éventuellement complètement à côté de la plaque mais il me semble que @bryce a écrit son programme ScanDXF (tu devrais y avoir accès également depuis le site de @rebcao >>ici<< si jamais tu ne trouves pas la dernière version) pour justement pouvoir exporter les longueurs, surfaces, etc... de lignes, polylignes, etc... sur les versions LT d'AutoCAD. Peut-être que cela permettra de contourner le problème ? Je ne pourrais pas te donner plus de renseignement sur son utilisation car je ne l'ai jamais utilisé, mais je sais une chose : c'est un programme qui est très apprécié par les dessinateurs !! 😉 Bisous, Luna -
Coucou, Ne connaissant rien à Plant 3D, je doute de pouvoir t'aider malheureusement. Peut-être essaye de voir sur le forum AutoDesk FR, avec D.Vaquand qui s'y connait très bien sur ce sujet. Je ne sais s'il maîtrise le langage LISP par contre.. Un .dwg d'exemple serait également le bienvenu pour savoir de quel type d'objets on parle et de leur structure. Mais n'ayant pas d'AutoCAD Plant 3D sous la main, je suppose que ton LISP doit également agir sur un fonctionnement direct lié à Plant 3D..Si c'est le cas, cela risque d'être complexe de faire quoi que se soit... Bisous, Luna
-
Mode d'emploi pour une première prise en main d'autocad
Luna a répondu à un(e) sujet de Jbrosteaux dans AutoCAD LT 2020-2023
Coucou, Tu peux essayer ces supports de formation si besoin (en plus de l'aide AutoCAD) : https://damassets.autodesk.net/content/dam/autodesk/www/campaigns/emea/docs/autocad-2019-33-tips-ebook-fr.pdf https://www.globalenviro-mun.net/uploads/8/3/2/3/8323932/plan_de_cours-initiation_autocad.pdf Après, le plus simple c'est de l'installer à un poste proche du tiens pour faciliter les échanges s'il a une question AutoCAD et ainsi il pourra trouver une réponse au moment d'un besoin, car même en lisant en polycopié, on n'est pas dans le besoin immédiat donc on oublie 60% des infos lues >w< Je pense que de toutes manière Internet regorge d'informations pour tous les niveaux d'utilisateurs ! Bisous, Luna -
polyligne redémarre depuis dernier point
Luna a répondu à un(e) sujet de philsogood dans AutoCAD 2020-2024
Pas forcément redémarrage du PC, juste de la session AutoCAD c'est suffisant normalement 😉 -
polyligne redémarre depuis dernier point
Luna a répondu à un(e) sujet de philsogood dans AutoCAD 2020-2024
Yup, +1 avec @Olivier Eckmann !! Je n'ai jamais su d'où venait ce problème, mais de temps à autre, AutoCAD me fait des doubles validations à chaque commande... Pas trouvé d'autre méthode que fermer AutoCAD puis le relancer... J'ai cru remarqué que le soucis venait lorsque je fais de la programmation en ligne de commande avec des caractères spéciaux (genre ~ ), mais comme je fais tout le temps de la programmation, difficile à dire si cela ne provient que de cela.. Bisous, Luna -
Coucou, Je ne sais pas si cela pourra t'aider mais j'avais ouvert ce sujet il y a un moment : Bisous, Luna
-
lignes incompréhensibles en ligne de commande
Luna a répondu à un(e) sujet de Syl2007 dans AutoCAD 2018
Coucou, Essaye de voir la solution proposée sur ce forum : https://forums.autodesk.com/t5/civil-3d-forum/error-message-aecobjrelgraph-db-0x1c13d2f0-modified-lt-ae/td-p/9456870 Cela peut éventuellement avoir un lien. J'avoue n'avoir jamais vu ce genre de message donc je ne pourrais pas t'aider plus que cela... Bisous, Luna -
Coucou, +1 avec @je56 sur le géoréférencement Ensuite, comment insères-tu ta vue aérienne ? Est-ce une image .jpg ? Utilises-tu la commande GEOPOSITION ? Car il me semble qu'en passant par l'emplacement géographique (= GEOPOSITION) et en connaissant le système de projection utilisé (CC ou lambert) pour le cadastre, tu n'auras aucun mal à obtenir une vue aérienne correspondante 😉 Bisous, Luna
-
[RESOLU] Scan d'un DWG à l'image de Windirstat
Luna a répondu à un(e) sujet de Syl2007 dans AutoCAD 2017
Coucou, Si tu as un AutoCAD 2020 et/ou plus, pourquoi ne pas regarder du côté de la commande PURGER ? Certes cela peut prendre un peu de temps pour checker tout le monde car les infos ne sont dispo qu'en sélectionnant une seule ligne (ici, 1 définition de bloc), mais tu as le nombre d'objets concernés, leur taille en octets, leur localisation, ... Bref cela peut s'avérer pas mal pour purger ou simplement contrôler ton dessin je suppose car tu peux avoir les découpages par rapport aux blocs, calques, groupes, etc...et tu peux même sélectionner directement les objets concernés lorsqu'ils ne sont pas imbriqué dans une définition de bloc 😉 Bisous, Luna -
J'ai l'impression que la version Web possède quelques fonctionnalités qui lui sont propres, comme les TRACES par exemple. Cela permet, à priori, d'ajouter un Layer de commentaires par-dessus un .dwg permettant ainsi de faire une sorte de prise de note. Je n'ai jamais testé mais je suppose que les version Web et Mobile sont plutôt destinées aux gars sur chantier qui peuvent se balader avec leur tablette et faire des remarques/commentaires en direct sur un fichier .dwg pour ensuite le transmettre au dessinateur et demander des correctifs. Et du coup il faut ouvrir le plan sur AutoCAD depuis une version Web et/ou Mobile pour avoir les fameuses TRACES. Enfin je suppose ^^" Bisous, Luna
-
Coucou, En programmation c'est tout à fait possible. La question que je me pose du coup, c'est la provenance des coordonnées ? Cela me permettra de savoir comment je peux les récupérer et ensuite les traiter. Il te faudrait les résultats sous quel format ensuite ? Sinon il existe les mathématiques, tout simplement 😉 En coordonnées XY on a : tan(a) = Y/X, soit a = arctan(Y/X) et cos(a) = X/d, soit d = X/cos(a) Donc pour les coordonnées XYZ on aurait : Soit : tan(b) = Y/X, soit b = arctan(Y/X) et cos(b) = X/d', soit d' = X/cos(b) Donc tan(a) = Z/d', soit a = arctan(Z/d') ou a = arctan(Z/X/cos(arctanY/X)) et sin(a) = Z/d, soit d = Z/sin(a) Bisous, Luna
-
Depuis AutoCAD, il existe la commande _PDFIMPORT qui permet de convertir un fichier PDF en objet AutoCAD. Je ne dis pas que c'est parfait, mais cela peut dépanner. Par contre si le but c'est de pouvoir retrouver un fichier .dwg propre à partir d'un fichier .pdf, alors là je ne sais pas...Je pense qu'il y aura une perte d'informations quelque soit la méthode utilisée. Le but reste de trouver un méthode où la perte reste acceptable. Pour info, la commande _PDFIMPORT représente une perte négligeable d'information, cependant c'est la qualité des informations qui est assez faible, donc la reprise derrière peut s'avérer délicate... A toi de voir ! Bisous, Luna
