The syntax for while is:
(while (test expression)
(expression 1)(expression 2)(expression 3) .... )
The first argument to while is a test expression. Any number of expressions can follow. These following expressions are evaluated if the test returns a non-nil value.
Open an AutoLISP file called Macro.lsp and copy the contents of figure 5.8 into this file. Since this is a larger program file than you worked with previously, you may want to make a print out of it and check your print out against figure 5.8 to make sure you haven't made any transcription errors. Go back to your AutoCAD Chapt5 file. Now you will use the macro program to create a keyboard macro that changes the last object drawn to a layer called hidden. Do the following:
1. Draw a diagonal line from the lower left corner of the drawing area to the upper right corner. 2. Load the Macro.lsp file
3. Enter Macro at the command prompt. 4. At the following prompt:
Enter name of macro:
5. Enter the word chlt. At the prompt:
Enter macro or / to exit:
6. Enter the word CHANGE.
The Enter macro prompt appears again. Enter the following series of words at each Enter macro prompt:
Enter macro or / to exit:
L
Enter macro or / to exit: [press return] Enter macro or / to exit:
P
Enter macro or / to exit:
HIDDEN
Enter macro or / to exit: [press return] Enter macro or / to exit:
/
This is where the while function takes action. As you enter each response to the Enter macro prompt, while test to see if you entered a forward slash. If not, it evaluates the expressions included as its arguments. Once you enter the backslash, while stops its repetition. You get the prompt:
End of macro CLAYER
The input you gave to the Enter macro prompt is exactly what you would enter if you had used the change command normally. Now run your macro by entering:
chlt
The line you drew changes to the hidden line type.
When Macro starts, it first defines two variables def and macro.
(setq def "defun ") (setq macro '(command))
Def is a string variable that is used later to define the macro. Macro is the beginning of a list variable which is used to store the keystrokes of the macro. The next line prompts the user to enter a name for the macro.
(setq macname (getstring "\nEnter name of macro: "))
The entered name is then stored with the variable macname. Finally, we come to the while function.
(while (/= str1 "/")
The while expression is broken into several lines. The first line contains the actual while function along with the test expression. In this case, the test compares the variable str1 with the string "/" to see if they are not equal. So long as str1 is not equal to "/", while will execute the arguments that follow the test. The next four lines are the expressions to be evaluated. The first of these lines prompts the user to enter the text that compose the macro.
(setq str1 (getstring "\nEnter macro or / to exit: " ))
When the user enters a value at this prompt, it is assigned to the variable str1. The next line uses an if function to test if str1 is equal to "/".
(if (= str1 "/")
(princ "\nEnd of macro ")
This expression prints the prompt End of macro to the prompt line. If the test results in nil, the following line appends the value of str1 to the existing list macro.
(Setq macro (append macro (list str1)))
The append function takes one list and appends its contents to the end of another list. In this case, whatever is entered at the Enter macro prompt is appended to the variable macro. Each time a new value is entered at the Enter macro prompt, it is appended to the variable macro creating a list of keyboard entries to be saved (see figure 5.10).
Figure 5.10: Appending lists to other lists
The next two lines close the if and while expressions. Note that comments are used to help make the program easier to understand.
);end if );end while
The last line combines all the elements of the program into an expression that, when evaluated, creates a new macro program.
(eval (list (read def) (read macname) '() macro)) )
Figure 5.11 shows gives breakdown of how this last line works.
Figure 5.11: How the macro is defined
The read function used in this expression is a special function that converts a string value into a symbol. If a string argument to read contains spaces, read will convert the first part of the string and ignore everything after the space.
The while expression does not always include prompts for user input. Figure 5.12 shows a simple program that inserts a sequence of numbers in increasing value. Each number is increased by one and they are spaces 0.5 units apart. The user is prompted for a starting point and a first and last number. Once the user inputs this information, the program calculates the number to be inserted, inserts the number using the text command, calculates the next number and so on until the last number is reached.
;Program to draw sequential numbers -- Seq.lsp (defun C:SEQ (/ pt1 currnt last)
(setq pt1 (getpoint "\nPick start point: ")) (setq currnt (getint "\nEnter first number: ")) (setq last (getint "\nEnter last number: "))
(command "text" pt1 "" "" currnt) ;write first number (while (< currnt last) ;while not last number (setq currnt (1+ currnt)) ;get next number (command "text" "@.5<0" "" "" currnt) ;write value of currnt );end while
);end seq
Figure 5.12: Sequential number program
This program expects the current text style to have a height of 0.