Aller au contenu

Extraction attribut d'un block spécifique vers EXCEL


snoopydosfr

Messages recommandés

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.

Lien vers le commentaire
Partager sur d’autres sites

hello snoopy et bienvenue sur le forum

perso (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 toile

http://cadxp.com/topic/38801-attextr/page__view__findpost__p__215809

@+

Phil

Projeteur Revit Indépendant - traitement des eaux/CVC

Lien vers le commentaire
Partager sur d’autres sites

hello snoopy et bienvenue sur le forum

perso (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 toile

http://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)

Lien vers le commentaire
Partager sur d’autres sites

 

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! ***|;

Lien vers le commentaire
Partager sur d’autres sites

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 à tous

AHBV

 

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! ***|;

Lien vers le commentaire
Partager sur d’autres sites

bonjour

DATAETXTRACTION

 

AutoCad 2014 aurait t'il crée un outil appeler extraction de donner ou d'attributs.

merci je désespérait depuis 2007

merci

gille fait mieux avec instopo

attout attin fait mieux

 

 

Nous vivons tous dans le ventre d'un chien géant

Tout le monde le sait mais personne ne dit rien du tout

 

ultra Vomit

Lien vers le commentaire
Partager sur d’autres sites

bonjour

DATAETXTRACTION

 

AutoCad 2014 aurait t'il crée un outil appeler extraction de donner ou d'attributs.

merci je désespérait depuis 2007

merci

gille 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.

Lien vers le commentaire
Partager sur d’autres sites

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 compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité