Author Topic: Dynamic Blocks Names vs. Non Dynamic Block names  (Read 7504 times)

0 Members and 1 Guest are viewing this topic.

alanjt

  • Needs a day job
  • Posts: 5352
  • Standby for witty remark...
Re: Dynamic Blocks Names vs. Non Dynamic Block names
« Reply #15 on: February 03, 2011, 10:51:50 AM »
cat...

Code: [Select]
(defun getBlocksByName (bname / ss)
  (vl-load-com)
  (if (setq ss (ssget "_X" (list (cons 0 "INSERT") (cons 2 (strcat bname ",`*U*")))))
    ((lambda (i n / e)
       (while (setq e (ssname ss (setq i (1+ i))))
         (or (eq n (strcase (vla-get-effectivename (vlax-ename->vla-object e)))) (ssdel e ss))
       )
       (sssetfirst nil ss)
     )
      -1
      (strcase bname)
    )
  )
)
Civil 3D 2019 ~ Windohz 7 64bit
Dropbox

Harrie

  • Guest
Re: Dynamic Blocks Names vs. Non Dynamic Block names
« Reply #16 on: February 03, 2011, 11:36:50 AM »
Thanks Ronjonp,

But I prefer it, like this:

Code: [Select]
(defun getblocksbyname2 (bname / obj ss ss2)
  (vl-load-com)
  (setq ss2 (ssadd))
  (if (setq ss (ssget "_X" (list (cons 0 "INSERT") (cons 2 (strcat bname ",`*U*")))))
    (foreach blk (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
      (setq obj (vlax-ename->vla-object blk))
      (and (eq (strcase bname) (strcase (vla-get-effectivename obj))) (setq ss2 (ssadd blk ss2)))
    )
  )
  ;(sssetfirst nil ss2)
  ss2
)
Because with (sssetfirst nil ss2), I can't use it in _.PSELECT from PROPERTIES.

Regards, Harrie.

Harrie

  • Guest
Re: Dynamic Blocks Names vs. Non Dynamic Block names
« Reply #17 on: February 03, 2011, 11:41:00 AM »
Thanks Alanjt,

But your program gives the same problem as the program from Lee Mac.

Regards, Harrie.

gile

  • Gator
  • Posts: 2507
  • Marseille, France
Re: Dynamic Blocks Names vs. Non Dynamic Block names
« Reply #18 on: February 03, 2011, 11:41:21 AM »
cat...

Code: [Select]
(defun getBlocksByName (bname / ss)
  (vl-load-com)
  (if (setq ss (ssget "_X" (list (cons 0 "INSERT") (cons 2 (strcat bname ",`*U*")))))
    ((lambda (i n / e)
       (while (setq e (ssname ss (setq i (1+ i))))
         (or (eq n (strcase (vla-get-effectivename (vlax-ename->vla-object e)))) (ssdel e ss))
       )
       (sssetfirst nil ss)
     )
      -1
      (strcase bname)
    )
  )
)

Alan, while you're removing items from the selection set you're stepping, you cannot increment with 1+ systematically...
EDIT: Same problem with Lee's code.

Increment by 1+ only if the item isn't deleted
Code: [Select]
(defun getBlocksByName (bname / ss)
  (vl-load-com)
  (if (setq ss (ssget "_X" (list (cons 0 "INSERT") (cons 2 (strcat bname ",`*U*")))))
    ((lambda (i n / e)
       (while (setq e (ssname ss i))
         (if (eq n (strcase (vla-get-effectivename (vlax-ename->vla-object e))))
   (setq i (1+ i))
   (ssdel e ss)
)
       )
       (sssetfirst nil ss)
     )
      0
      (strcase bname)
    )
  )
)

Or décrement (1-)
Code: [Select]
(defun getBlocksByName (bname / ss)
  (vl-load-com)
  (if (setq ss (ssget "_X" (list (cons 0 "INSERT") (cons 2 (strcat bname ",`*U*")))))
    ((lambda (i n / e)
       (while (setq e (ssname ss (setq i (1- i))))
         (or (eq n (strcase (vla-get-effectivename (vlax-ename->vla-object e)))) (ssdel e ss))
       )
       (sssetfirst nil ss)
     )
      (sslength ss)
      (strcase bname)
    )
  )
)
« Last Edit: February 03, 2011, 11:44:39 AM by gile »
Speaking English as a French Frog

CAB

  • Global Moderator
  • Seagull
  • Posts: 10401
Re: Dynamic Blocks Names vs. Non Dynamic Block names
« Reply #19 on: February 03, 2011, 11:49:06 AM »
Just a little FYI.
This is over kill
(setq ss2 (ssadd blk ss2))
You only need this:
(ssadd blk ss2) ; adds blk to selection set
I've reached the age where the happy hour is a nap. (°¿°)
Windows 10 core i7 4790k 4Ghz 32GB GTX 970
Please support this web site.

Harrie

  • Guest
Re: Dynamic Blocks Names vs. Non Dynamic Block names
« Reply #20 on: February 03, 2011, 11:57:00 AM »
Thanks Gile,

Your programs gives a good result in DynBlkTest.dwg.
But, I prefer at the end:
Code: [Select]
  )
