Welcome to the Southern African Autolisp Website.

Afra-lISP


You are Visitor Number since 17th February 1999.


Page I. Home. Page III.

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.

Page I. Home. Page III.


Copyright © 1999 by Kenny Ramage
All rights reserved.
Information in this document is subject to change without notice.
Site created and maintained by Kenny Ramage.