snoopydosfr Posté(e) le 5 février 2014 Posté(e) le 5 février 2014 Bonjour, Je cherche sans succès une macro Lisp pour extraire les attributs d'un Block spécifique sur mes plans, et enregsitrer le resultat dans EXCEL.Je suis sur Autocad 2010 sans menu express, de toute façon ATTOUT n'est pas tout a fait ce que je recherche ...J'aimerais pourvoir donner en "dur" le nom du bloc dans ma routine, afin d'en extraire uniquement certains attributs dans un fichier EXCEL ...Si quelqu'un a une idée, je suis preneur. merci.
Big666 Posté(e) le 5 février 2014 Posté(e) le 5 février 2014 http://cadxp.com/topic/38752-avant-daller-en-prison/ Nous vivons tous dans le ventre d'un chien géantTout le monde le sait mais personne ne dit rien du tout ultra Vomit
philsogood Posté(e) le 6 février 2014 Posté(e) le 6 février 2014 hello snoopy et bienvenue sur le forumperso (pour m'être penche sur cette problèmatique il y a peu) j'utilisera la fonction _DATAETXTRACTION (à taper au clavier)ensuite t'as un vidéo que x_all a trouvé sur la toilehttp://cadxp.com/topic/38801-attextr/page__view__findpost__p__215809@+Phil Projeteur Revit Indépendant - traitement des eaux/CVC
snoopydosfr Posté(e) le 6 février 2014 Auteur Posté(e) le 6 février 2014 hello snoopy et bienvenue sur le forumperso (pour m'être penche sur cette problèmatique il y a peu) j'utilisera la fonction _DATAETXTRACTION (à taper au clavier)ensuite t'as un vidéo que x_all a trouvé sur la toilehttp://cadxp.com/topic/38801-attextr/page__view__findpost__p__215809@+Phil merci pour votre accueil et votre réactivité, la solution du "DATAEXTRACTION", ne convient pas tout a fait, car on est obligé de refaire la manip à chaque fois sur chaque plan : le gabarit d'extraction, n'est valable que pour un plan, et non pas pour les blocks que l'on a définis. On ne peut pas utiliser ce gabarit tel quel sur un autre plan qui a les mêmes types de block, sans passer par une redéfinition du plan ...J'étais à la recherche d'une commande magique (lisp) qui une fois bien définie, aurait créée mon fichier Excel (csv) automatiquement et proprement (ie sur le block voulu et les attributs choisis)
snoopydosfr Posté(e) le 6 février 2014 Auteur Posté(e) le 6 février 2014 http://cadxp.com/topic/38752-avant-daller-en-prison/ Oui, cette solution n'est pas mal, mais j'aimerais fixer en dur le nom du seul type de block dont je veux faire l'extraction ... J'avais trouver une solution similaire à celle proposée en Lisp (MeGetAtts.lsp) avec une commande DYN-DAT qui fonctionne bien, mais la encore cette fonction fait l'extraction de tout les blocks, peut être quelqu'un serait il comment modifier ce code source pour ne faire l'extraction que d'un block nommé "PIECE" par exemple ? Sans doute faut il ajouter un " IF name='PIECE' " quelque part, en Lisp mais je n'y connais strictement rien en Lisp ... Ou bien passer par le ssget qui semble filtrer certaines entités en Lisp ... ;;************************************************************ ;; Design by Gabo CALOS DE VIT from CORDOBA ARGENTINA ;;; Copyleft 1995-2009 by Gabriel Calos De Vit ;; DEVITG@GMAIL.COM ;;-******************************************************************************************************************************* (DEFUN guarda-lista-csv-w (lista / ar ;;; nombre-archivo ) (SETQ nombre-archivo (STRCAT (GETVAR "dwgprefix") (VL-FILENAME-BASE (GETVAR "dwgname")) ".csv")) (SETQ ar (OPEN nombre-archivo "w")) (FOREACH texto lista (WRITE-LINE texto ar) ) (CLOSE ar) ) ;;-******************************************************************************************************************************* ;;;--------------------------------------------------------------------------------------------------------- ;;*//*/*/*/*/*/*/*/*/*/*/*/*/**/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/ ;;;Juerg Menzi ;;;MENZI ENGINEERING GmbH, Switzerland ;;;http://www.menziengineering.ch ; == Function MeGetAtts ; Reads all attribute values from a block ; Arguments [Typ]: ; Obj = Object [VLA-OBJECT] ; Return [Typ]: ; > Dotted pair list '(("Tag1" . "Val1")...)[list] ; Notes: ; None ; (defun MeGetAtts (Obj) (mapcar '(lambda (Att) (cons (vla-get-TagString Att) (vla-get-TextString Att) ) ) (vlax-invoke Obj 'GetAttributes) ) ) ;;*//*/*/*/*/*/*/*/*/*/*/*/*/**/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/* ;; TASK TO DO ;;;Export all the attributes ;;;+handle id of the blocks ;;;+visibility state ;;;+Real blockname (defun GET-NAME+HANDLE+VISIBLE+ATTs ( / AutoCAD* ADOC ALL-INSERTED-CSV-LIST ALL-INSERTED-DATA-LIST ATT-PAIR-LIST CSV-LIST DATA-LIST DATA-LIST< HANDLE nombre-archivo INSERTED-CSV INSERTED-LIST INSERTED-SS NAME VISIBLE ) (vl-load-com) (setq AutoCAD* (vlax-get-acad-object)) ;_ AutoCAD (setq adoc (vla-get-activedocument AutoCAD*)) ;_ DWG active (setq insertED-SS (ssget "_X" '(( 0 . "insert"))));_ all inserted blocks (setq inserted-list (mapcar 'vlax-ename->vla-object (vl-remove-if-not '(lambda(x)(= (type x) 'ENAME)) (mapcar 'cadr (ssnamex insertED-SS)))));_ a list of inserted (setq all-inserted-csv-list nil) (setq all-inserted-data-list nil) (foreach inserted inserted-list (setq data-list nil) (setq csv-list nil) (setq name (vla-get-EffectiveName inserted)) (setq data-list (cons (cons "NAME" name) data-list)) (setq handle (vla-get-Handle inserted)) (setq data-list (cons (CONS "HANDLE" handle) data-list)) (setq visible (if (vla-get-Visible inserted) "visible" "no visible" );_ if );_ visible (setq data-list (cons (cons "VISIBLE" visible) data-list)) (setq csv-list (reverse(list name handle visible ) )) (if (vla-get-hasAttributes inserted ) (progn (setq att-pair-list (MeGetAtts inserted)) (foreach att-pair att-pair-list (setq data-list ( cons att-pair data-list)) (setq csv-list (cons (Cdr att-pair) csv-list)) ) );_ progn );If has attribute (setq inserted-csv (list$2cvs (reverse csv-list))) (setq data-list< (reverse data-list)) (setq all-inserted-data-list (cons data-list< all-inserted-data-list)) (setq all-inserted-csv-list (cons inserted-csv all-inserted-csv-list)) );_ foreach inserted (setq blk-qty (length all-inserted-csv-list)) (guarda-lista-csv-w all-inserted-csv-list) (alert (strcat "\n Data form : \n " (Itoa blk-qty) " BLOCKS \n has been sent to .. \n" nombre-archivo )) (princ) );_ defun ;;*//*/*/*/*/*/*/*/*/*/*/*/*/**/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/* (defun c:dyn-dat () (GET-NAME+HANDLE+VISIBLE+ATTs) ) ;;*//*/*/*/*/*/*/*/*/*/*/*/*/**/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/* ;;*//*/*/*/*/*/*/*/*/*/*/*/*/**/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/ (defun list$2cvs (#lst) (if (not ( listp #lst)) (setq #lst (list #lst)) ) (apply 'strcat (cons (car #lst) (mapcar '(lambda (str) (strcat "," str)) (cdr #lst) ) ;_mapcar ) ;_cons ) ;_apply ) ;_ string-list2cvs ;;;usage(string-list2cvs '("One" "Two" "Three")) ;;;->"One,Two,Three" ;;*//*/*/*/*/*/*/*/*/*/*/*/*/**/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/ (prompt "prompt DYN-DAT at the command line") ;|«Visual LISP© Format Options» (72 2 1 0 nil "end of " 100 20 2 0 0 nil T nil T) ;*** DO NOT add text below the comment! ***|;
snoopydosfr Posté(e) le 6 février 2014 Auteur Posté(e) le 6 février 2014 Bon ben j'ai trouvé : (ssget "_X" '((0 . "INSERT")(2 . "PIECE"))) et ça marche !! Mais je reste preneur si quelqu'un peut me dire comment enlever les handles, visibility, real name et certains attributs de cette extraction ...
snoopydosfr Posté(e) le 6 février 2014 Auteur Posté(e) le 6 février 2014 Bon ben j'ai trouvé : (ssget "_X" '((0 . "INSERT")(2 . "PIECE"))) Non en fait j'ai une erreur à l'execution de ma routine ... j'ai pas du faire ce qu'il fallait comme modif ... :blink: 1
snoopydosfr Posté(e) le 6 février 2014 Auteur Posté(e) le 6 février 2014 Bon ben j'ai trouvé : (ssget "_X" '((0 . "INSERT")(2 . "PIECE"))) Non en fait j'ai une erreur à l'execution de ma routine ... j'ai pas du faire ce qu'il fallait comme modif ... :blink: Ok, j'avais oublié une parenthèse désolé pour tout ces post :P donc ça marche
ahbv Posté(e) le 6 février 2014 Posté(e) le 6 février 2014 oups j'avais pas vu la suite des messages !! Salut, j'ai le meme soucis que toi pour le comptage de bloc, pour l'instant aucune solution rapide et fiable mis a part dataextraction qu'on ne peut automatiser et qui demande à chaque fois de tous reconfigurer !!sinon j'ai essayé le lisp DYN-DAT mais il ne compte pas les blocs !(?), j'espère qu'une bonne ame proposera une solution.Bonne continuation à tousAHBV Oui, cette solution n'est pas mal, mais j'aimerais fixer en dur le nom du seul type de block dont je veux faire l'extraction ... J'avais trouver une solution similaire à celle proposée en Lisp (MeGetAtts.lsp) avec une commande DYN-DAT qui fonctionne bien, mais la encore cette fonction fait l'extraction de tout les blocks, peut être quelqu'un serait il comment modifier ce code source pour ne faire l'extraction que d'un block nommé "PIECE" par exemple ? Sans doute faut il ajouter un " IF name='PIECE' " quelque part, en Lisp mais je n'y connais strictement rien en Lisp ... Ou bien passer par le ssget qui semble filtrer certaines entités en Lisp ... ;;************************************************************ ;; Design by Gabo CALOS DE VIT from CORDOBA ARGENTINA ;;; Copyleft 1995-2009 by Gabriel Calos De Vit ;; DEVITG@GMAIL.COM ;;-******************************************************************************************************************************* (DEFUN guarda-lista-csv-w (lista / ar ;;; nombre-archivo ) (SETQ nombre-archivo (STRCAT (GETVAR "dwgprefix") (VL-FILENAME-BASE (GETVAR "dwgname")) ".csv")) (SETQ ar (OPEN nombre-archivo "w")) (FOREACH texto lista (WRITE-LINE texto ar) ) (CLOSE ar) ) ;;-******************************************************************************************************************************* ;;;--------------------------------------------------------------------------------------------------------- ;;*//*/*/*/*/*/*/*/*/*/*/*/*/**/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/ ;;;Juerg Menzi ;;;MENZI ENGINEERING GmbH, Switzerland ;;;http://www.menziengineering.ch ; == Function MeGetAtts ; Reads all attribute values from a block ; Arguments [Typ]: ; Obj = Object [VLA-OBJECT] ; Return [Typ]: ; > Dotted pair list '(("Tag1" . "Val1")...)[list] ; Notes: ; None ; (defun MeGetAtts (Obj) (mapcar '(lambda (Att) (cons (vla-get-TagString Att) (vla-get-TextString Att) ) ) (vlax-invoke Obj 'GetAttributes) ) ) ;;*//*/*/*/*/*/*/*/*/*/*/*/*/**/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/* ;; TASK TO DO ;;;Export all the attributes ;;;+handle id of the blocks ;;;+visibility state ;;;+Real blockname (defun GET-NAME+HANDLE+VISIBLE+ATTs ( / AutoCAD* ADOC ALL-INSERTED-CSV-LIST ALL-INSERTED-DATA-LIST ATT-PAIR-LIST CSV-LIST DATA-LIST DATA-LIST< HANDLE nombre-archivo INSERTED-CSV INSERTED-LIST INSERTED-SS NAME VISIBLE ) (vl-load-com) (setq AutoCAD* (vlax-get-acad-object)) ;_ AutoCAD (setq adoc (vla-get-activedocument AutoCAD*)) ;_ DWG active (setq insertED-SS (ssget "_X" '(( 0 . "insert"))));_ all inserted blocks (setq inserted-list (mapcar 'vlax-ename->vla-object (vl-remove-if-not '(lambda(x)(= (type x) 'ENAME)) (mapcar 'cadr (ssnamex insertED-SS)))));_ a list of inserted (setq all-inserted-csv-list nil) (setq all-inserted-data-list nil) (foreach inserted inserted-list (setq data-list nil) (setq csv-list nil) (setq name (vla-get-EffectiveName inserted)) (setq data-list (cons (cons "NAME" name) data-list)) (setq handle (vla-get-Handle inserted)) (setq data-list (cons (CONS "HANDLE" handle) data-list)) (setq visible (if (vla-get-Visible inserted) "visible" "no visible" );_ if );_ visible (setq data-list (cons (cons "VISIBLE" visible) data-list)) (setq csv-list (reverse(list name handle visible ) )) (if (vla-get-hasAttributes inserted ) (progn (setq att-pair-list (MeGetAtts inserted)) (foreach att-pair att-pair-list (setq data-list ( cons att-pair data-list)) (setq csv-list (cons (Cdr att-pair) csv-list)) ) );_ progn );If has attribute (setq inserted-csv (list$2cvs (reverse csv-list))) (setq data-list< (reverse data-list)) (setq all-inserted-data-list (cons data-list< all-inserted-data-list)) (setq all-inserted-csv-list (cons inserted-csv all-inserted-csv-list)) );_ foreach inserted (setq blk-qty (length all-inserted-csv-list)) (guarda-lista-csv-w all-inserted-csv-list) (alert (strcat "\n Data form : \n " (Itoa blk-qty) " BLOCKS \n has been sent to .. \n" nombre-archivo )) (princ) );_ defun ;;*//*/*/*/*/*/*/*/*/*/*/*/*/**/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/* (defun c:dyn-dat () (GET-NAME+HANDLE+VISIBLE+ATTs) ) ;;*//*/*/*/*/*/*/*/*/*/*/*/*/**/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/* ;;*//*/*/*/*/*/*/*/*/*/*/*/*/**/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/ (defun list$2cvs (#lst) (if (not ( listp #lst)) (setq #lst (list #lst)) ) (apply 'strcat (cons (car #lst) (mapcar '(lambda (str) (strcat "," str)) (cdr #lst) ) ;_mapcar ) ;_cons ) ;_apply ) ;_ string-list2cvs ;;;usage(string-list2cvs '("One" "Two" "Three")) ;;;->"One,Two,Three" ;;*//*/*/*/*/*/*/*/*/*/*/*/*/**/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/ (prompt "prompt DYN-DAT at the command line") ;|«Visual LISP© Format Options» (72 2 1 0 nil "end of " 100 20 2 0 0 nil T nil T) ;*** DO NOT add text below the comment! ***|;
-Olivier- Posté(e) le 6 février 2014 Posté(e) le 6 février 2014 Bonjour Ahbv, Ta demande ne correspond pas à celle du poste. Pourrais tu en ouvrir un nouveau avec une description précise de ce que tu souhaite. Olivier
Big666 Posté(e) le 6 février 2014 Posté(e) le 6 février 2014 bonjourDATAETXTRACTION AutoCad 2014 aurait t'il crée un outil appeler extraction de donner ou d'attributs.merci je désespérait depuis 2007 mercigille fait mieux avec instopo attout attin fait mieux Nous vivons tous dans le ventre d'un chien géantTout le monde le sait mais personne ne dit rien du tout ultra Vomit
snoopydosfr Posté(e) le 6 février 2014 Auteur Posté(e) le 6 février 2014 Bonjour Ahbv, Ta demande ne correspond pas à celle du poste. Pourrais tu en ouvrir un nouveau avec une description précise de ce que tu souhaite. Olivier Je crois que ma demande correspond bien au titre du Post : "Extraction attribut d'un block spécifique vers EXCEL" ???
snoopydosfr Posté(e) le 6 février 2014 Auteur Posté(e) le 6 février 2014 bonjourDATAETXTRACTION AutoCad 2014 aurait t'il crée un outil appeler extraction de donner ou d'attributs.merci je désespérait depuis 2007 mercigille fait mieux avec instopo attout attin fait mieux Je cherchais une commande Lisp pour une extraction d'un block spécifique et d'attributs choisis, vers un fichier EXCEL qui porte le nom du plan ouvert, avec un entête propre. Juste avec une commande suivi d'entrée ... Mais c'est bon j'ai trouvé, merci.
Big666 Posté(e) le 6 février 2014 Posté(e) le 6 février 2014 qua tu trouver? Nous vivons tous dans le ventre d'un chien géantTout le monde le sait mais personne ne dit rien du tout ultra Vomit
snoopydosfr Posté(e) le 7 février 2014 Auteur Posté(e) le 7 février 2014 qua tu trouver? Et bien j'ai modifié le lisp MeGetAtts.lsp (voir source au-dessus) et ça marche bien.
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