PHILPHIL Posté(e) le 4 mai 2016 Posté(e) le 4 mai 2016 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 FREELANCE Autodesk Architecture 2025 sous windows 11 64 REVIT 24 pouces vertical + 30 pouces horizontal + 27 pouces horizontal
(gile) Posté(e) le 4 mai 2016 Posté(e) le 4 mai 2016 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 - GitHub Développements sur mesure pour AutoCAD
Steven Posté(e) le 5 mai 2016 Posté(e) le 5 mai 2016 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.
(gile) Posté(e) le 5 mai 2016 Posté(e) le 5 mai 2016 Salut, Il ne s'agit pas d'une commande mais d'une fonction qui requiert un argument : le nom du bloc.Exemple pour un bloc nommé "toto" :(nested "toto") Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
PHILPHIL Posté(e) le 5 mai 2016 Auteur Posté(e) le 5 mai 2016 hello Gile s'il y a plusieurs blocs qui composent se bloc, il va donné tous les noms je supposeje 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 FREELANCE Autodesk Architecture 2025 sous windows 11 64 REVIT 24 pouces vertical + 30 pouces horizontal + 27 pouces horizontal
(gile) Posté(e) le 5 mai 2016 Posté(e) le 5 mai 2016 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éedeuxième élément : le point cliquétroisième élément : la matrice combinant toutes les transformations subies par l'entité sélectionnéequatriè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 - GitHub Développements sur mesure pour AutoCAD
iowa13 Posté(e) le 9 janvier 2018 Posté(e) le 9 janvier 2018 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)
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