polo777 Posté(e) le 13 septembre 2009 Posté(e) le 13 septembre 2009 Bonjour à tous, Les données : Un plan dans lesquels il y a plusieurs xrefs (une trentaines) qui ont chacun une ou plusieurs présentations L'objectif :Récupérer dans chaque présentation de chaque xref un bloc "_cart" avec des attributs "nom" "date" "indice" pour écrire dans l'espace papier chacune des valeurs trouvé sous la forme : XREF 1 : nom1 date1 indice1XREF 2 : nom2 date2 indice2 - nom2 date2 indice2 mais je ne sais pas comment faire pourriez-vous m'aider à faire ce lisp ? [Edité le 13/9/2009 par polo777]
(gile) Posté(e) le 13 septembre 2009 Posté(e) le 13 septembre 2009 Salut et bienvenue, Pour accéder aux références de bloc insérés dans des xrefs on peut, soit ouvrir chaque xref, soit accéder à sa base de données en utilisant ObjectDBX. Cette deuxième méthode est plus rapide. Je te donne un exemple qui retourne une liste dont chaque terme (un par bloc "_cart" trouvé) est une liste du type :(nom_xref nom date indice) ;; GetXrefAttributes ;; retourne une liste dont chaque terme est un liste du type : ;; (nom_xref nom_présentation (defun GetXrefAttributes (/ acdoc doc nom date ind result) (vl-load-com) (setq acdoc (vla-get-ActiveDocument (vlax-get-acad-object))) ;; on parcourt les blocs du document actif pour trouver les xrefs (vlax-for blk (vla-get-Blocks acdoc) ;; pour chaque xref trouvée (if (= (vla-get-IsXref blk) :vlax-true) (progn ;; on "ouvre" le document (setq doc (getDocument (vla-get-Path blk))) ;; pour chaque présentation (excepté l'espace "Model") (vlax-for lay (vla-get-Layouts (car doc)) (if (/= (vla-get-Name lay) "Model") ;; pour chaque objet dans la présentation (vlax-for obj (vla-get-Block lay) ;; si c'est un bloc nommé "_CART" (if (and (= (vla-get-ObjectName obj) "AcDbBlockReference") (= (strcase (vla-get-Name obj)) "_CART") ; nom du bloc ) (progn ;; pour chaque attribut (foreach att (vlax-invoke obj 'GetAttributes) ;; si l'étiquette est "NOM" "DATE" ou "INDICE" (cond ((= (vla-get-TagString att) "NOM") ; etiquette d'attribut (setq nom (vla-get-TextString att)) ) ((= (vla-get-TagString att) "DATE") ; etiquette d'attribut (setq date (vla-get-TextString att)) ) ((= (vla-get-TagString att) "INDICE") ; etiquette d'attribut (setq ind (vla-get-TextString att)) ) ) ) ;; on ajoute un élément au résultat (setq result (cons (list (vla-get-Name blk) nom date ind) result ) nom nil date nil ind nil ) ) ) ) ) ) ;; si le document est du type IAxDbDocument, on libère la mémoire (and (cadr doc) (vlax-release-object (car doc))) (setq doc nil) ) ) ) result ) ;; getDocument ;; Accéder à un dessin ouvert ou fermé ;; Retourne un liste dont le premier terme est le document (vla-object) ;; le deuxième T si le document est du type IAxDb nil s'il est du type IAcad (defun getDocument (fileName / document release AxDb) (if (setq filename (findfile filename)) (progn (vlax-for doc (vla-get-Documents (vlax-get-acad-object)) (if (= (strcase (vla-get-FullName doc)) (strcase fileName)) (setq document doc) ) ) (if (not document) (progn (setq document (vlax-create-object (if ( "ObjectDBX.AxDbDocument" (strcat "ObjectDBX.AxDbDocument." (itoa release)) ) ) AxDb T ) (vla-open document filename) ) ) ) ) (list document AxDb) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
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