Bortch59 Posté(e) le 21 février 2012 Posté(e) le 21 février 2012 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.
(gile) Posté(e) le 21 février 2012 Posté(e) le 21 février 2012 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
VDH-Bruno Posté(e) le 23 février 2012 Posté(e) le 23 février 2012 Bonjour, je n'arrive pas à me "balader" dans un blocPour 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 blocComme 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
Bortch59 Posté(e) le 23 février 2012 Auteur Posté(e) le 23 février 2012 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) )
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