Aller au contenu

Boucler sur attributs de blocs pour Ajout de Zéros suite


Messages recommandés

Posté(e)

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

 

Posté(e)

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

Posté(e)

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

Posté(e)

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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

Après une modification de mon programme, voici l'erreur retournée :

 

Sélectionnez un numero d'ordre : ; erreur: Membre introuvable

Qu'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]

Posté(e)

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

 

Posté(e)

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]

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é