ss
)
Because then I can use it in  _.PSELECT from PROPERTIES.

Regards, Harrie.

gile

  • Gator
  • Posts: 2507
  • Marseille, France
Re: Dynamic Blocks Names vs. Non Dynamic Block names
« Reply #21 on: February 03, 2011, 12:13:29 PM »
Thanks Gile,

Your programs gives a good result in DynBlkTest.dwg.
But, I prefer at the end:
Code: [Select]
  )
ss
)
Because then I can use it in  _.PSELECT from PROPERTIES.

Regards, Harrie.

So, here's the way I'd have written it:

Code: [Select]
(defun ssBlocksByName (bname / ss n blk)
  (vl-load-com)
  (if
    (setq bname (strcase bname)
  ss (ssget "_X" (list (cons 0 "INSERT") (cons 2 (strcat bname ",`*U*"))))
    )
     (repeat (setq n (sslength ss))
       (and
(setq blk (ssname ss (setq n (1- n))))
(/= bname (strcase (vla-get-effectivename (vlax-ename->vla-object blk))))
(ssdel blk ss)
       )
     )
  )
  ss
)
« Last Edit: February 03, 2011, 12:21:01 PM by gile »
Speaking English as a French Frog

Harrie

  • Guest
Re: Dynamic Blocks Names vs. Non Dynamic Block names
« Reply #22 on: February 03, 2011, 12:24:55 PM »
Thanks Gile,

So, here's the way I'd have written it: Yes.

Regards, Harrie.

alanjt

  • Needs a day job
  • Posts: 5352
  • Standby for witty remark...
Re: Dynamic Blocks Names vs. Non Dynamic Block names
« Reply #23 on: February 03, 2011, 01:27:53 PM »
Crap, I didn't even think about that. Thanks Gile.

cat...

Code: [Select]
(defun getBlocksByName (bname / ss)
  (vl-load-com)
  (if (setq ss (ssget "_X" (list (cons 0 "INSERT") (cons 2 (strcat bname ",`*U*")))))
    ((lambda (i n / e)
       (while (setq e (ssname ss (setq i (1+ i))))
         (or (eq n (strcase (vla-get-effectivename (vlax-ename->vla-object e)))) (ssdel e ss))
       )
       (sssetfirst nil ss)
     )
      -1
      (strcase bname)
    )
  )
)

Alan, while you're removing items from the selection set you're stepping, you cannot increment with 1+ systematically...
EDIT: Same problem with Lee's code.

Increment by 1+ only if the item isn't deleted
Code: [Select]
(defun getBlocksByName (bname / ss)
  (vl-load-com)
  (if (setq ss (ssget "_X" (list (cons 0 "INSERT") (cons 2 (strcat bname ",`*U*")))))
    ((lambda (i n / e)
       (while (setq e (ssname ss i))
         (if (eq n (strcase (vla-get-effectivename (vlax-ename->vla-object e))))
   (setq i (1+ i))
   (ssdel e ss)
)
       )
       (sssetfirst nil ss)
     )
      0
      (strcase bname)
    )
  )
)

