Into the Database - Page II
When you first start to delve into the AutoCAD database it is, I
admit, quite daunting. But, although entity access and manipulation is
fairly complex, it can be divided into component parts that make it much
easier to understand.
Let's have a look at an AutoLisp routine that can be used, as a sort of
template
which you can apply to numerous, similar applications. Have a close look
at this coding :
(defun C:CHLAYER ( / a1 a2 n index b1 b2 b3 d1 d2)
(prompt "\nSelect Entities to be Changed : ")
(setq a1 (ssget))
(prompt "\nPoint to Entity on Target Layer : ")
(setq a2 (entsel))
(setq n (sslength a1))
(setq index 0)
(setq b2 (entget (car a2)))
(setq d2 (assoc 8 b2))
(repeat n
(setq b1 (entget (ssname a1 index)))
(setq d1 (assoc 8 b1))
(setq b3 (subst d2 d1 b1))
(entmod b3)
(setq index (1+ index))
);repeat
(princ)
);defun
(princ)
This routine allows you to select any number of objects and change them
to a different layer. The target layer is choosen by simply pointing to an
object on the desired layer. (To test this routine, you will need to
create a drawing with objects on different layers.) Let's have a look line
by line :
(defun C:CHLAYER ( / a1 a2 n index b1 b2 b3 d1 d2)
Defines the function and declares all variables as local.
(prompt "\nSelect Entities to be Changed : ")
Prompts the user.
(setq a1 (ssget))
Allows the user to select the objects to be changed. The selection set
is assigned to variable 'a1'.
(prompt "\nPoint to Entity on Target Layer : ")
Prompts the user to select the Target Layer.
(setq a2 (entsel))
This is a special type of selection statement that only allows you to
select one entity.
(setq n (sslength a1))
Counts the number of entities in the selection set 'a1' and stores this
number in variable 'n'.
(setq index 0)
Sets the loop control variable 'index' to zero.
(setq b2 (entget (car a2)))
This statement retrieves the entity list from 'a2' and assigns it to
'b2'.
(setq d2 (assoc 8 b2))
This looks for the code 8 in the entity list 'a2', and then assigns the
sub list to 'd2'.
(repeat n
This begins the loop that pages through the selection set.
(setq b1 (entget (ssname a1 index)))
This gets the entity list and assigns it to 'b1'.
(setq d1 (assoc 8 b1))
Gets the sublist code 8. (The Layer)
(setq b3 (subst d2 d1 b1))
Substitutes the new 'd2' layer for the old 'd1' layer in the entity
list 'a1', and assigns it to the new entity list 'b3'.
(entmod b3)
Updates the new entity list in the database.
(setq index (1+ index))
Increases the 'index' variable by 1, priming it for the next loop.
);repeat
Closes the repeat loop.
(princ)
Finish cleanly.
);defun
Closes the function.
(princ)
Clean Loading.
Listed below is another routine that allows you to globally change the
height of text without affecting other entities. As you will see, the only
difference is, is that we have added a conditional filter to the routine.
(defun C:CHGTEXT ( / a ts n index b1 b2 b c d)
(setq a (ssget))
(setq ts (getreal "\nEnter New Text Height : "))
(setq n (sslength a))
(setq index 0)
(repeat n
(setq b1 (entget (ssname a index)))
(setq index (index+ 1))
(setq b (assoc 0 b1))
(if (= "TEXT" (cdr b))
(progn
(setq c (assoc 40 b1))
(setq d (cons (car c) ts))
(setq b2 (subst d c b1))
(entmod b2)
);progn
);if
);repeat
(princ)
);defun
(princ)
Well I bet your brain hurts after that lot!!!
On the text page we'll have a quick look at Tables.
|