JoeC Posted June 3, 2010 Posted June 3, 2010 Anyone know a lisp or a way to find nested blocks in a drawing? I have drawings with both nested and simple blocks, and the nested ones are causing problems with an excel program. I need to identify and eliminate the nested blocks...hopefully globally. Thanks Quote
CJJ Posted June 3, 2010 Posted June 3, 2010 I've been looking for a way to do this, also. Obviously, the easy answer would be to explode everything. I usually yell out "BOOM!" when I run the explode command. This way I get to annoy everyone twice, once while exploding and then again if anyone else ever needs to use the drawing. But seriously, I always feel like i'm wasting a lot of time trying to do detective work and identify blocks within blocks (within blocks withing blocks within...) one at a time, when there must be an easier way. Quote
David Bethel Posted June 3, 2010 Posted June 3, 2010 Incorporating all nested blocks into the parent block in a single swoop would a very challenging project to say the least. It could also make some extremely large drawings. Is it the naming conventions that causing problems? or attribute values? -David Quote
JoeC Posted June 3, 2010 Author Posted June 3, 2010 Hmmm, not sure I understand your reply. I don't want to incorporate the nested blocks. I only want to identify which ones are nested (without inspecting each block individually), so that I can "un-nest" them. Quote
Lee Mac Posted June 3, 2010 Posted June 3, 2010 How about something like this: [b][color=RED]([/color][/b][b][color=BLUE]defun[/color][/b] c:NestSel [b][color=RED]([/color][/b] [b][color=BLUE]/[/color][/b] ss def n l [b][color=RED])[/color][/b] [i][color=#990099];; © Lee Mac ~ 03.06.10[/color][/i] [b][color=RED]([/color][/b][b][color=BLUE]vl-load-com[/color][/b][b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]while[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] def [b][color=RED]([/color][/b][b][color=BLUE]tblnext[/color][/b] [b][color=#a52a2a]"BLOCK"[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]not[/color][/b] def[b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]if[/color][/b] [b][color=RED]([/color][/b]ContainsNested [b][color=RED]([/color][/b][b][color=BLUE]tblobjname[/color][/b] [b][color=#a52a2a]"BLOCK"[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] n [b][color=RED]([/color][/b][b][color=BLUE]cdr[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]assoc[/color][/b] [b][color=#009900]2[/color][/b] def[b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] l [b][color=RED]([/color][/b][b][color=BLUE]cons[/color][/b] n l[b][color=RED])[/color][/b][b][color=RED])[/color][/b] [b][color=RED])[/color][/b] [b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]if[/color][/b] l [b][color=RED]([/color][/b][b][color=BLUE]sssetfirst[/color][/b] [b][color=BLUE]nil[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]ssget[/color][/b] [b][color=#a52a2a]"_X"[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]list[/color][/b] [b][color=DARKRED]'[/color][/b][b][color=RED]([/color][/b][b][color=#009900]0[/color][/b] . [b][color=#a52a2a]"INSERT"[/color][/b][b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]cons[/color][/b] [b][color=#009900]2[/color][/b] [b][color=RED]([/color][/b]lst->str l [b][color=#a52a2a]","[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b] [b][color=RED])[/color][/b] [b][color=RED])[/color][/b] [b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]princ[/color][/b][b][color=RED])[/color][/b] [b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]defun[/color][/b] ContainsNested [b][color=RED]([/color][/b] ent [b][color=BLUE]/[/color][/b] foo [b][color=RED])[/color][/b] [i][color=#990099];; © Lee Mac ~ 03.06.10[/color][/i] [b][color=RED]([/color][/b][b][color=BLUE]defun[/color][/b] foo [b][color=RED]([/color][/b] e [b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]if[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] e [b][color=RED]([/color][/b][b][color=BLUE]entnext[/color][/b] e[b][color=RED])[/color][/b][b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]cons[/color][/b] e [b][color=RED]([/color][/b]foo e[b][color=RED])[/color][/b][b][color=RED])[/color][/b] [b][color=RED])[/color][/b] [b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]vl-some[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]function[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]lambda[/color][/b] [b][color=RED]([/color][/b] x [b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]eq[/color][/b] [b][color=#a52a2a]"INSERT"[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]cdr[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]assoc[/color][/b] [b][color=#009900]0[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]entget[/color][/b] x[b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b] [b][color=RED])[/color][/b] [b][color=RED])[/color][/b] [b][color=RED]([/color][/b]foo ent[b][color=RED])[/color][/b] [b][color=RED])[/color][/b] [b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]defun[/color][/b] lst->str [b][color=RED]([/color][/b] lst del [b][color=RED])[/color][/b] [i][color=#990099];; © Lee Mac ~ 03.06.10[/color][/i] [b][color=RED]([/color][/b][b][color=BLUE]if[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]cdr[/color][/b] lst[b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]strcat[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]car[/color][/b] lst[b][color=RED])[/color][/b] del [b][color=RED]([/color][/b]lst->str [b][color=RED]([/color][/b][b][color=BLUE]cdr[/color][/b] lst[b][color=RED])[/color][/b] del[b][color=RED])[/color][/b][b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]car[/color][/b] lst[b][color=RED])[/color][/b] [b][color=RED])[/color][/b] [b][color=RED])[/color][/b] R12 Friendly Version for David [b][color=RED]([/color][/b][b][color=BLUE]defun[/color][/b] c:NestSel [b][color=RED]([/color][/b] [b][color=BLUE]/[/color][/b] ss def n l [b][color=RED])[/color][/b] [i][color=#990099];; © Lee Mac ~ 03.06.10[/color][/i] [b][color=RED]([/color][/b][b][color=BLUE]while[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] def [b][color=RED]([/color][/b][b][color=BLUE]tblnext[/color][/b] [b][color=#a52a2a]"BLOCK"[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]not[/color][/b] def[b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]if[/color][/b] [b][color=RED]([/color][/b]ContainsNested [b][color=RED]([/color][/b][b][color=BLUE]tblobjname[/color][/b] [b][color=#a52a2a]"BLOCK"[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] n [b][color=RED]([/color][/b][b][color=BLUE]cdr[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]assoc[/color][/b] [b][color=#009900]2[/color][/b] def[b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] l [b][color=RED]([/color][/b][b][color=BLUE]cons[/color][/b] n l[b][color=RED])[/color][/b][b][color=RED])[/color][/b] [b][color=RED])[/color][/b] [b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]if[/color][/b] l [b][color=RED]([/color][/b][b][color=BLUE]sssetfirst[/color][/b] [b][color=BLUE]nil[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]ssget[/color][/b] [b][color=#a52a2a]"_X"[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]list[/color][/b] [b][color=DARKRED]'[/color][/b][b][color=RED]([/color][/b][b][color=#009900]0[/color][/b] . [b][color=#a52a2a]"INSERT"[/color][/b][b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]cons[/color][/b] [b][color=#009900]2[/color][/b] [b][color=RED]([/color][/b]lst->str l [b][color=#a52a2a]","[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b] [b][color=RED])[/color][/b] [b][color=RED])[/color][/b] [b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]princ[/color][/b][b][color=RED])[/color][/b] [b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]defun[/color][/b] ContainsNested [b][color=RED]([/color][/b] ent [b][color=BLUE]/[/color][/b] foo [b][color=RED])[/color][/b] [i][color=#990099];; © Lee Mac ~ 03.06.10[/color][/i] [b][color=RED]([/color][/b][b][color=BLUE]defun[/color][/b] foo [b][color=RED]([/color][/b] e [b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]if[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] e [b][color=RED]([/color][/b][b][color=BLUE]entnext[/color][/b] e[b][color=RED])[/color][/b][b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]cons[/color][/b] e [b][color=RED]([/color][/b]foo e[b][color=RED])[/color][/b][b][color=RED])[/color][/b] [b][color=RED])[/color][/b] [b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]member[/color][/b] [b][color=#a52a2a]"INSERT"[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]mapcar[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]function[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]lambda[/color][/b] [b][color=RED]([/color][/b] x [b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]cdr[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]assoc[/color][/b] [b][color=#009900]0[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]entget[/color][/b] x[b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b] [b][color=RED])[/color][/b] [b][color=RED])[/color][/b] [b][color=RED]([/color][/b]foo ent[b][color=RED])[/color][/b] [b][color=RED])[/color][/b] [b][color=RED])[/color][/b] [b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]defun[/color][/b] lst->str [b][color=RED]([/color][/b] lst del [b][color=RED])[/color][/b] [i][color=#990099];; © Lee Mac ~ 03.06.10[/color][/i] [b][color=RED]([/color][/b][b][color=BLUE]if[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]cdr[/color][/b] lst[b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]strcat[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]car[/color][/b] lst[b][color=RED])[/color][/b] del [b][color=RED]([/color][/b]lst->str [b][color=RED]([/color][/b][b][color=BLUE]cdr[/color][/b] lst[b][color=RED])[/color][/b] del[b][color=RED])[/color][/b][b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]car[/color][/b] lst[b][color=RED])[/color][/b] [b][color=RED])[/color][/b] [b][color=RED])[/color][/b] Quote
alanjt Posted June 3, 2010 Posted June 3, 2010 How about something like this:[/code] LoL, I guess your vacation is over. Quote
Lee Mac Posted June 3, 2010 Posted June 3, 2010 LoL, I guess your vacation is over. It looked like an interesting thing to code is all Quote
JoeC Posted June 3, 2010 Author Posted June 3, 2010 Thanks Lee. Once again, exactly what I was looking for! Best regards. Quote
alanjt Posted June 3, 2010 Posted June 3, 2010 It looked like an interesting thing to code is all Whatever floats your boat. :wink: Quote
David Bethel Posted June 3, 2010 Posted June 3, 2010 lee, I must admit, I don't quite understand. Are you simply deleting all nested blocks? My guess is that the OP wants to keep the geometry of the nested blocks in the parent block. In order to replicate that, you would need to take into take into account the nested block scale factors ( mirrored as well), rotations, UCS, insert points, minsert values. And then if the blocks are nested 3 or 4 deep, wow! Maybe I'm missing something. -David Quote
Lee Mac Posted June 3, 2010 Posted June 3, 2010 Hi David, I was under the impression that the OP just wanted to select blocks that had other blocks nested within. My code merely takes each block definition in turn, and if the definition contains a block nested at least one level deep, it will be contained in the selection set. Lee Quote
rkmcswain Posted May 24, 2018 Posted May 24, 2018 @LeeMac - consider the problem where you know certain blocks are nested (no insertions of them, and not purge-able) - and you want to find out where they are nested. I was envisioning an output like this: >Block1 >> Block-A >> Block-B >Block2 >> Block-C >> Block-D >Block3 >> Block-E >> Block-A >> Block-B >Block4 >> Block-B So looking at that, you could easily see that both Block-A and Block4 contain Block-B. Of course another way to tackle this, would be to ask the user for the name of the block, and then just iterate everything looking for that one block and report back the parent block(s) that contain it. Cheers all. Quote
Lee Mac Posted May 24, 2018 Posted May 24, 2018 (edited) Here's a basic form of such a program - (defun _nestedblocks ( blk / enx rtn ) (while (setq blk (entnext blk)) (if (and (setq enx (entget blk)) (= "INSERT" (cdr (assoc 0 enx))) (/= 1 (cdr (assoc 60 enx))) (not (member (cdr (assoc 2 enx)) rtn)) ) (setq rtn (cons (cdr (assoc 2 enx)) rtn)) ) ) rtn ) (defun _blockhierarchy ( / blk def rtn ) (while (setq def (tblnext "block" (null def))) (setq rtn (cons (cons (setq blk (cdr (assoc 2 def))) (_nestedblocks (tblobjname "block" blk)) ) rtn ) ) ) rtn ) (defun _printblockhierarchy ( blk lst ind ) (terpri) (repeat ind (princ " ")) (princ "+---") (if (setq nst (cdr (assoc blk lst))) (progn (princ "+ ") (princ blk) (foreach sub nst (_printblockhierarchy sub lst (1+ ind)) ) ) (progn (princ "> ") (princ blk) ) ) ) (defun c:blockhierarchy ( ) ( (lambda ( lst ) (foreach blk lst (_printblockhierarchy (car blk) lst 0) ) (textpage) ) (_blockhierarchy) ) (princ) ) Edited January 24, 2020 by Lee Mac Quote
rkmcswain Posted May 25, 2018 Posted May 25, 2018 Very nice @LeeMac ! Didn't intend for you to jump on this and code it. Bonus points! Quote
ronjonp Posted May 25, 2018 Posted May 25, 2018 Here's a basic form of such a program - ([color=BLUE]defun[/color] _nestedblocks ( blk [color=BLUE]/[/color] enx rtn ) ([color=BLUE]while[/color] ([color=BLUE]setq[/color] blk ([color=BLUE]entnext[/color] blk)) ([color=BLUE]if[/color] ([color=BLUE]and[/color] ([color=BLUE]setq[/color] enx ([color=BLUE]entget[/color] blk)) ([color=BLUE]=[/color] [color=MAROON]"INSERT"[/color] ([color=BLUE]cdr[/color] ([color=BLUE]assoc[/color] 0 enx))) ([color=BLUE]/=[/color] 1 ([color=BLUE]cdr[/color] ([color=BLUE]assoc[/color] 60 enx))) ([color=BLUE]not[/color] ([color=BLUE]member[/color] ([color=BLUE]cdr[/color] ([color=BLUE]assoc[/color] 2 enx)) rtn)) ) ([color=BLUE]setq[/color] rtn ([color=BLUE]cons[/color] ([color=BLUE]cdr[/color] ([color=BLUE]assoc[/color] 2 enx)) rtn)) ) ) rtn ) ([color=BLUE]defun[/color] _blockhierarchy ( [color=BLUE]/[/color] blk def rtn ) ([color=BLUE]while[/color] ([color=BLUE]setq[/color] def ([color=BLUE]tblnext[/color] [color=MAROON]"block"[/color] ([color=BLUE]null[/color] def))) ([color=BLUE]setq[/color] rtn ([color=BLUE]cons[/color] ([color=BLUE]cons[/color] ([color=BLUE]setq[/color] blk ([color=BLUE]cdr[/color] ([color=BLUE]assoc[/color] 2 def))) (_nestedblocks ([color=BLUE]tblobjname[/color] [color=MAROON]"block"[/color] blk)) ) rtn ) ) ) rtn ) ([color=BLUE]defun[/color] _printblockhierarchy ( blk lst ind ) ([color=BLUE]terpri[/color]) ([color=BLUE]repeat[/color] ind ([color=BLUE]princ[/color] [color=MAROON]" "[/color])) ([color=BLUE]princ[/color] [color=MAROON]"+---"[/color]) ([color=BLUE]if[/color] ([color=BLUE]setq[/color] nst ([color=BLUE]cdr[/color] ([color=BLUE]assoc[/color] blk lst))) ([color=BLUE]progn[/color] ([color=BLUE]princ[/color] [color=MAROON]"+ "[/color]) ([color=BLUE]princ[/color] blk) ([color=BLUE]foreach[/color] sub nst (_printblockhierarchy sub lst ([color=BLUE]1+[/color] ind)) ) ) ([color=BLUE]progn[/color] ([color=BLUE]princ[/color] [color=MAROON]"> "[/color]) ([color=BLUE]princ[/color] blk) ) ) ) ([color=BLUE]defun[/color] c:blockhierarchy ( ) ( ([color=BLUE]lambda[/color] ( lst ) ([color=BLUE]foreach[/color] blk lst (_printblockhierarchy ([color=BLUE]car[/color] blk) lst 0) ) ([color=BLUE]textpage[/color]) ) (_blockhierarchy) ) ([color=BLUE]princ[/color]) ) That's pretty slick Quote
marko_ribar Posted May 25, 2018 Posted May 25, 2018 Yes it's very good... Just to inform you, I've updated my and Gary's version for Xrefs, posted here : http://www.theswamp.org/index.php?topic=40361.msg457928#msg457928 HTH., M.R. Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.