- •Introduction
- •Who should read this book
- •How This Book Is Organized
- •How to Use This Book
- •Where to Find the LISP Programs
- •CHAPTER 1: Introducing AutoLISP
- •Understanding the Interpreter and Evaluation
- •The Components of an Expression
- •Using Arguments and Expressions
- •Using Variables
- •Understanding Data Types
- •Integers and Real Numbers
- •Strings
- •Lists
- •File Descriptors
- •Object Names
- •Selection Sets
- •Symbols
- •Subrs
- •Atoms
- •Assigning Values to Variables with Setq
- •Preventing Evaluation of Arguments
- •Applying Variables
- •Functions for Assigning Values to Variables
- •Adding Prompts
- •CHAPTER 2: Storing and Running Programs
- •Creating an AutoLISP Program
- •What you Need
- •Creating an AutoLISP File
- •Loading an AutoLISP file
- •Running a Loaded Program
- •Understanding How a Program Works
- •Using AutoCAD Commands in AutoLISP
- •How to Create a Program
- •Local and Global Variables
- •Automatic Loading of Programs
- •Managing Large Acad.lsp files
- •Using AutoLISP in a Menu
- •Using Script Files
- •CHAPTER 3: Organizing a Program
- •Looking at a Programs Design
- •Outlining Your Programming Project
- •Using Functions
- •Adding a Function
- •Reusing Functions
- •Creating an 3D Box program
- •Creating a 3D Wedge Program
- •Making Your Code More Readable
- •Using Prettyprint
- •Using Comments
- •Using Capitals and Lower Case Letters
- •Dynamic Scoping
- •CHAPTER 4: Interacting with the Drawing Editor
- •A Sample Program Using Getdist
- •How to Get Angle Values
- •Using Getangle and Getorient
- •How to Get Text Input
- •Using Getstring
- •Using Getkword
- •How to Get Numeric Values
- •Using Getreal and Getint
- •How to Control User Input
- •Using Initget
- •Prompting for Dissimilar Variable Types
- •Using Multiple Keywords
- •How to Select Groups of Objects
- •Using Ssget
- •A Sample Program Using Ssget
- •CHAPTER 5: Making Decisions with AutoLISP
- •Making Decisions
- •How to Test for Conditions
- •Using the If function
- •How to Make Several Expressions Act like One
- •How to Test Multiple Conditions
- •Using the Cond function
- •How to Repeat parts of a Program
- •Using the While Function
- •Using the Repeat Function
- •Using Test Expressions
- •CHAPTER 6: Working With Geometry
- •How to find Angles and Distances
- •Understanding the Angle, Distance, and Polar Functions
- •Using Trigonometry to Solve a Problem
- •Gathering Information
- •Finding Points Using Trigonometry
- •Functions Useful in Geometric Transformations
- •Trans
- •Atan
- •Inters
- •CHAPTER 7: Working with Text
- •Working With String Data Types
- •Searching for Strings
- •Converting a Number to a String
- •How to read ASCII text files
- •Using a File Import Program
- •Writing ASCII Files to Disk
- •Using a Text Export Program
- •CHAPTER 8: Interacting with AutoLISP
- •Reading and Writing to the Screen
- •Reading the Cursor Dynamically
- •Writing Text to the Status and Menu Areas
- •Calling Menus from AutoLISP
- •Drawing Temporary Images on the Drawing Area
- •Using Defaults in a Program
- •Adding Default Responses to your Program
- •Dealing with Aborted Functions
- •Using the *error* Function
- •Organizing Code to Reduce Errors
- •Debugging Programs
- •Common Programming Errors
- •Using Variables as Debugging Tools
- •CHAPTER 9: Using Lists to store data
- •Getting Data from a List
- •Using Simple Lists for Data Storage
- •Evaluating Data from an Entire List at Once
- •Using Complex Lists to Store Data
- •Using Lists for Comparisons
- •Locating Elements in a List
- •Searching Through Lists
- •Finding the Properties of AutoCAD Objects
- •Using Selection Sets and Object Names
- •Understanding the structure of Property Lists
- •Changing the properties of AutoCAD objects
- •Getting an Object Name and Coordinate Together
- •CHAPTER 10: Editing AutoCAD objects
- •Editing Multiple objects
- •Improving Processing Speed
- •Using Cmdecho to Speed up Your Program
- •Improving Speed Through Direct Database Access
- •Filtering Objects for Specific Properties
- •Filtering a Selection Set
- •Selecting Objects Based on Properties
- •Accessing AutoCAD's System Tables
- •CHAPTER 11: Accessing Complex Objects
- •Accessing Polyline Vertices
- •Defining a New Polyline
- •Drawing the new Polyline
- •Testing for Polyline Types
- •How Arcs are Described in Polylines
- •Accessing Object Handles and Block Attributes
- •Using Object Handles
- •Using Object Handles
- •Extracting Attribute Data
- •Appendix A: Menu Primer
- •Appendix B: Error Messages
- •Appendix C: Group Codes
The ABC’s of AutoLISP by George Omura
Cond is actually the primary conditional function of AutoLISP. The if function is offered as an alternative to cond since it is similar to conditional functions used in other programming languages. Since the If function syntax is simpler and often more readable, you may want to use if where the special features of cond are not required.
How to Repeat parts of a Program
Another useful aspect to programs such as AutoLISP is their ability to perform repetitive tasks. For example, suppose you want to be able to record a series of keyboard entries as a macro. One way to do this would be to use a series of Getstring functions as in the following:
(Setq str1 (getstring "\nEnter macro: ")) (Setq str2 (getstring "\nEnter macro: ")) (Setq str3 (getstring "\nEnter macro: ")) (Setq str4 (getstring "\nEnter macro: "))
.
Each of the str variables would then be combined to form a variable storing the keystrokes. Unfortunately, this method is inflexible. It requires that the user input a fixed number of entries, no more and no less. Also, this method would use memory storing each keyboard entry as a single variable.
It would be better if you had some facility to continually read keyboard input regardless of how few or how many different keyboard entries are supplied. The While function can be used to repeat a prompt and obtain data from the user until some test condition is met. The program in figure 5.9 is a keyboard macro program that uses the while function.
;Program to create keyboard macros -- Macro.lsp |
|
(defun C:MACRO (/ str1 macro macname) |
|
(setq macro '(command)) |
;start list with command |
(setq macname (getstring "\nEnter name of macro: ")) |
;get name of macro |
(while (/= str1 "/") |
;do while str1 not eq. |
(setq str1 (getstring "\nEnter macro or / to exit: " )) ;get keystrokes |
|
(if (= str1 "/") |
|
(princ "\nEnd of macro ") |
;if / then print message |
(Setq macro (append macro (list str1)) ;else append keystrokes ;end if macro list
;create function
103
Copyright © 2001 George Omura,,World rights reserved
The ABC’s of AutoLISP by George Omura
Using the While Function
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: LT
104
Copyright © 2001 George Omura,,World rights reserved
The ABC’s of AutoLISP by George Omura
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 "/")
If the test results in T, the next line prints the string End of macro.
105
Copyright © 2001 George Omura,,World rights reserved
The ABC’s of AutoLISP by George Omura
(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.
106
Copyright © 2001 George Omura,,World rights reserved
The ABC’s of AutoLISP by George Omura
);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.
107
Copyright © 2001 George Omura,,World rights reserved