Or décrement (1-)
Code: [Select]
(defun getBlocksByName (bname / ss)
  (vl-load-com)
  (if (setq ss (ssget "_X" (list (cons 0 "INSERT") (cons 2 (strcat bname ",`*U*")))))
    ((lambda (i n / e)
       (while (setq e (ssname ss (setq i (1- i))))
         (or (eq n (strcase (vla-get-effectivename (vlax-ename->vla-object e)))) (ssdel e ss))
       )
       (sssetfirst nil ss)
     )
      (sslength ss)
      (strcase bname)
    )
  )
)
Civil 3D 2019 ~ Windohz 7 64bit
Dropbox

Lee Mac

  • Seagull
  • Posts: 12913
  • London, England
Re: Dynamic Blocks Names vs. Non Dynamic Block names
« Reply #24 on: February 03, 2011, 02:07:19 PM »
Crap, I didn't even think about that. Thanks Gile.

Ditto, completely overlooked that  :ugly:

Thanks guys  :-)

ronjonp

  • Needs a day job
  • Posts: 7527
Re: Dynamic Blocks Names vs. Non Dynamic Block names
« Reply #25 on: February 03, 2011, 03:17:48 PM »
Thanks Ronjonp,

But I prefer it, like this:

Code: [Select]
(defun getblocksbyname2 (bname / obj ss ss2)
  (vl-load-com)
  (setq ss2 (ssadd))
  (if (setq ss (ssget "_X" (list (cons 0 "INSERT") (cons 2 (strcat bname ",`*U*")))))
    (foreach blk (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
      (setq obj (vlax-ename->vla-object blk))
      (and (eq (strcase bname) (strcase (vla-get-effectivename obj))) (setq ss2 (ssadd blk ss2)))
    )
  )
  ;(sssetfirst nil ss2)
  ss2
)
Because with (sssetfirst nil ss2), I can't use it in _.PSELECT from PROPERTIES.

Regards, Harrie.

sssetfirst wil select them for you ... what is pselect?

Windows 11 x64 - AutoCAD /C3D 2023

Custom Build PC

alanjt

  • Needs a day job
  • Posts: 5352
  • Standby for witty remark...
Re: Dynamic Blocks Names vs. Non Dynamic Block names
« Reply #26 on: February 03, 2011, 03:19:08 PM »
Thanks Ronjonp,

But I prefer it, like this:

Code: [Select]
(defun getblocksbyname2 (bname / obj ss ss2)
  (vl-load-com)
  (setq ss2 (ssadd))
  (if (setq ss (ssget "_X" (list (cons 0 "INSERT") (cons 2 (strcat bname ",`*U*")))))
    (foreach blk (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
      (setq obj (vlax-ename->vla-object blk))
      (and (eq (strcase bname) (strcase (vla-get-effectivename obj))) (setq ss2 (ssadd blk ss2)))
    )
  )
  ;(sssetfirst nil ss2)
  ss2
)
Because with (sssetfirst nil ss2), I can't use it in _.PSELECT from PROPERTIES.

Regards, Harrie.

sssetfirst wil select them for you ... what is pselect?
The only difference I've ever noticed is that, unlike Select, PSelect will leave the selected item(s) selected.
Civil 3D 2019 ~ Windohz 7 64bit
Dropbox

HofCAD

  • Guest
Re: Dynamic Blocks Names vs. Non Dynamic Block names
« Reply #27 on: February 03, 2011, 06:14:57 PM »
Like this:
Code: [Select]
(defun GetBlocksByName (bname / obj ss ss2)
  (vl-load-com)
  (setq ss2 (ssadd))
  (if (setq ss (ssget "_X" (list (cons 0 "INSERT") (cons 2 (strcat bname ",`*U*")))))
    (foreach blk (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
      (setq obj (vlax-ename->vla-object blk))
      (and (eq (strcase bname) (strcase (vla-get-effectivename obj))) (ssadd blk ss2))
    )
  )
  ss2
)
(defun c:SELDYNBLK(/ BlkName)
(vl-load-com)
(setq BlkName (getstring "\nEnter block name or <Select>:"))
(if (= BlkName "")
(setq BlkName (vla-get-effectivename (vlax-ename->vla-object(car (entsel)))))
)
(setq S (GetBlocksByName BlkName))
;(princ (strcat "\nThere are " (itoa (sslength S)) " blocks in the selection.\n"))
(command "_.PSELECT" S "")
)
(defun C:SDB() (c:SELDYNBLK))

Regards, HofCAD CSI.
« Last Edit: February 03, 2011, 06:20:35 PM by HofCAD »

Lee Mac

  • Seagull
  • Posts: 12913
  • London, England
Re: Dynamic Blocks Names vs. Non Dynamic Block names
« Reply #28 on: February 03, 2011, 06:27:53 PM »
Of course, there is another method  8-)

Code: [Select]
(defun test ( block )
  (ssget "_X"
    (list
      (cons 0 "INSERT")
      (cons 2 (LM:BlockList->Str (cons block (LM:AnonymousInstancesof block)) ","))
    )
  )
)

(defun LM:AnonymousInstancesof ( block / def rec nme ref lst )
  (while (setq def (tblnext "BLOCK" (null def)))
    (if (= 1 (logand 1 (cdr (assoc 70 def))))
      (progn
        (setq rec
          (entget
            (cdr
              (assoc 330
                (entget
                  (tblobjname "BLOCK" (setq nme (cdr (assoc 2 def))))
                )
              )
            )
          )
        )
        (while (setq ref (assoc 331 rec))
          (if
            (and
              (eq block (vla-get-effectivename (vlax-ename->vla-object (cdr ref))))
              (not (member nme lst))
            )
            (setq lst (cons nme lst))
          )
          (setq rec (cdr (member (assoc 331 rec) rec)))
        )
      )
    )
  )
  (reverse lst)
)

(defun LM:BlockList->Str ( lst del / f )

  (defun f ( s ) (if (wcmatch s "`**") (strcat "`" s) s))
 
  (if (cdr lst)
    (strcat (f (car lst)) del (LM:BlockList->Str (cdr lst) del))
    (f (car lst))
  )
)
« Last Edit: February 03, 2011, 06:33:05 PM by Lee Mac »

ronjonp

  • Needs a day job
  • Posts: 7527
Re: Dynamic Blocks Names vs. Non Dynamic Block names
« Reply #29 on: February 04, 2011, 12:54:42 PM »
Similar to Lee's but will output a list '(("blockname" (ename1 ename2 ename3)))

Code: [Select]
(defun rjp-getinsertedblocks (/ b brec inserts name o out)
  (while (setq b (tblnext "block" (not b)))
    (if (not (assoc 1 b))
      ;;xref path
      (progn (setq name   (cdr (assoc 2 b))
  brec   (entget (cdr (assoc 330 (entget (tblobjname "block" name)))))
  inserts (cdr (member '(102 . "{BLKREFS") brec))
  inserts (mapcar (function cdr) (cdr (member '(102 . "}") (reverse inserts))))
    )
    (if (and (setq inserts (vl-remove-if-not (function (lambda (x) (entget x))) inserts))
     (setq o (vlax-ename->vla-object (car inserts)))
     (vlax-property-available-p o 'effectivename)
     (setq name (vla-get-effectivename o))
)
      (if (assoc name out)
(setq out (mapcar (function (lambda (x)
      (if (eq (car x) name)
(list name (append (cadr x) inserts))
x
      )
    )
  )
  out
  )
)
(setq out (cons (list name inserts) out))
      )
    )
      )
    )
  )
  (vl-sort out (function (lambda (n1 n2) (< (car n1) (car n2)))))
)

(mapcar '(lambda (x) (print (strcat (car x) " - " (itoa (length (cadr x))))))
(rjp-getinsertedblocks)
)

Windows 11 x64 - AutoCAD /C3D 2023

Custom Build PC