Aller au contenu

NOM DE BLOC


PHILPHIL

Messages recommandés

bonjour

 

on peut recuperer le nom d'un bloc insérer dans un fichier en cliquant dessus.

 

mais comment fait on pour recuperer le nom d'un bloc qui est dans un bloc inséré?

 

il y a pas un lisp deja sur CADxp qui donnait les noms des blocs qui etaient dans des blocs et leurs nombre ?

 

a+

 

Phil

Autodesk Architecture 2023 sous windows 11 64

24 pouces vertical + 30 pouces horizontal + 27 pouces horizontal

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Il me semblait avoir fait un truc dans ce genre mais je ne le retrouve plus.

 

Le principe est de parcourir les entités composants la définition du bloc à la recherche de références de bloc et, quand on en trouve une, de faire la même chose (récursion) avaec la définition du bloc imbriqué.

 

Un petit truc vite fait :

(defun nested (blockName / printNested)
 (defun printNested (blk num / ent elst)
   (if	(setq ent (cdr (assoc -2 (tblsearch "BLOCK" blk))))
     (progn
(repeat num (princ "  "))
(princ blk)
(princ "\n")
(while ent
  (setq elst (entget ent))
  (if (= (cdr (assoc 0 elst)) "INSERT")
    (printNested (cdr (assoc 2 elst)) (1+ num))
  )
  (setq ent (entnext ent))
)
     )
   )
   (princ)
 )
 (printNested blockName 0)
)

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

Salut gile,

 

Le lisp ne fonctionne pas :(

J'ai cru, au début, que c'était le fait qu'il y est

 

(defun nested (blockName / printNested)

à la place de

(defun c:nested(blockName / printNested)

 

 

C'est en regardant d'autres lisp que j'ai pu remarquer ça, mais ça ne marche toujours pas.

 

Dans la ligne de commande, il y a ceci:

 

 

Commande:
Commande: APPLOAD
nested.lsp correctement chargé(s)


Commande:
Commande:
Commande: NESTED
; erreur: nombre d'arguments insuffisants

Commande:

Steven________________________________________

Pour le taf; Windows (et ses emmerdes) sinon pas d'AutoCAD.

Pour le perso Linux Mint et pas de problèmes. Mais pas d'AutoCAD.

En rêve; AutoCAD sous Linux.

Lien vers le commentaire
Partager sur d’autres sites

hello Gile

 

s'il y a plusieurs blocs qui composent se bloc, il va donné tous les noms je suppose

je garde ca sous le coude, pour tester

 

 

mais il donnera pas le nom du bloc de l'entité que l on a sélectionné.

 

 

a+

merci

 

 

Phil

Autodesk Architecture 2023 sous windows 11 64

24 pouces vertical + 30 pouces horizontal + 27 pouces horizontal

Lien vers le commentaire
Partager sur d’autres sites

Oupss !...

 

J'avais mal compris la demande.

Pour ce que tu veux faire, si j'ai bien compris, il faut utiliser la fonction nentsel ou nentselp.

Cette fonction appliquée à une 'sous-entité' retourne une liste qui contient les informations que tu cherches :

premier élément : le nom d'entité de la sous-entité sélectionnée

deuxième élément : le point cliqué

troisième élément : la matrice combinant toutes les transformations subies par l'entité sélectionnée

quatrième élément : la liste des entités 'parent'

Cas particulier quand l'entité sélectionnée est une référence d'attribut, le bloc parent n'apparaît pas dans la liste des parents mais on le retrouve facilement.

 

Une petite routine qui retourne la liste des noms de blocs parent. On peut lui passer en argument la liste retournée par nentsel :

(getOwnerNames (nentsel)) 

ou celle retournée par nentselp :

(getOwnerNames (nentselp))

 

;; Retourne la liste des noms des blocs parent de la sous-entité
;;
;; Arguument
;; nentLst : une liste telle que celle retournée par nentsel(p)
(defun getOwnerNames (nentLst / elst)
 (setq elst (entget (car nentLst)))
 (mapcar
   '(lambda (ent) (cdr (assoc 2 (entget ent))))
   (if	(= "ATTRIB" (cdr (assoc 0 elst)))
     (cons (cdr (assoc 330 elst)) (cadddr nentLst))
     (cadddr nentLst)
   )
 )
)

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

  • 1 an après...

bonjour.

Ci joint un code du mème principe, mais il y a le problème des noms des sous entités qui ne sont pas afficher.

Comment faire la compil de ce code et l'affichage des sous entités.

(defun c:BNameLabel (/ ent entl obj)
(cond ((not (setq ent (car (entsel "\nSelect block: ")))))
((not (eq (cdr (assoc 0 (entget ent))) "INSERT")) (princ "\nInvalid object!"))
((setq pt (getpoint "\nSpecify first point: "))
(setq entl (entlast))
(vl-cmdf "_.mleader" "_non" pt "\\")
(while (eq (logand 1 (getvar 'CMDACTIVE)) 1) (vl-cmdf ""))
(if (not (equal entl (setq entl (entlast))))
(vla-put-textstring
(vlax-ename->vla-object entl)
(vlax-get-property
(setq obj (vlax-ename->vla-object ent))
(if (vlax-property-available-p obj 'EffectiveName)
'EffectiveName
'Name
)
)
)
)
)
)
(princ)
)
(vl-load-com)
(princ)

Lien vers le commentaire
Partager sur d’autres sites

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é