Visual LISP, AutoLISP and General Customization
cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

DELETE DIMENSIONS INSIDE BLOCKS

10 REPLIES 10
SOLVED
Reply
Message 1 of 11
NESSEL
2753 Views, 10 Replies

DELETE DIMENSIONS INSIDE BLOCKS

Hi all,

 

I need a lisp routine which will delete all the dimensions inside selected block or blocks, including nested blocks inside.

 

Can anybody help please?

 

Thanx...

10 REPLIES 10
Message 2 of 11
pbejse
in reply to: NESSEL

Today is your lucky day..

 

on my way to overcoming my fear of recursive programming, earlier

I happen to be playing around on a code for eradicating unwanted entities oinside a block

 

 

I tweaked it a lttle to fit your neeeds

 

;;	Credit to Jummy BergMark		;;
;;	For DeleteObjectFromBlock Routine	;;
;;	Manusoft for the Recursive Routine	;;
;;	Me for tweaking it for you		;;


(defun C:FXB (/ ELST ENAM ESEL BNAM FLST)
  (vl-load-com)
  (setq Dsdwg (vla-get-activedocument (vlax-get-acad-object)))
  (setq	ESEL (entsel "\nSelect block: ")
	ENAM (car ESEL)
	ELST (entget ENAM)
	BNAM (cdr (assoc 2 ELST))
	FLST nil
  )
  (fix1 BNAM)
  (vl-cmdf "regen")
  (prin1)
)


(defun FIX1 (BNAM / BENAM)
  (if (not (member BNAM FLST))
    (progn
      (setq FLST  (cons BNAM FLST)
	    BENAM (tblobjname "block" BNAM)
      )
      (while (setq BENAM (entnext BENAM))
					;(print (entget BENAM))
	(if (= (cdr (assoc 0 (entget BENAM))) "INSERT")
	  (fix1 (cdr (assoc 2 (entget BENAM))))
	  (if (= (cdr (assoc 0 (entget BENAM))) "DIMENSION")
	    (progn
	      (setq Dim2Del (vlax-ename->vla-object BENAM)
		    blk	    (vla-ObjectIdToObject
			      Dsdwg
			      (vla-get-ownerID Dim2Del)
			    )
	      )
	      (vla-delete Dim2Del)
	      (vla-get-count blk)
	    )
	  )
	)
      )
    )
  )
  (princ)
)

 Hope this helps

 

Message 3 of 11
NESSEL
in reply to: pbejse

Hi again,

 

Really my lucky day! 🙂 thank you for your help.

 

Great work 🙂

Message 4 of 11
tkunsman
in reply to: pbejse

that is cool. thanks for sharing! Smiley Happy

Message 5 of 11
jjorovi
in reply to: pbejse

There is another way to eliminate the dimensions without selecting the block?

Message 6 of 11
_Tharwat
in reply to: NESSEL

My version with multiple selection set .....

 

(defun c:Test (/ ss i sn name lst)
  (vl-load-com)
;;;        ------ Tharwat 15. June. 2012 -----      ;;;
;;; codes to delete all dimensions entities in the  ;;;
;;;                selected blocks                  ;;;
  (if (not acdoc)
    (setq acdoc (vla-get-activedocument (vlax-get-acad-object)))
  )
  (if (setq ss (ssget "_:L" '((0 . "INSERT"))))
    (repeat (setq i (sslength ss))
      (setq sn (ssname ss (setq i (1- i))))
      (if (not (member (setq name (cdr (assoc 2 (entget sn)))) lst))
        (progn
          (setq lst (cons name lst))
          (vlax-for each (vla-item (vla-get-blocks acdoc) name)
            (if (eq (vla-get-objectname each) "AcDbRotatedDimension")
              (vla-delete each))
          )
        )
      )
    )
    (princ)
  )
  (if ss (vla-regen acdoc AcAllviewports))
  (princ)
)

 

Message 7 of 11
jjorovi
in reply to: _Tharwat

The code I'm looking for is more complex.
I need to remove all types of dimensions including the angular dimensions and aligned dimensions, without selecting the blocks.
Also, the dimensions in nested blocks have to be deleted.

Message 8 of 11
Ian_Bryant
in reply to: jjorovi

Hi,

not sure what you mean by without selecting blocks.

If it means you want to remove dimensions from

all defined blocks, you could try:

 

(defun c:blitz-all-dims ( / tbl ent dlist)
 (while (setq tbl (tblnext "BLOCK" (not tbl)))
  (if (and
        (not (assoc 1 tbl))
        (setq ent (cdr (assoc -2 tbl)))
      )
      (while ent
        (if (= (cdr (assoc 0 (entget ent))) "DIMENSION")
            (setq dlist (cons ent dlist))
        )
        (setq ent (entnext ent))
      )
  )
 )
 (foreach n dlist (vla-delete (vlax-ename->vla-object n)))
 (princ)
)

Ian

 

Message 9 of 11
pbejse
in reply to: jjorovi

Another

 

(defun c:blitz2  (/ aDoc)
      (vl-load-com)
      (setq aDoc (vla-get-ActiveDocument (vlax-get-acad-object)))
      (vlax-for blk (vla-get-blocks aDoc)
      (if
            (and
                  (eq :vlax-false (vla-get-isXref blk))
                  (eq :vlax-false (vla-get-isLayout blk))
                  (not (wcmatch (vla-get-name blk) "`*D*"))
                  )
                 (vlax-for dim blk
                       (if (wcmatch
                                 (vla-get-ObjectName dim)
                                 "AcDb*Dimension")
                             (vla-delete dim))
                       )
                 )
            )
      (vla-regen aDoc acAllViewports)
      (princ)
      )

Message 10 of 11
jjorovi
in reply to: pbejse

pbejse, you're amazing. This code is exactly what I've been looking for. I added a couple of lines to remove all outside dimensions of the blocks. (defun c:dimdel (/ aDoc BNAM) (vl-load-com) (setq aDoc (vla-get-ActiveDocument (vlax-get-acad-object))) (vlax-for blk (vla-get-blocks aDoc) (if (and (eq :vlax-false (vla-get-isXref blk)) (eq :vlax-false (vla-get-isLayout blk)) (not (wcmatch (vla-get-name blk) "`*D*")) ) (vlax-for dim blk (if (wcmatch (vla-get-ObjectName dim) "AcDb*Dimension") (vla-delete dim)) ) ) ) (FIX1 BNAM) (vla-regen aDoc acAllViewports) (prin1) ) (defun FIX1 (BNAM) (command "erase" (ssget "x" '((0 . "DIMENSION"))) "") (princ) ) Ian, thanks for your help too. Both codes work fine.
Message 11 of 11
Shubz26
in reply to: pbejse

Sorry to resurrect this post from the dead, but this is a great LISP routine! How can I amend it so that instead of deleting the dimensions, it explodes them?

Civil 3D 2020
Intel Xeon CPU W3550 @ 3.07GHz
Nvidia Quadro 2000
25GB RAM
Windows 7 Enterprise 64 Bit

Can't find what you're looking for? Ask the community or share your knowledge.

Post to forums  

Autodesk Design & Make Report

”Boost