Aller au contenu

Parcourir les entités qui composent un bloc


Messages recommandés

Posté(e)

Bonjour,

je n'arrive pas à me "balader" dans un bloc que je sélectionne par (entsel) afin de récupérer par exemple le diamètre d'un cercle faisant partie dudit bloc.

 

Je précise que je sais parcourir les attibuts d'un bloc avec (entnext).

 

Merci.

Posté(e)

Salut,

 

On ne peut accéder qu'aux attributs d'une référence de bloc. Pour accéder aux entités composant le bloc, il faut parcourir sa définition. Si tu veux le diamètre d'un cercle composant le bloc, il faudra aussi tenir compte de l'échelle de la référence.

Tu accèdes à la définition du bloc avec la fonction tblsearch sur la tables des blocs avec le nom du bloc.

La liste retournée par tblsearch contient un groupe DXF -2 qui pointe sur la première entité composant le bloc. La fonction entnext te permet d'accéder aux composants suivants (comme pour les attributs.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Bonjour,

 

je n'arrive pas à me "balader" dans un bloc

Pour se balader dans un bloc la bonne réponse est celle de (gile ).

 

un bloc que je sélectionne par (entsel) afin de récupérer par exemple le diamètre d'un cercle faisant partie dudit bloc

Comme je vois que tu travailles par pointage si ton code le permet, je voulais rappeler la possibilité d’extraire directement le nom de l’entité sélectionné à l’intérieur d’une entité complexe au moyen des fonctions nentsel ou nentselp.

 

Ces fonctions en plus de retourner la sous entité sélectionné, elles renvoient également en dernière position de liste le nom de l’entité principal ce qui dans ton cas permet d’interroger les codes DXF contenant d’éventuel changement d’échelle de l’entité "INSERT".

 

Exemple de code pour obtenir par pointage le rayon d’un cercle composant une référence de bloc corrigé du facteur d’échelle.

;; En supposant l'echelle d'insertion uniforme (code DXF 41=42=43)
((lambda (nsel)
  (*
    (cdr (assoc 40 (entget (car nsel)))) ; rayon du cercle
    (cdr (assoc 41 (entget (car (last nsel))))) ; echelle d'insertion du bloc
  )
)
 (nentsel); ou (nentselp)
)

 

 

Ces fonctions renvoient également une matrice de transformation dont on peut extraire la transformation à appliquer à l’entité sélectionné.

 

Autre exemple de code en exploitant les informations retournées par la matrice de transformation

;; En supposant l'échelle d'insertion uniforme en X Y Z
((lambda (nsel)
  (*
    (cdr (assoc 40 (entget (car nsel)))) ; rayon du cercle
    (vlen (caaddr nsel)) ; facteur d'echelle
  )
)
 (nentsel)
)

;; Retourne la norme d'un vecteur 
(defun vlen (v)
 (distance '(0. 0. 0.) v)
)
;;ou
(defun vlen (v)
 (sqrt (apply '+ (mapcar '(lambda (x) (* x x)) v)))
)

 

A+

Apprendre => Prendre => Rendre

Posté(e)

Merci pour vos réponses.

 

Suite à la réponse de (gile), j'ai opté pour récupérer l'échelle du bloc que j'insère.

Je vous livre ci-dessous mon code en l'état (pas de gestion d'erreur, etc), vos remarques sont les bienvenues.

Le but est d'insérer une étiquette qui renseigne les dimensions d'une réservation circulaire et la numérote.

 

Merci.

 

(defun c:test (/)

 (setvar "attdia" 0)

 (setq lstEnt (entget (car (entsel))))

 (while
   (/= (cdr (assoc 2 lstEnt)) "RSV_CIRC")
    (alert "Vous devez sélectionner une réservation")
    (setq lstEnt (entget (car (entsel))))
 )

 (setq EntEch (cdr (assoc 41 lstEnt)))

 (if (null Num)
   (setq Num 1)
   (setq Num (1+ Num))
 )

 (command "_-insert"
   "ETQ_RSV"
   pause
   ""
   ""
   ""
   (print
     (strcat "PLB n°"
	     (rtos Num 2 0)
     )
   )
   (print "en dalle"
   )
   (print
     (strcat "Ø"
	     (rtos EntEch 2 0)
     )
   )
   ""
 )

 (setvar "attdia" 1)
 (princ)
)

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é