fabcad Posté(e) le 28 novembre 2008 Posté(e) le 28 novembre 2008 Bonjour à tous,Afin de finir sur ma fonction Ajout de Zéros sur attributs de blocs dont voici le code ci-dessous, mais je souhaiterais boucler sur tous les blocs qui ont comme étiquette celle que je choisirai en pointant comme sur le programme. Le but étant d'apprendre aujourd'hui en visual lisp comment boucler sur des attributs de blocs (collection, travail sur les attributs etc.)Merci pour vos réponses,Fabcad ;; AJOUT-ZEROS Fabrice 27/11/08 ;; Ajout de Zéros sur le numéro d'ordre d'attribut de bloc (defun c:AJOUT-ZEROS (/ space att lst1 lst2 ss1 ss2 txt al p1 p2) (vl-load-com) (or *acdoc* (setq *acdoc* (vla-get-ActiveDocument (vlax-get-acad-object))) );fin or (setq att (nentsel "\nSélectionnez un numero d'ordre : ")) (setq att (vlax-ename->vla-object (car att))) (setq index (vla-get-TextString att)) (if (< 4 (setq lg-index (strlen index))) (setq index (substr index (- lg-index 3))) (repeat (- 4 lg-index) (setq index (strcat "0" index))) );fin if (setq height 6) (setq style-att "ATT") (vla-put-TextString att index) (vla-put-Stylename att style-att) (vla-put-Height att height) );fin defun AJOUT-ZEROS
Bred Posté(e) le 28 novembre 2008 Posté(e) le 28 novembre 2008 Salut,en v-lisp je ne trouve pas facilement le bloc de base, mais dans les dxf, avant de transformer att en vla-oject, tu peux récupérer l'entité bloc comme ça : (cdr (assoc 330 (entget (car att)))) ... reste plus qu'a faire un ssget avec le filtre sur le code dxf 2 (le nom du bloc) Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
(gile) Posté(e) le 28 novembre 2008 Posté(e) le 28 novembre 2008 Salut Fabcad, Récupérer un attribut : (setq att (nentsel "\nSélectionnez un numero d'ordre : ")) (setq att (vlax-ename->vla-object (car att))) L'étiquette de l'attribut (vla-get-TagString att) Le bloc contenant l'attribut : (setq bloc (vla-ObjectIDToObject *acdoc* (vla-get-OwnerID att))) Le nom du bloc : (vla-get-Name bloc) Nota : cette dernière expression retournera un nom de bloc anonyme (*Uxx) avec des blocs dynamiques.Pour les versions 2006 et postérieures, vla-get-EffectiveName retournera le nom de la définition du bloc. Donc, pour traiter tous les attributs ayant la même étiquette dans tous les blocs de même nom, on fait un jeu de sélection classique avec un filtre, on peut ensuite traiter le jeu de sélection actif (jeu de sélection VisualLISP) avec la fonction vlax-for (cette fonction est un peu le pendant de foreach, mais pour les collections de vla-objects). On supprimera ce jeu de sélection pour libérer la mémoire. (if (ssget "_X" (list '(0 . "INSERT") (cons 2 name))) (progn ;; traitement du jeu de sélection actif (vlax-for b (setq ss (vla-get-ActiveSelectionSet *acdoc*)) ;; traitement des attributs de chaque bloc (foreach a (vlax-get b 'getAttributes) (if (= (vla-get-TagString a) tag) (progn (setq index (vla-get-TextString a)) (if ( (setq index (substr index (- lg-index 3))) (repeat (- 4 lg-index) (setq index (strcat "0" index))) ) (vla-put-TextString att index) (vla-put-Stylename att "ATT") (vla-put-Height att 6) ) ) ) ) ;; suppression du jeu de sélection (vla-delete ss) ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Patrick_35 Posté(e) le 28 novembre 2008 Posté(e) le 28 novembre 2008 Bonjour J'aurai fait d'une autre manière que d'utiliser tagstring, car on peut en avoir plusieurs qui ont le même nom. (setq lst (vlax-invoke bloc 'getattributes)) ; liste des attributs (setq pos (- (length lst) (length (member att lst)))) ; position de l'attribut sélectionné en base Ensuite, un nth dans la liste des attributs des autres blocs (à condition qu'ils aient le même ordre) ps : j'utilise (vla-objectidtoobject (vla-get-database att)(vla-get-ownerid att)) à la place (vla-ObjectIDToObject *acdoc* (vla-get-OwnerID att)) en cas d'utilisation d'objectdxb @+ [Edité le 28/11/2008 par Patrick_35] Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
fabcad Posté(e) le 28 novembre 2008 Auteur Posté(e) le 28 novembre 2008 Après une modification de mon programme, voici l'erreur retournée : Sélectionnez un numero d'ordre : ; erreur: Membre introuvableQu'est-ce que : Membre introuvable ? (defun c:VL-AJOUT-ZEROS (/ att) (vl-load-com) (or *acdoc* (setq *acdoc* (vla-get-ActiveDocument (vlax-get-acad-object))));fin or ;Récupérer un attribut : (setq att (nentsel "\nSélectionnez un numero d'ordre : ")) (setq att (vlax-ename->vla-object (car att))) ;L'étiquette de l'attribut (setq tag (vla-get-TagString att)) ;Le bloc contenant l'attribut : (setq bloc (vla-ObjectIDToObject *acdoc* (vla-get-OwnerID att))) ;Le nom du bloc : ;(vla-get-Name bloc) (setq nom-bloc (vla-get-EffectiveName bloc)) (if (ssget "_X" (list '(0 . "INSERT") (cons 2 nom-bloc))) (progn ;; traitement du jeu de sélection actif (vlax-for b (setq ss (vla-get-ActiveSelectionSet *acdoc*)) ;; traitement des attributs de chaque bloc (foreach a (vlax-get b 'getAttributes) (if (= (vla-get-TagString a) tag) (progn (setq index (vla-get-TextString a)) (if (< 4 (setq lg-index (strlen index))) (setq index (substr index (- lg-index 3))) (repeat (- 4 lg-index) (setq index (strcat "0" index))) );fin if (vla-put-TextString att index) (vla-put-Stylename att "ATT") (vla-put-Height att 6) );fin progn );fin if );fin foreach );fin vlax-for b ;; suppression du jeu de sélection (vla-delete ss) );fin progn );fin if );fin defun AJOUT-ZEROS [Edité le 28/11/2008 par fabcad]
Patrick_35 Posté(e) le 28 novembre 2008 Posté(e) le 28 novembre 2008 Déjà Merci Ensuite, tu fais un vlax-get à la place d'un vlax-invoke et un foreach avec comme variable de boucle a et tu changes la variable att @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
fabcad Posté(e) le 28 novembre 2008 Auteur Posté(e) le 28 novembre 2008 Eh bien de rien merci à vous, Ouh la la, J'ai compris le vlax-invoke et en état il fait sur 1 bloc, je vois l'itération mais je ne vois pas où placer le foreach que tu me demandes. Peux-tu m'aider ? Merci Fabcad
Patrick_35 Posté(e) le 28 novembre 2008 Posté(e) le 28 novembre 2008 Re Ce n'est pas un problème d'emplacement de foreach, mais juste de variables, car tu ne changes pas la bonne. ps : sans rancune ;) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
fabcad Posté(e) le 28 novembre 2008 Auteur Posté(e) le 28 novembre 2008 Merci Patrick_35, C'est Vendredi et j'ai pas eu mon apéro,Quel nul mais nous voyons bien qu'une lecture par une autre personne est plus que bénéfique. (defun c:VL-AJOUT-ZEROS (/ att tag bloc nom-bloc a b index lg-index) (vl-load-com) (or *acdoc* (setq *acdoc* (vla-get-ActiveDocument (vlax-get-acad-object))));fin or ;Récupérer un attribut : (setq att (nentsel "\nSélectionnez un numero d'ordre : ")) (setq att (vlax-ename->vla-object (car att))) ;L'étiquette de l'attribut (setq tag (vla-get-TagString att)) ;Le bloc contenant l'attribut : (setq bloc (vla-ObjectIDToObject *acdoc* (vla-get-OwnerID att))) ;Le nom du bloc : ;(vla-get-Name bloc) (setq nom-bloc (vla-get-EffectiveName bloc)) avec filtre et sélection de l'ensemble des blocs : (if (ssget "_X" (list '(0 . "INSERT") (cons 2 nom-bloc))) ;mais je préfère afin de vérifier la sélection en cours (if (ssget (list '(0 . "INSERT") (cons 2 nom-bloc))) (progn ;; traitement du jeu de sélection actif (vlax-for b (setq ss (vla-get-ActiveSelectionSet *acdoc*)) ;; traitement des attributs de chaque bloc (foreach att (vlax-invoke b 'getAttributes) (if (= (vla-get-TagString att) tag) (progn (setq index (vla-get-TextString att)) (if (< 4 (setq lg-index (strlen index))) (setq index (substr index (- lg-index 3))) (repeat (- 4 lg-index) (setq index (strcat "0" index))) );fin if (vla-put-TextString att index) (vla-put-Stylename att "ATT") (vla-put-Height att 6) );fin progn );fin if );fin foreach );fin vlax-for b ;; suppression du jeu de sélection (vla-delete ss) );fin progn );fin if );fin defun AJOUT-ZEROS ;--------------------------------- [Edité le 28/11/2008 par fabcad]
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