2013 - Autolisp - Developers - Guide - LEER IMPORTANTE
2013 - Autolisp - Developers - Guide - LEER IMPORTANTE
January 2012
© 2012 Autodesk, Inc. All Rights Reserved. Except as otherwise permitted by Autodesk, Inc., this publication, or parts thereof, may not
be reproduced in any form, by any method, for any purpose.
Certain materials included in this publication are reprinted with the permission of the copyright holder.
Trademarks
The following are registered trademarks or trademarks of Autodesk, Inc., and/or its subsidiaries and/or affiliates in the USA and other countries:
123D, 3ds Max, Algor, Alias, Alias (swirl design/logo), AliasStudio, ATC, AUGI, AutoCAD, AutoCAD Learning Assistance, AutoCAD LT, AutoCAD
Simulator, AutoCAD SQL Extension, AutoCAD SQL Interface, Autodesk, Autodesk Homestyler, Autodesk Intent, Autodesk Inventor, Autodesk
MapGuide, Autodesk Streamline, AutoLISP, AutoSketch, AutoSnap, AutoTrack, Backburner, Backdraft, Beast, Beast (design/logo) Built with
ObjectARX (design/logo), Burn, Buzzsaw, CAiCE, CFdesign, Civil 3D, Cleaner, Cleaner Central, ClearScale, Colour Warper, Combustion,
Communication Specification, Constructware, Content Explorer, Creative Bridge, Dancing Baby (image), DesignCenter, Design Doctor, Designer's
Toolkit, DesignKids, DesignProf, DesignServer, DesignStudio, Design Web Format, Discreet, DWF, DWG, DWG (design/logo), DWG Extreme,
DWG TrueConvert, DWG TrueView, DWFX, DXF, Ecotect, Evolver, Exposure, Extending the Design Team, Face Robot, FBX, Fempro, Fire, Flame,
Flare, Flint, FMDesktop, Freewheel, GDX Driver, Green Building Studio, Heads-up Design, Heidi, Homestyler, HumanIK, IDEA Server, i-drop,
Illuminate Labs AB (design/logo), ImageModeler, iMOUT, Incinerator, Inferno, Instructables, Instructables (stylized robot design/logo),Inventor,
Inventor LT, Kynapse, Kynogon, LandXplorer, LiquidLight, LiquidLight (design/logo), Lustre, MatchMover, Maya, Mechanical Desktop, Moldflow,
Moldflow Plastics Advisers, Moldflow Plastics Insight, Moldflow Plastics Xpert, Moondust, MotionBuilder, Movimento, MPA, MPA (design/logo),
MPI, MPI (design/logo), MPX, MPX (design/logo), Mudbox, Multi-Master Editing, Navisworks, ObjectARX, ObjectDBX, Opticore, Pipeplus, Pixlr,
Pixlr-o-matic, PolarSnap, PortfolioWall, Powered with Autodesk Technology, Productstream, ProMaterials, RasterDWG, RealDWG, Real-time
Roto, Recognize, Render Queue, Retimer, Reveal, Revit, RiverCAD, Robot, Scaleform, Scaleform GFx, Showcase, Show Me, ShowMotion,
SketchBook, Smoke, Softimage, Softimage|XSI (design/logo), Sparks, SteeringWheels, Stitcher, Stone, StormNET, Tinkerbox, ToolClip, Topobase,
Toxik, TrustedDWG, U-Vis, ViewCube, Visual, Visual LISP, Voice Reality, Volo, Vtour, WaterNetworks, Wire, Wiretap, WiretapCentral, XSI.
All other brand names, product names or trademarks belong to their respective holders.
Disclaimer
THIS PUBLICATION AND THE INFORMATION CONTAINED HEREIN IS MADE AVAILABLE BY AUTODESK, INC. "AS IS." AUTODESK, INC. DISCLAIMS
ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR
FITNESS FOR A PARTICULAR PURPOSE REGARDING THESE MATERIALS.
Contents
Chapter 1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
AutoLISP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
About Related AutoLISP Documents . . . . . . . . . . . . . . . . . 2
iii
Nil Variables . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Predefined Variables . . . . . . . . . . . . . . . . . . . . . . 13
Number Handling . . . . . . . . . . . . . . . . . . . . . . . . . . 14
String Handling . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Basic Output Functions . . . . . . . . . . . . . . . . . . . . . . . 16
Displaying Messages . . . . . . . . . . . . . . . . . . . . . 17
Control Characters in Strings . . . . . . . . . . . . . . . . . 18
Wild-Card Matching . . . . . . . . . . . . . . . . . . . . . 20
Equality and Conditional . . . . . . . . . . . . . . . . . . . . . . 21
List Handling . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
Point Lists . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
Dotted Pairs . . . . . . . . . . . . . . . . . . . . . . . . . . 26
Symbol and Function Handling . . . . . . . . . . . . . . . . . . 28
Using defun to Define a Function . . . . . . . . . . . . . . 28
C:XXX Functions . . . . . . . . . . . . . . . . . . . . . . . 30
Local Variables in Functions . . . . . . . . . . . . . . . . . 34
Functions with Arguments . . . . . . . . . . . . . . . . . . 36
Error Handling in AutoLISP . . . . . . . . . . . . . . . . . . . . . 38
Using the *error* Function . . . . . . . . . . . . . . . . . . 39
Catching Errors and Continuing Program Execution . . . . 41
Using AutoLISP to Communicate with AutoCAD . . . . . . . . . . . . 42
Accessing Commands and Services . . . . . . . . . . . . . . . . . 42
Command Submission . . . . . . . . . . . . . . . . . . . . 43
System and Environment Variables . . . . . . . . . . . . . . 47
Configuration Control . . . . . . . . . . . . . . . . . . . . 47
Display Control . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
Control of Graphics and Text Windows . . . . . . . . . . . 48
Control of Low-Level Graphics . . . . . . . . . . . . . . . . 48
Getting User Input . . . . . . . . . . . . . . . . . . . . . . . . . 49
The getxxx Functions . . . . . . . . . . . . . . . . . . . . . 49
Control of User-Input Function Conditions . . . . . . . . . 52
Geometric Utilities . . . . . . . . . . . . . . . . . . . . . . . . . 55
Object Snap . . . . . . . . . . . . . . . . . . . . . . . . . . 56
Text Extents . . . . . . . . . . . . . . . . . . . . . . . . . . 56
Conversions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
String Conversions . . . . . . . . . . . . . . . . . . . . . . 61
Angular Conversion . . . . . . . . . . . . . . . . . . . . . . 64
ASCII Code Conversion . . . . . . . . . . . . . . . . . . . . 65
Unit Conversion . . . . . . . . . . . . . . . . . . . . . . . 67
Coordinate System Transformations . . . . . . . . . . . . . 70
File Handling . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
File Search . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
Device Access and Control . . . . . . . . . . . . . . . . . . . . . 74
Accessing User Input . . . . . . . . . . . . . . . . . . . . . 74
Using AutoLISP to Manipulate AutoCAD Objects . . . . . . . . . . . . 74
Selection Set Handling . . . . . . . . . . . . . . . . . . . . . . . 75
iv | Contents
Selection Set Filter Lists . . . . . . . . . . . . . . . . . . . . 77
Passing Selection Sets between AutoLISP and ObjectARX
Applications . . . . . . . . . . . . . . . . . . . . . . . . . 85
Object Handling . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
Entity Name Functions . . . . . . . . . . . . . . . . . . . . 86
Entity Data Functions . . . . . . . . . . . . . . . . . . . . . 92
Entity Data Functions and the Graphics Screen . . . . . . . 102
Old-Style Polylines and Lightweight Polylines . . . . . . . 103
Non-Graphic Object Handling . . . . . . . . . . . . . . . 104
Extended Data - xdata . . . . . . . . . . . . . . . . . . . . . . . 106
Organization of Extended Data . . . . . . . . . . . . . . . 107
Registration of an Application . . . . . . . . . . . . . . . . 109
Retrieval of Extended Data . . . . . . . . . . . . . . . . . 110
Attachment of Extended Data to an Entity . . . . . . . . . 111
Management of Extended Data Memory Use . . . . . . . . 112
Handles in Extended Data . . . . . . . . . . . . . . . . . . 112
Xrecord Objects . . . . . . . . . . . . . . . . . . . . . . . . . . 113
Symbol Table and Dictionary Access . . . . . . . . . . . . . . . 114
Symbol Tables . . . . . . . . . . . . . . . . . . . . . . . . 114
Dictionary Entries . . . . . . . . . . . . . . . . . . . . . . 116
Contents | v
Memory Management Functions . . . . . . . . . . . . . . . . . 147
VLX Namespace Functions . . . . . . . . . . . . . . . . . . . . 147
Namespace Communication Functions . . . . . . . . . . . . . . 148
Property List (Plist) Functions . . . . . . . . . . . . . . . . . . . 149
AutoLISP Error Codes . . . . . . . . . . . . . . . . . . . . . . . . . . 149
Error Codes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
vi | Contents
Introduction
1
Introduction
®
For years, AutoLISP has set the standard for customizing AutoCAD® on
Windows®. AutoCAD also supports AutoLISP, but does not support many of
®
the Visual LISP functions or the Microsoft ActiveX Automation interface.
AutoCAD does not have an integrated development environment like AutoCAD
on Windows does, so the creation and editing of LSP files must be done with
text editor such as TextEdit.
AutoLISP
AutoLISP is a programming language designed for extending and customizing
the functionality of AutoCAD. It is based on the LISP programming language,
whose origins date back to the late 1950s. LISP was originally designed for use
in Artificial Intelligence (AI) applications, and is still the basis for many AI
applications.
AutoLISP was introduced as an application programming interface (API) in
AutoCAD Release 2.1, in the mid-1980s. LISP was chosen as the initial AutoCAD
API because it was uniquely suited for the unstructured design process of
AutoCAD projects, which involved repeatedly trying different solutions to design
problems.
Developing AutoLISP programs for AutoCAD is done by writing code in a text
editor, then loading the code into AutoCAD and running it. Debugging your
program is handled by adding statements to print the contents of variables at
strategic points in your program. You must figure out where in your program
to do this, and what variables you need to look at. If you discover you do not
have enough information to determine the error, you must go back and change
1
the code by adding more debugging points. And finally, when you get the
program to work correctly, you need to either comment out or remove the
debugging code you added.
2 | Chapter 1 Introduction
Using the AutoLISP Lan-
guage
2
AutoLISP Basics
You can use number, string, and list-handling functions to customize AutoCAD.
®
This chapter introduces the basic concepts of the AutoLISP programming
language. It describes the core components and data types used in AutoLISP,
and presents examples of simple number-, string-, output-, and list-handling
functions.
AutoLISP code does not need to be compiled, so you can enter the code at a
Command line and immediately see the results.
AutoLISP Expressions
An AutoLISP program consists of a series of expressions. AutoLISP expressions
have the following form:
(function
arguments
)
Each expression begins with an open (left) parenthesis and consists of a function
name and optional arguments to that function. Each argument can also be an
expression. The expression ends with a right parenthesis. Every expression
returns a value that can be used by a surrounding expression. The value of the
last interpreted expression is returned to the calling expression.
For example, the following code example involves three functions:
3
(fun1 (fun2
arguments)(fun3
arguments)
)
If you enter this code at the AutoCAD Command prompt, the AutoCAD
AutoLISP interpreter processes the code. The first function, fun1, has two
arguments, and the other functions, fun2 and fun3, each have one argument.
The functions fun2 and fun3 are surrounded by function fun1, so their return
values are passed to fun1 as arguments. Function fun1 evaluates the two
arguments and returns the value to the window from which you entered the
code.
The following example shows the use of the * (multiplication) function, which
accepts one or more numbers as arguments:
(* 2 27)
54
Because this code example has no surrounding expression, AutoLISP returns
the result to the window from which you entered the code.
Expressions nested within other expressions return their result to the
surrounding expression. The following example uses the result from the +
(addition) function as one of the arguments for the * (multiplication) function.
(* 2 (+ 5 10))
30
If you enter the incorrect number of close (right) parentheses, AutoLISP displays
the following prompt:
(_>
The number of open parentheses in this prompt indicates how many levels
of open parentheses remain unclosed. If this prompt appears, you must enter
the required number of close parentheses for the expression to be evaluated.
(* 2 (+ 5 10
((_>
))
30
In this example, the foo function has one required argument, string, and one
optional argument, number. Additional number arguments can be provided.
Frequently, the name of the argument indicates the expected data type. The
examples in the following table show both valid and invalid calls to the foo
function.
AutoLISP Basics | 5
AutoLISP Data Types
AutoLISP expressions are processed according to the order and data type of
the code within the parentheses. Before you can fully utilize AutoLISP, you
must understand the differences among the data types and how to use them.
Integers
Integers are whole numbers that do not contain a decimal point. AutoLISP
integers are 32-bit signed numbers with values ranging from +2,147,483,647
to -2,147,483,648. (Note, however, that the getint function only accepts 16-bit
numbers ranging from +32767 to -32678.) When you explicitly use an integer
in an AutoLISP expression, that value is known as a constant. Numbers such
as 2, -56, and 1,200,196 are valid AutoLISP integers.
If you enter a number that is greater than the maximum integer allowed
(resulting in integer overflow), AutoLISP converts the integer to a real number.
However, if you perform an arithmetic operation on two valid integers, and
the result is greater than the maximum allowable integer, the resulting number
will be invalid. The following examples illustrate how AutoLISP handles integer
overflow.
The largest positive integer value retains its specified value:
2147483647
2147483647
If you enter an integer that is greater than the largest allowable value, AutoLISP
returns the value as a real:
2147483648
2.14748e+009
An arithmetic operation involving two valid integers, but resulting in integer
overflow, produces an invalid result:
(+ 2147483646 3)
-2147483647
(+ 2147483648 2)
2.14748e+009
In this instance, AutoLISP converts 2147483648 to a valid real before adding
2 to the number. The result is a valid real.
The largest negative integer value retains its specified value:
-2147483647
-2147483647
If you enter a negative integer larger than the greatest allowable negative
value, AutoLISP returns the value as a real:
-2147483648
-2.14748e+009
The following operation concludes successfully, because AutoLISP first converts
the overflow negative integer to a valid real:
(- -2147483648 1)
-2.14748e+009
Reals
A real is a number containing a decimal point. Numbers between -1 and 1
must contain a leading zero. Real numbers are stored in double-precision
floating-point format, providing at least 14 significant digits of precision.
Reals can be expressed in scientific notation, which has an optional e or E
followed by the exponent of the number (for example, 0.0000041 is the same
as 4.1e-6). Numbers such as 3.1, 0.23, -56.123, and 21,000,000.0 are valid
AutoLISP reals.
AutoLISP Basics | 7
Strings
A string is a group of characters surrounded by quotation marks. Within quoted
strings the backslash (\) character allows control characters (or escape codes)
to be included. When you explicitly use a quoted string in an AutoLISP
expression, that value is known as a literal string or a string constant.
Examples of valid strings are “string 1” and “\nEnter first point:”.
Lists
An AutoLISP list is a group of related values separated by spaces and enclosed
in parentheses. Lists provide an efficient method of storing numerous related
values. AutoCAD expresses 3D points as a list of three real numbers.
Examples of lists are (1.0 1.0 0.0), (“this” “that” “the other”), and (1 “ONE”).
Selection Sets
Selection sets are groups of one or more objects (entities). You can interactively
add objects to, or remove objects from, selection sets with AutoLISP routines.
The following example uses the ssget function to return a selection set
containing all the objects in a drawing.
(ssget "X")
Entity Names
An entity name is a numeric label assigned to objects in a drawing. It is actually
a pointer into a file maintained by AutoCAD, and can be used to find the
object's database record and its vectors (if they are displayed). This label can
be referenced by AutoLISP functions to allow selection of objects for processing
in various ways. Internally, AutoCAD refers to objects as entities.
The following example uses the entlast function to get the name of the last
object entered into the drawing.
File Descriptors
A file descriptor is a pointer to a file opened by the AutoLISP open function.
The open function returns this pointer as an alphanumeric label. You supply
the file descriptor as an argument to other AutoLISP functions that read or
write to the file.
The following example opens the myinfo.dat file for reading. The open function
returns the file descriptor:
#<file "/myinfo.dat">
In this example, the file descriptor is stored in the file1variable.
Files remain open until you explicitly close them in your AutoLISP program.
The close function closes a file. The following code closes the file whose file
descriptor is stored in the file1 variable:
(close file1)
nil
AutoLISP Basics | 9
Symbols and Variables
AutoLISP uses symbols to refer to data. Symbol names are not case sensitive
and may consist of any sequence of alphanumeric and notation characters,
except the following:
( (Open Parenthesis)
) (Close Parenthesis)
. (Period)
' (Apostrophe)
; (Semicolon)
"this is a string"
Help yourself and others who need to read your code. Choose meaningful
names for your program symbols and variables.
AutoLISP Basics | 11
■ Make notes to yourself during debugging
Comments begin with one or more semicolons (;) and continue through the
end of the line.
; This entire line is a comment
(setq area (* pi r r)) ; Compute area of circle
Any text within ;| ... |; is ignored. Therefore, comments can be included
within a line of code or extend for multiple lines. This type of comment is
known as an in-line comment.
(setq tmode ;|some note here|; (getvar "tilemode"))
The following example shows a comment that continues for multiple lines:
(setvar "orthomode" 1) ;|comment starts here
and continues to this line,
but ends way down here|; (princ "\nORTHOMODE set On.")
It is recommended that you use comments liberally when writing AutoLISP
programs.
AutoLISP Variables
An AutoLISP variable assumes the data type of the value assigned to it. Until
they are assigned new values, variables retain their original values. You use
the AutoLISP setq function to assign values to variables.
(setq
variable_name1 value1 [variable_name2 value2 ...]
)
The setq function assigns the specified value to the variable name given. It
returns the value as its function result.
3.875
"EXTERIOR-WALLS"
!abc
3.875
Nil Variables
An AutoLISP variable that has not been assigned a value is said to be nil. This
is different from blank, which is considered a character string, and different
from 0, which is a number. So, in addition to checking a variable for its current
value, you can test to determine if the variable has been assigned a value.
Each variable consumes a small amount of memory, so it is good programming
practice to reuse variable names or set variables to nil when their values are
no longer needed. Setting a variable to nil releases the memory used to store
that variable's value. If you no longer need the val variable, you can release
its value from memory with the following expression:
nil
Another efficient programming practice is to use local variables whenever
possible. See Local Variables in Functions (page 34) on this topic.
Predefined Variables
The following predefined variables are commonly used in AutoLISP
applications:
PAUSE Defined as a string consisting of a double backslash (\\) character. This
variable is used with the command function to pause for user input.
AutoLISP Basics | 13
NOTE You can change the value of these variables with the setq function. However,
other applications might rely on their values being consistent; therefore, it is
recommended that you do not modify these variables.
Number Handling
AutoLISP provides functions for working with integers and real numbers. In
addition to performing complex mathematical computations in applications,
you can use the number-handling functions to help you in your daily use of
AutoCAD. If you are drawing a steel connection detail that uses a 2.5" bolt
that is 0.5" in diameter, how many threads are there if the bolt has 13 threads
per inch?
(* 2.5 13)
32.5
The arithmetic functions that have a number argument (as opposed to num or
angle, for example) return different values if you provide integers or reals as
arguments. If all arguments are integers, the value returned is an integer.
However, if one or all the arguments are reals, the value returned is a real. To
ensure your application passes real values, be certain at least one argument is
a real.
(/ 12 5)
(/ 12.0 5)
2.4
A complete list of number-handling functions is in AutoLISP Function Synopsis,
(page 119) under the heading Arithmetic Functions. (page 122) These functions
are described in the AutoLISP Reference.
String Handling
AutoLISP provides functions for working with string values. For example, the
strcase function returns the conversion of all alphabetic characters in a string
to uppercase or lowercase. It accepts two arguments: a string and an optional
"THIS IS A TEST."
If you provide a second argument of T, the characters are returned as lowercase.
AutoLISP provides the predefined variable T to use in similar situations where
a non-nil value is used as a type of true/false toggle.
"this is a test."
The strcat function combines multiple strings into a single string value. This
is useful for placing a variable string within a constant string. The following
code sets a variable to a string value and then uses strcat to insert that string
into the middle of another string.
(setq str "BIG") (setq bigstr (strcat "This is a " str " test."))
(strlen bigstr)
19
AutoLISP Basics | 15
(setq filnam "bigfile.txt")
"bigfile.txt"
You need to get a string that contains all characters except the last four (the
period and the three-letter extension). Use strlen to get the length of the string
and subtract 4 from that value. Then use substr to specify the first character
of the substring and its length.
"bigfile"
If your application has no need for the value of newlen, you can combine
these two lines of code into one.
"bigfile"
Additional string-handling functions are listed in AutoLISP Function Synopsis,
(page 119) under the heading String-Handling Functions. (page 131) These
functions are described in the AutoLISP Reference.
AutoLISP also provides a number of functions that convert string values into
numeric values and numeric values into string values. These functions are
discussed in Conversions (page 61).
■ princ
■ prompt
Displaying Messages
The princ, prin1, and print functions all display an expression (not necessarily
a string) in the AutoCAD Command window. Optionally, these functions can
send output to a file. The differences are as follows:
■ princ displays strings without the enclosing quotation marks.
■ print displays strings enclosed in quotation marks but places a blank line
before the expression and a space afterward.
The following examples demonstrate the differences between the four basic
output functions and how they handle the same string of text. See Control
Characters in Strings (page 18) for an explanation of the control characters
used in the example.
(princ str)
printsThe "allowable" tolerance is 1/4"and returns "The
\"allowable\" tolerance is 1/4\""
(prin1 str)
prints"The \"allowable\" tolerance is 1/4""and returns "The
\"allowable\" tolerance is 1/4\""
(print str)
prints<blank line>"The \"allowable\" tolerance is
1/4""<space>and returns "The \"allowable\" tolerance is
1/4\""
Note that the write-char and write-line functions can also display output to
a Command window. Refer to the AutoLISP Reference for information on these
functions.
AutoLISP Basics | 17
Exiting Quietly
If you invoke the princ function without passing an expression to it, it displays
nothing and has no value to return. So if you write an AutoLISP expression
that ends with a call to princ without any arguments, the ending nil is
suppressed (because it has nothing to return). This practice is called exiting
quietly.
Code Description
\\ \ character
\e Escape character
\n Newline character
\r Return character
\t Tab character
The prompt and princ functions expand the control characters in a string
and display the expanded string in the AutoCAD Command window.
If you need to use the backslash character (\) or quotation mark (") within a
quoted string, it must be preceded by the backslash character (\). For example,
if you enter
An example of the
newline character.
You can also use the terpri function to cause a line break.
The return character (\r) returns to the beginning of the current line. This is
useful for displaying incremental information (for example, a counter showing
the number of objects processed during a loop).
The Tab character (\t) can be used in strings to indent or to provide alignment
with other tabbed text strings. In this example, note the use of the princ
function to suppress the ending nil.
Name Office
----- -----
Sue 101
Joe 102
Sam 103
AutoLISP Basics | 19
Wild-Card Matching
The wcmatch function enables applications to compare a string to a wild-card
pattern. You can use this facility when you build a selection set (in conjunction
with ssget) and when you retrieve extended entity data by application name
(in conjunction with entget).
T
The following code illustrates the use of brackets in the pattern. In this case,
wcmatch returns T if matchme contains "test4", "test5", "test6" (4-6), or
"test9" (note the use of the * character):
nil
In this case, wcmatch returns nil because matchme does not contain any of
the strings indicated by the pattern.
However,
T
returns true because the string contains "test1".
The pattern string can specify multiple patterns, separated by commas. The
following code returns T if matchme equals "ABC", or if it begins with "XYZ",
or if it ends with "end".
List Handling
AutoLISP provides functions for working with lists. This section provides
examples of the append, assoc, car, cons, list, nth, and subst functions. A
summary of all list-handling functions is in AutoLISP Function Synopsis, (page
119) under the heading List Manipulation Functions. (page 128) Each
list-handling function is described in the AutoLISP Reference.
Lists provide an efficient and powerful method of storing numerous related
values. After all, LISP is so-named because it is the LISt Processing language.
Once you understand the power of lists, you'll find that you can create more
powerful and flexible applications.
AutoLISP Basics | 21
Several AutoLISP functions provide a basis for programming two-dimensional
and three-dimensional graphics applications. These functions return point
values in the form of a list.
The list function provides a simple method of grouping related items. These
items do not need to be of similar data types. The following code groups three
related items as a list:
(1.0 "One" 1)
You can retrieve a specific item from the list in the lst1 variable with the nth
function. This function accepts two arguments. The first argument is an integer
that specifies which item to return. A 0 specifies the first item in a list, 1
specifies the second item, and so on. The second argument is the list itself.
The following code returns the second item in lst1.
(nth 1 lst1)
"One"
The cdr function returns all elements, except the first, from a list. For example:
(cdr lst1)
("One" 1)
The car function provides another way to extract items from a list. For more
examples using car and cdr, and combinations of the two, see Point Lists
(page 23).
Three functions let you modify an existing list. The append function returns
a list with new items added to the end of it, and the cons function returns a
list with new items added to the beginning of the list. The subst function
returns a list with a new item substituted for every occurrence of an old item.
These functions do not modify the original list; they return a modified list.
To modify the original list, you must explicitly replace the old list with the
new list.
The append function takes any number of lists and runs them together as one
list. Therefore, all arguments to this function must be lists. The following code
adds another "One" to the list lst1. Note the use of the quote (or ') function
as an easy way to make the string "One" into a list.
The cons function combines a single element with a list. You can add another
string "One" to the beginning of this new list, lst2, with the cons function.
Point Lists
AutoLISP observes the following conventions for handling graphics
coordinates. Points are expressed as lists of two or three numbers surrounded
by parentheses.
2D points Expressed as lists of two real numbers (X and Y, respectively), as
in
(3.4 7.52)
You can use the list function to form point lists, as shown in the following
examples:
(3.875 1.23)
AutoLISP Basics | 23
To assign particular coordinates to a point variable, you can use one of the
following expressions:
(3.875 1.23)
3.45
(3.45 1.23)
The latter uses the value of variable abc as the X component of the point.
If all members of a list are constant values, you can use the quote function to
explicitly define the list, rather than the list function. The quote function
returns an expression without evaluation, as follows:
(4.5 7.5)
The single quotation mark (') can be used as shorthand for the quote function.
The following code produces the same result as the preceding code.
(4.5 7.5)
You can refer to X, Y, and Z components of a point individually, using three
additional built-in functions called car, cadr, and caddr. The following
examples show how to extract the X, Y, and Z coordinates from a 3D point
list. The pt variable is set to the point (1.5 3.2 2.0):
1.5
The cadr function returns the second member of a list. In this example it
returns the Y value of the pt point to the y_val variable.
3.2
The caddr function returns the third member of a list. In this example it
returns the Z value of point pt to the variable z_val.
2.0
You can use the following code to define the lower-left and upper-right (pt1
and pt2) corners of a rectangle, as follows:
(3.0 4.0)
You can use the car and cadr functions to set the pt3 variable to the upper-left
corner of the rectangle, by extracting the X component of pt1 and the Y
component of pt2, as follows:
(1.0 4.0)
The preceding expression sets pt3 equal to point (1.0,4.0).
AutoLISP supports concatenations of car and cdr up to four levels deep. The
following are valid functions:
AutoLISP Basics | 25
caaar cadar cdaar cddar
These concatenations are the equivalent of nested calls to car and cdr. Each
a represents a call to car, and each d represents a call to cdr. For example:
(caar x)
is equivalent to (car (car x))
(cdar x)
is equivalent to (cdr (car x))
(cadar x)
is equivalent to (car (cdr (car x)))
(cadr x)
is equivalent to (car (cdr x))
(cddr x)
is equivalent to (cdr (cdr x))
(caddr x)
is equivalent to (car (cdr (cdr x)))
Dotted Pairs
Another way AutoLISP uses lists to organize data is with a special type of list
called a dotted pair. This list must always contain two members. When
representing a dotted pair, AutoLISP separates the members of the list with a
period (.). Most list-handling functions will not accept a dotted pair as an
argument, so you should be sure you are passing the right kind of list to a
function.
(LYR . "WALLS")
The car, cdr, and assoc functions are useful for handling dotted pairs. The
following code creates an association list, which is a list of lists, and is the
method AutoLISP uses to maintain entity definition data. (Entity definition
data is discussed in Using AutoLISP to Manipulate AutoCAD Objects. (page
74)) The following code creates an association list of dotted pairs:
The assoc function returns a specified list from within an association list
regardless of the specified list's location within the association list. The assoc
function searches for a specified key element in the lists, as follows:
(LEN . 240.0)
"WALLS"
(nth 1 wallinfo)
(LEN . 240.0)
LEN
AutoLISP Basics | 27
Symbol and Function Handling
AutoLISP provides a number of functions for handling symbols and variables.
The symbol-handling functions are listed in AutoLISP Function Synopsis,
(page 119) under the heading Symbol-Handling Functions (page 133) Each
symbol-handling function is described in the AutoLISP Reference.
AutoLISP provides functions for handling one or more groups of functions.
This section provides examples of the defun function. The remaining
function-handling functions are listed in AutoLISP Function Synopsis, (page
119) under the heading Symbol-Handling Functions (page 133) The functions
are described in the AutoLISP Reference.
DONE
Note how the previous example invokes the princ function without any
arguments. This suppresses an ending nil and achieves a quiet exit.
Functions that accept no arguments may seem useless. However, you might
use this type of function to query the state of certain system variables or
conditions and to return a value that indicates those values.
AutoCAD can automatically load your functions each time you start a new
AutoCAD session or open a new AutoCAD drawing file.
Any code in an AutoLISP program file that is not part of a defun statement is
executed when that file is loaded. You can use this to set up certain parameters
or to perform any other initialization procedures in addition to displaying
textual information, such as how to invoke the loaded function.
For situations like this, you can use defun-q to define your functions. An
attempt to use a defun function as a list results in an error. The following
example illustrates the error:
foo
AutoLISP Basics | 29
; error: Invalid attempt to access a compiled function
definition.
You may want to define it using defun-q: #<SUBR @024bda3c
FOO>
The error message alerts you to the possibility of using defun-q instead of
defun.
C:XXX Functions
If an AutoLISP function is defined with a name of the form C:xxx, it can be
issued at the AutoCAD Command prompt in the same manner as a built-in
AutoCAD command. You can use this feature to add new commands to
AutoCAD or to redefine existing commands.
To use functions as AutoCAD commands, be sure they adhere to the following
rules:
■ The function name must use the form C:XXX (upper- or lowercase
characters). The C: portion of the name must always be present; the XXX
portion is a command name of your choice. C:XXX functions can be used
to override built-in AutoCAD commands. (See Redefining AutoCAD
Commands (page 32).)
■ The function must be defined with no arguments. However, local variables
are permitted and it is a good programming practice to use them.
NOTE When calling a function defined as a command from the code of another
AutoLISP function, you must use the whole name, including the parentheses; for
example, (C:HELLO). You also must use the whole name and the parentheses
when you invoke the function from the VLISP Console prompt.
Adding Commands
Using the C:XXX feature, you can define a command that displays a simple
message.
C:HELLO
HELLO is now defined as a command, in addition to being an AutoLISP function.
This means you can issue the command from the AutoCAD Command prompt.
Command: hello
Hello world.
This new command can be issued transparently because it does not call the
command function itself. At the AutoCAD Command prompt, you could do
the following:
Command: line
From point: 'hello
Hello world.
From point:
If you follow your function definition with a call to the setfunhelp function,
you can associate a Help file and topic with a user-defined command. When
help is requested during execution of the user-defined command, the topic
specified by setfunhelp displays. See the AutoLISP Reference for more
information on using setfunhelp.
AutoLISP Basics | 31
these values to AutoLISP. See Keyword Options (page 53) for more information
on using initget, and refer to the AutoCADCustomization Guide for information
on the DIESEL string expression language.
Consider the following example. Whenever you use the LINE command, you
want AutoCAD to remind you about using the PLINE command. You can
define the AutoLISP function C:LINE to substitute for the normalLINEcommand
as follows:
(defun C:LINE ( )
(_>
In this example, the function C:LINE is designed to issue its message and then
to execute the normal LINE command (using its true name, .LINE). Before
AutoCAD will use your new definition for the LINE command, you must
undefine the built-in LINE command. Enter the following to undefine the
built-in LINE command:
Now, if you enter line at the AutoCAD Command prompt, AutoCAD uses
the C:LINE AutoLISP function:
(setvar "cmdecho" 0)
(_>
(command ".LINE")
(_>
(princ))
C:LINE
Now if you enter line at the AutoCAD Command prompt, the following text
is displayed:
Shouldn't you be using PLINE?
Specify first point:
You can use this feature in a drawing management system, for example. You
can redefine the NEW, OPEN, and QUIT commands to write billing information
to a log file before you terminate the editing session.
It is recommended that you protect your menus, scripts, and AutoLISP
programs by using the period-prefixed forms of all commands. This ensures
that your applications use the built-in command definitions rather than a
redefined command.
AutoLISP Basics | 33
See the Overview of File Organization topic in the AutoCADCustomization
Guide for a description of the steps AutoCAD takes to evaluate command
names.
(princ))
LOCAL
Before you test the new function, assign variables aaa and bbb to values other
than those used in the LOCAL function.
2
You can verify that the variables aaa and bbb are actually set to those values.
aaa
bbb
(local)
aaa
AutoLISP Basics | 35
bbb
2
In addition to ensuring that variables are local to a particular function, this
technique also ensures the memory used for those variables is available for
other functions.
ARGTEST
The ARGTEST function returns the desired value because AutoLISP always
returns the results of the last expression it evaluates. The last line in ARGTEST
uses strcat to concatenate the strings, and the resulting value is returned. This
is one example where you should not use the princ function to suppress the
return value from your program.
This type of function can be used a number of times within an application to
combine two variable strings with one constant string in a specific order.
Because it returns a value, you can save the value to a variable for use later in
the application.
Note that the ccc variable was defined locally within the ARGTEST function.
Once the function runs to completion, AutoLISP recycles the variable,
recapturing the memory allocated to it. To prove this, check from the VLISP
Console window to see if there is still a value assigned to ccc.
ccc
nil
Special Forms
Certain AutoLISP functions are considered special forms because they evaluate
arguments in a different manner than most AutoLISP function calls. A typical
function evaluates all arguments passed to it before acting on those arguments.
Special forms either do not evaluate all their arguments, or only evaluate some
arguments under certain conditions.
The following AutoLISP functions are considered special forms:
■ AND
■ COMMAND
■ COND
■ DEFUN
■ DEFUN-Q
■ FOREACH
■ FUNCTION
■ IF
■ LAMBDA
■ OR
■ PROGN
■ QUOTE
■ REPEAT
AutoLISP Basics | 37
■ SETQ
■ TRACE
■ UNTRACE
■ VLAX-FOR
■ WHILE
You can read about each of these functions in the AutoLISP Reference.
(inters 'a)
is an error on two counts: too few arguments and invalid argument type. You
will receive either of the following error messages:
; *** ERROR: too few arguments
; *** ERROR: bad argument type: 2D/3D point
Your program should be designed to handle either error.
Note also that in AutoCAD, AutoLISP evaluates all arguments before checking
the argument types. In previous releases of AutoCAD, AutoLISP evaluated and
checked the type of each argument sequentially. To see the difference, look
at the following code examples:
(defun bar ()
(print "Evaluating bar")
'b)
(defun baz ()
(print "Evaluating baz")
'c)
AutoLISP evaluated (foo), then passed the result to inters. Since the result was
a valid 2D point list, AutoLISP proceeds to evaluate (bar), where it determines
that the evaluated result is a string, an invalid argument type for inters.
In this message, text describes the error. However, if the *error* function is
defined (that is, if it is not nil), AutoLISP executes *error* instead of printing
the message. The *error* function receives text as its single argument.
AutoLISP Basics | 39
If *error* is not defined or is nil, AutoLISP evaluation stops and displays a
traceback of the calling function and its callers. It is beneficial to leave this
error handler in effect while you debug your program.
A code for the last error is saved in the AutoCAD system variable ERRNO,
where you can retrieve it by using the getvar function. See Error Handling in
AutoLISP (page 38) for a list of error codes and their meaning.
Before defining your own *error* function, save the current contents of *error*
so that the previous error handler can be restored upon exit. When an error
condition exists, AutoCAD calls the currently defined *error* function and
passes it one argument, which is a text string describing the nature of the
error. Your *error* function should be designed to exit quietly after an ESC
(cancel) or an exit function call. The standard way to accomplish this is to
include the following statements in your error-handling routine.
(if
(or
(= msg "Function cancelled")
(= msg "quit / exit abort")
)
(princ)
(princ (strcat "\nError: " msg))
)
This code examines the error message passed to it and ensures that the user
is informed of the nature of the error. If the user cancels the routine while it
is running, nothing is returned from this code. Likewise, if an error condition
is programmed into your code and the exit function is called, nothing is
returned. It is presumed you have already explained the nature of the error
by using print statements. Remember to include a terminating call to princ
if you don't want a return value printed at the end of an error routine.
The main caveat about error-handling routines is they are normal AutoLISP
functions that can be canceled by the user. Keep them as short and as fast as
possible. This will increase the likelihood that an entire routine will execute
if called.
You can also warn the user about error conditions by displaying an alert box,
which is a small dialog box containing a message supplied by your program.
To display an alert box, call the alert function.
10
The result from this example is the same as if you had used apply to perform
the division.
The value of vl-catch-all-apply is in catching errors and allowing your program
to continue execution.
AutoLISP Basics | 41
This function accepts two number arguments and uses vl-catch-all-apply
to divide the first number by the second number. The vl-catch-all-error-p
function determines whether the return value from vl-catch-all-apply
is an error object. If the return value is an error object,
catch-me-if-you-can invokes vl-catch-all-error-message to obtain the
message from the error object.
2 Load the function.
3 Invoke the function with the following command:
(catch-me-if-you-can 50 2)
(catch-me-if-you-can 50 0)
Command Submission
The command function sends an AutoCAD command directly to the AutoCAD
Command prompt. The command function has a variable-length argument
list. These arguments must correspond to the types and values expected by
that command's prompt sequence; these may be strings, real values, integers,
points, entity names, or selection set names. Data such as angles, distances,
and points can be passed either as strings or as the values themselves (as integer
or real values, or as point lists). An empty string ("") is equivalent to pressing
the Spacebar or Enter on the keyboard.
There are some restrictions on the commands that you can use with the
command function. See the AutoLISP Reference definition of this function for
information on these restrictions.
The following code fragment shows representative calls to command.
NOTE You can use a backslash instead of the PAUSE symbol. However, it is
recommended that you always use the PAUSE symbol rather than an explicit
backslash. Also, if the command function is invoked from a menu item, the
backslash suspends the reading of the menu item, which results in partial evaluation
of the AutoLISP expression.
When the command function pauses for user input, the function is considered
active, so the user cannot enter another AutoLISP expression to be evaluated.
The following is an example of using the PAUSE symbol (the layer NEW_LAY
and the block MY_BLOCK must exist in the drawing prior to testing this code):
(setq blk "MY_BLOCK")
(setq old_lay (getvar "clayer"))
(command "layer" "set" "NEW_LAY" "")
(command "insert" blk pause "" "" pause)
(command "layer" "set" old_lay "")
The preceding code fragment sets the current layer to NEW_LAY, pauses for
user selection of an insertion point for the block MY_BLOCK (which is inserted
with X and Y scale factors of 1), and pauses again for user selection of a rotation
angle. The current layer is then reset to the original layer.
If the command function specifies a PAUSE to the SELECT command and a
PICKFIRST set is active, the SELECT command obtains the PICKFIRST set
without pausing for the user.
WARNING The Radius and Diameter subcommands of the Dim prompt issue
additional prompts in some situations. This can cause a failure of AutoLISP programs
written prior to Release 11 that use these commands.
(setq el (entlast))
Gets last entity name
Configuration Control
AutoCAD uses the acadxx.cfg file to store configuration information (the xx
in the file name refers to the AutoCAD release number). The AppData section
of this file is provided for users and developers to store configuration
information pertaining to their applications. The getcfg and setcfg functions
allow AutoLISP applications to inspect and change the value of parameters in
the AppData section.
Display Control
AutoLISP includes functions for controlling the AutoCAD display in both text
and graphics windows. Some functions prompt for, or depend on, input from
the AutoCAD user.
The prompt, princ, prin1, and print functions are the primary text output
functions. These functions were described in the AutoLISP Basics (page 3)
chapter, under the heading, Basic Output Functions. (page 16)
NOTE Because these functions depend on code in AutoCAD, their operation can
be expected to change from release to release. There is no guarantee that
applications calling these functions will be upward compatible. Also, they depend
on current hardware configurations. In particular, applications that call grtext are
not likely to work the same on all configurations unless the developer is very careful
to use them as described (see the Customization Guide) and to avoid
hardware-specific features. Finally, because they are low-level functions, they do
almost no error reporting and can alter the graphics screen display unexpectedly
(see the following example for a way to fix this).
The following sequence restores the default graphics window display caused
by incorrect calls to grtext, grdraw, or grvecs:
(redraw)
getpoint A point value on the command line or selected from the screen
getcorner A point value (the opposite corner of a box) on the command line or
selected from the screen
getdist A real or integer value (of distance) on the command line or determ-
ined by selecting points on the screen
getangle An angle value (in the current angle format) on the command line or
based on selected points on the screen
getorient An angle value (in the current angle format) on the command line or
based on selected points on the screen
NOTE Although the getvar, getcfg, and getenv functions begin with the letters
g, e, and t, they are not user-input functions. They are discussed in Accessing
Commands and Services (page 42).
The functions getint, getreal, and getstring pause for user input on the
AutoCAD command line. They return a value only of the same type as that
requested.
The getpoint, getcorner, and getdist functions pause for user input on the
command line or from points selected on the graphics screen. The getpoint
and getcorner functions return 3D point values, and getdist returns a real
value.
Both getangle and getorient pause for input of an angle value on the
command line or as defined by points selected on the graphics screen. For the
getorient function, the 0 angle is always to the right: “East” or “3 o'clock.”
For getangle, the 0 angle is the value of ANGBASE, which can be set to any
angle. Both getangle and getorient return an angle value (a real) in radians
measured counterclockwise from a base (0 angle), for getangle equal to
ANGBASE, and for getorient to the right.
0 0.0 1.5708
90 4.71239 0.0
The getangle function honors the settings of ANGDIR and ANGBASE when
accepting input. You can use getangle to obtain a rotation amount for a block
insertion, because input of 0 degrees always returns 0 radians. The getorient
function honors only ANGDIR. You use getorient to obtain angles such as
the baseline angle for a text object. For example, given the preceding settings
of ANGBASE and ANGDIR, for a line of text created at an angle of 0, getorient
returns an angle value of 90.
The user-input functions take advantage of the error-checking capability of
AutoCAD. Trivial errors are trapped by AutoCAD and are not returned by the
user-input function. A prior call to initget provides additional filtering
capabilities, lessening the need for error-checking.
To set more than one condition at a time, add the values together (in any
combination) to create a bits value between 0 and 255. If bits is not included
or is set to 0, none of the control conditions applies to the next user-input
function call. (For a complete listing of initget bit settings, see initget in the
AutoLISP Reference.)
(initget (+ 1 2 4))
(getint "\nHow old are you? ")
This sequence requests the user's age. AutoCAD displays an error message and
repeats the prompt if the user attempts to enter a negative or zero value, or if
the user only presses Enter, or enters a string (the getint function rejects
attempts to enter a value that is not an integer).
Keyword Options
The optional string argument specifies a list of keywords recognized by the
next user-input function call.
The initget function allows keyword abbreviations to be recognized in addition
to the full keywords. The user-input function returns a predefined keyword
if the input from the user matches the spelling of a keyword (not case
sensitive), or if the user enters the abbreviation of a keyword. There are two
methods for abbreviating keywords; both are discussed in the initget topic in
the AutoLISP Reference.
The following user-defined function shows a call to getreal, preceded by a
call to initget, that specifies two keywords. The application checks for these
keywords and sets the input value accordingly.
(defun C:GETNUM (/ num)
(initget 1 "Pi Two-pi")
(setq num (getreal "Pi/Two-pi/<number>: "))
(cond
((eq num "Pi") pi)
This initget call inhibits null input (bits = 1) and establishes a list of two
keywords, "Pi" and "Two-pi". The getreal function is then used to obtain a
real number, issuing the following prompt:
Pi/Two-pi/<number>:
The result is placed in local symbol num. If the user enters a number, that
number is returned by C:GETNUM. However, if the user enters the keyword
Pi (or simply P), getreal returns the keyword Pi. The cond function detects
this and returns the value of p in this case. The Two-pi keyword is handled
similarly.
NOTE You can also use initget to enable entsel, nentsel, and nentselp to accept
keyword input. For more information on these functions, see Object Handling
(page 86) and the entsel, nentsel and nentselp function definitions in the
AutoLISP Reference.
)
)
(defun REF ( )
(setvar "LASTPOINT" (getpoint "\nReference point: "))
(getpoint "\nNext point: " (getvar "LASTPOINT"))
)
If both the C:ARBENTRY and REF functions are loaded into the drawing, the
following command sequence is acceptable.
Command: arbentry
Point: (ref)
Reference point: Select a point
Next point: @1,1,0
Input Validation
You should protect your code from unintentional user errors. The AutoLISP
user input getxxx functions do much of this for you. However, it's dangerous
to forget to check for adherence to other program requirements that the getxxx
functions do not check for. If you neglect to check input validity, the program's
integrity can be seriously affected.
Geometric Utilities
A group of functions allows applications to obtain pure geometric information
and geometric data from the drawing. See Geometric Functions (page 139) in
AutoLISP Function Synopsis, (page 119) for a complete list of geometric utility
functions.
The angle function finds the angle in radians between a line and the X axis
(of the current UCS), distance finds the distance between two points, and
polar finds a point by means of polar coordinates (relative to an initial point).
The inters function finds the intersection of two lines. The osnap and textbox
functions are described separately.
The following code fragment shows calls to the geometric utility functions:
The call to polar sets endpt to a point that is the same distance from (1,7) as
pt1 is from pt2, and at the same angle from the X axis as the angle between
pt1 and pt2.
Object Snap
The osnap function can find a point by using one of the AutoCAD Object
Snap modes. The Snap modes are specified in a string argument.
The following call to osnap looks for the midpoint of an object near pt1:
Text Extents
The textbox function returns the diagonal coordinates of a box that encloses
a text object. It takes an entity definition list of the type returned by entget
(an association list of group codes and values) as its single argument. This list
The actual values returned by textbox will vary depending on the current text
style.
The following example demonstrates one method of providing the textbox
function with an entity definition list.
Command: dtext
Justify/Style/<Start point>: 1,1
Height <1.0000>: Enter
Rotation angle <0>: Enter
Text: test
Text: Enter
Command: (setq e (entget (entlast)))
((-1 . <Entity name: 1ba3568>) (0 . "TEXT") (330 . <Entity
name: 1ba34f8>) (5 .
"2D") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0")
(100 .
"AcDbText") (10 1.0 1.0 0.0) (40 . 1.0) (1 . "test") (50 .
0.0) (41 . 1.0) (51
. 0.0) (7 . "Standard") (71 . 0) (72 . 0) (11 0.0 0.0 0.0)
(210 0.0 0.0 1.0)
(100 . "AcDbText") (73 . 0))
Command: (textbox e)
((0.0 0.0 0.0) (0.8 0.2 0.0))
If the text is vertical or rotated, pt1 is still the bottom-left corner and pt2 is
the upper-right corner; the bottom-left point may have negative offsets if
necessary.
The following figure shows the point values (pt1 and pt2) that textbox returns
for samples of vertical and aligned text. In both samples, the height of the
letters is 1.0. (For the aligned text, the height is adjusted to fit the alignment
points.)
When using vertical text styles, the points are still returned in left-to-right,
bottom-to-top order as they are for horizontal styles, so that the first point
list will contain negative offsets from the text insertion point.
Conversions
The functions described in this section are utilities for converting data types
and units. See in AutoLISP Function Synopsis, (page 119) for a complete list of
conversion functions.
String Conversions
The functions rtos (real to string) and angtos (angle to string) convert numeric
values used in AutoCAD to string values that can be used in output or as
textual data. The rtos function converts a real value, and angtos converts an
angle. The format of the result string is controlled by the value of AutoCAD
system variables: the units and precision are specified by LUNITS and LUPREC
for real (linear) values and by AUNITS and AUPREC for angular values. For
both functions, the dimensioning variable DIMZIN controls how leading and
trailing zeros are written to the result string.
The following code fragments show calls to rtos and the values returned
(assuming the DIMZIN system variable equals 0). Precision (the third argument
to rtos) is set to 4 places in the first call and 2 places in the others.
(setq x 17.5)
(setq str "\nValue formatted as ")
(setq fmtval (rtos x 1 4)) ; Mode 1 = scientific
(princ (strcat str fmtval)) ;
displays
Value formatted as 1.7500E+01
displays
Value formatted as 17.50
displays
Value formatted as 1'-5.50"
displays
Value formatted as 1'-5 1/2"
displays
Value formatted as 17 1/2
When the UNITMODE system variable is set to 1, specifying that units are
displayed as entered, the string returned by rtos differs for engineering (mode
equals 3), architectural (mode equals 4), and fractional (mode equals 5) units.
For example, the first two lines of the preceding sample output would be the
same, but the last three lines would appear as follows:
Value formatted as 1'5.50"
Value formatted as 1'5-1/2"
Value formatted as 17-1/2''
Because the angtos function takes the ANGBASE system variable into account,
the following code always returns "0":
(angtos (getvar "angbase"))
There is no AutoLISP function that returns a string version (in the current
mode/precision) of either the amount of rotation of ANGBASE from true zero
(East) or an arbitrary angle in radians.
To find the amount of rotation of ANGBASE from AutoCAD zero (East) or the
size of an arbitrary angle, you can do one of the following:
■ Add the desired angle to the current ANGBASE, and then check to see if
the absolute value of the result is greater than 2pi; (2 * pi). If so, subtract
2pi;; if the result is negative, add 2pi;, then use the angtos function on
the result.
■ Store the value of ANGBASE in a temporary variable, set ANGBASE to 0,
evaluate the angtos function, then set ANGBASE to its original value.
The following code fragments show similar calls to angtos and the values
returned (still assuming that DIMZIN equals 0). Precision (the third argument
to angtos) is set to 0 places in the first call, 4 places in the next three calls,
and 2 places in the last.
(setq ang 3.14159 str2 "\nAngle formatted as ")
(setq fmtval (angtos ang 0 0)) ; Mode 0 = degrees
(princ (strcat str2 fmtval)) ;
displays
Angle formatted as 180
displays
Angle formatted as 180d0'0"
displays
Angle formatted as 200.0000g
displays
Angle formatted as 3.1416r
displays
Angle formatted as W
The UNITMODE system variable also affects strings returned by angtos when
it returns a string in surveyor's units (mode equals 4). If UNITMODE equals 0, the
string returned can include spaces (for example, "N 45d E"); if UNITMODE equals
1, the string contains no spaces (for example, "N45dE").
The angtof function complements angtos, so all of the following calls return
the same value: 3.14159.
(angtof "180" 0) ; Mode 0 = degrees
(angtof "180d0'0\"" 1) ; Mode 1 = deg/min/sec
(angtof "200.0000g" 2) ; Mode 2 = grads
(angtof "3.14159r" 3) ; Mode 3 = radians
(angtof "W" 4) ; Mode 4 = surveyor's
When you have a string specifying a distance in feet and inches, or an angle
in degrees, minutes, and seconds, you must precede the quotation mark with
a backslash (\") so it doesn't look like the end of the string. The preceding
examples of angtof and distof demonstrate this action.
Angular Conversion
If your application needs to convert angular values from radians to degrees,
you can use the angtos function, which returns a string, and then convert
that string into a floating point value with atof.
returns
90.0
returns
90.0
You may also need to convert from degrees to radians. The following code
shows this:
; Convert value in degrees to radians
(defun Degrees->Radians (numberOfDegrees)
(* pi (/ numberOfDegrees 180.0))
) ;_ end of defun
To see your system's characters with their codes in decimal, octal, and
hexadecimal form, save the following AutoLISP code to a file named ascii.lsp.
Then load the file and enter the new ASCII command at the AutoCAD
Command prompt. This command prints the ASCII codes to the screen and
to a file called ascii.txt. The C:ASCII function makes use of the BASE function.
You may find this conversion utility useful in other applications.
; BASE converts from a decimal integer to a string in
another base.
(defun BASE ( bas int / ret yyy zot )
(defun zot ( i1 i2 / xxx )
(if (> (setq xxx (rem i2 i1)) 9)
(chr (+ 55 xxx))
(itoa xxx)
)
)
(setq ret (zot bas int) yyy (/ int bas))
(while (>= yyy bas)
(setq ret (strcat (zot bas yyy) ret))
(setq yyy (/ yyy bas))
)
(strcat (zot bas yyy) ret)
(princ (strcat "\n " (chr code) " " dec " "
oct " " hex ) )
(princ (strcat "\n " (chr code) " " dec " "
oct " " hex ) out)
(cond
((= code 255)(setq chk nil))
((= ct 20)
(setq xxx (getstring
"\n \nPress 'X' to eXit or any key to
continue: "))
(if (= (strcase xxx) "X")
(setq chk nil)
(progn
(setq ct 0)
(princ "\n \n CHAR DEC OCT HEX \n")
)
)
)
)
(setq ct (1+ ct) code (1+ code))
)
(close out)
(setq out nil)
)
)
(princ)
)
You can make new units available by using a text editor to add their definitions
to acad.unt. A definition consists of two lines in the file—the unit name and
the unit definition. The first line must have an asterisk (*) in the first column,
followed by the name of the unit. A unit name can have several abbreviations
or alternate spellings, separated by commas. If a unit name has singular and
plural forms, you can specify these using the following format:
*[ [common] [ ( [singular.] plural) ] ]...
You can specify multiple expressions (singular and plural). They don't have
to be located at the end of the word, and a plural form isn't required. The
following are examples of valid unit name definitions:
*inch(es)
*milleni(um.a)
*f(oot.eet) or (foot.feet)
The line following the *unit name line defines the unit as either fundamental
or derived.
Fundamental Units
Derived Units
A derived unit is defined in terms of other units. If the line following the *unit
name line begins with an equal sign (=), it defines derived units. Valid operators
in these definitions are * (multiplication), / (division), + (addition), -
(subtraction), and ^ (exponentiation). You can specify a predefined unit by
naming it, and you can use abbreviations (if provided). The items in a formula
are multiplied together unless some other arithmetic operator is specified. For
example, the units database defines the dimensionless multiple and
submultiple names, so you can specify a unit such as micro-inches by entering
micro inch. The following are examples of derived unit definitions.
; Units of area
*township(s)
=93239571.456 meter^2
The definition of a township is given as 93,239,571.456 square meters.
; Electromagnetic units
*volt(s),v
=watt/ampere
In this example, a volt is defined as a watt divided by an ampere. In the
acad.unt, both watts and amperes are defined in terms of fundamental units.
User Comments
The following AutoCAD coordinate systems can be specified by the from and
to arguments:
UCS User coordinate system—the working coordinate system. The user specifies
a UCS to make drawing tasks easier. All points passed to AutoCAD commands,
including those returned from AutoLISP routines and external functions, are
points in the current UCS (unless the user precedes them with a * at the
Command prompt). If you want your application to send coordinates in the
WCS, OCS, or DCS to AutoCAD commands, you must first convert them to
the UCS by calling the trans function.
Both the from and to arguments can specify a coordinate system in any of the
following ways:
■ As an integer code that specifies the WCS, current UCS, or current DCS
(of either the current viewport or paper space).
■ As an entity name returned by one of the entity name or selection set
functions described in Using AutoLISP to Manipulate AutoCAD Objects.
(page 74) This specifies the OCS of the named object. For planar objects,
the OCS can differ from the WCS, as described in the AutoCADUser's Guide.
If the OCS does not differ, conversion between OCS and WCS is an identity
operation.
■ As a 3D extrusion vector. Extrusion vectors are always represented in World
coordinates; an extrusion vector of (0,0,1) specifies the WCS itself.
The following table lists the valid integer codes that can be used as the to and
from arguments:
0 World (WCS)
The following example translates a point from the WCS into the current UCS.
(setq pt '(1.0 2.0 3.0))
(setq cs_from 0) ; WCS
(setq cs_to 1) ; UCS
(trans pt cs_from cs_to 0) ;
Point Transformations
If you are doing point transformations with the trans function and you need
to make that part of a program run faster, you can construct your own
transformation matrix on the AutoLISP side by using trans once to transform
each of the basis vectors (0 0 0), (1 0 0), (0 1 0), and (0 0 1). Writing matrix
multiplication functions in AutoLISP can be difficult, so it may not be
worthwhile unless your program is doing a lot of transformations.
File Handling
AutoLISP provides functions for handling files and data I/O. See File-Handling
Functions (page 137) in AutoLISP Function Synopsis, (page 119) for a complete
list of file-handling functions.
If the call to findfile is successful, the variable refname is set to a fully qualified
path name string, as follows:
"/home/work/ref/refc.dwg"
The getfiled function displays a dialog box containing a list of available files
of a specified extension type in the specified directory. This gives AutoLISP
routines access to the AutoCAD Get File dialog box.
A call to getfiled takes four arguments that determine the appearance and
functionality of the dialog box. The application must specify the following
string values, each of which can be nil: a title, placed at the top of the dialog
box; a default file name, displayed in the edit box at the bottom of the dialog
box; and an extension type, which determines the initial files provided for
selection in the list box. The final argument is an integer value that specifies
how the dialog box interacts with selected files.
This simple routine uses getfiled to let you view your directory structure and
select a file:
(defun C:DDIR ( )
(setq dfil (getfiled "Directory Listing" "" "" 2))
(princ (strcat "\nVariable 'dfil' set to selected file
" dfil ))
(princ)
)
This is a useful utility command. The dfil variable is set to the file you select,
which can then be used by other AutoLISP functions or as a response to a
NOTE You cannot use !dfil in a dialog box. It is valid only at the command line.
With any option, you can use filtering to specify a list of attributes and
conditions that the selected objects must match.
NOTE Selection set and entity names are volatile. That is, they apply only to the
current drawing session.
The first argument to ssget is a string that describes which selection option
to use. The next two arguments, pt1 and pt2, specify point values for the
relevant options (they should be left out if they don't apply). A point list,
pt-list, must be provided as an argument to the selection methods that allow
selection by polygons (that is, Fence, Crossing Polygon, and Window Polygon).
The last argument, filter-list, is optional. If filter-list is supplied, it specifies the
list of entity field values used in filtering. For example, you can obtain a
selection set that includes all objects of a given type, on a given layer, or of a
given color. Selection filters are described in more detail in Selection Set Filter
Lists (page 77).
See the ssget entry in the AutoLISP Reference for a list of the available selection
methods and the arguments used with each.
SSGET Examples
(setq pt1 '(0.0 0.0 0.0) Sets pt1, pt2, pt3, and pt4 to point
pt2 '(5.0 5.0 0.0) values
pt3 '(4.0 1.0 0.0)
pt4 '(2.0 6.0 0.0))
(setq ss1 (ssget)) Asks the user for a general object selec-
tion and places those items in a selec-
tion set
(setq ss1 (ssget "P")) Creates a selection set from the most
recently created selection set
(setq ss1 (ssget "L")) Creates a selection set of the last object
added to the database that is visible
on the screen
(setq ss1 (ssget "W" pt1 pt2)) Creates a selection set of the objects
inside the window from (0,0) to (5,5)
(setq ss1 (ssget '((0 . "TEXT"))) Prompts for general object selection but
) adds only text objects to the selection
set.
(setq ss1 (ssget "P" Creates a selection set containing all line
'((0 . "LINE"))) objects from the last selection set cre-
) ated.
(setq ss1 (ssget "W" pt1 pt2 Creates a selection set of all objects in-
'((8 . "FLOOR9"))) side the window that are also on layer
) FLOOR9.
(ssget "I" '((0 . "LINE") Creates a selection set of all blue Line
(62 . 5))) objects that are part of the Implied selec-
tion set (those objects selected while
PICKFIRST is in effect).
Note that this filter picks up lines that
have been assigned color 5 (blue), but
not blue lines that have had their color
applied by the ByLayer or ByBlock prop-
erties.
If both the code and the desired value are known, the list may be quoted as
shown previously. If either is specified by a variable, the list must be
constructed using the list and cons function. For example, the following code
creates a selection set of all objects in the database that are on layer FLOOR3:
(setq lay_name "FLOOR3")
(setq ss1
(ssget "X"
(list (cons 8 lay_name))
)
)
If the filter-list specifies more than one property, an entity is included in the
selection set only if it matches all specified conditions, as in the following
example:
NOTE The meaning of certain group codes can differ from entity to entity, and
not all group codes are present in all entities. If a particular group code is specified
in a filter, entities not containing that group code are excluded from the selection
set that ssget returns.
When ssget filters a drawing, the selection set it retrieves might include entities
from both paper space and model space. However, when the selection set is
passed to an AutoCAD command, only entities from the space that is currently
in effect are used. (The space to which an entity belongs is specified by the
value of its 67 group. Refer to the Customization Guide for further information.)
Relational Tests
Unless otherwise specified, an equivalency is implied for each item in the
filter-list. For numeric groups (integers, reals, points, and vectors), you can
specify other relations by including a special -4 group code that specifies a
relational operator. The value of a -4 group is a string indicating the test
operator to be applied to the next group in the filter-list.
The following selects all circles with a radius (group code 40) greater than or
equal to 2.0:
(ssget "X" '((0 . "CIRCLE") (-4 . ">=") (40 . 2.0)))
The possible relational operators are shown in the following table:
Operator Description
"=" Equals
Operator Description
The use of relational operators depends on the kind of group you are testing:
■ All relational operators except for the bitwise operators ("&" and "&=") are
valid for both real- and integer-valued groups.
■ The bitwise operators "&" and "&=" are valid only for integer-valued groups.
The bitwise AND, "&", is true if ((integer_group & filter) /= 0)—that is, if any
of the bits set in the mask are also set in the integer group. The bitwise
masked equals, "&=", is true if ((integer_group & filter) = filter)—that is, if all
bits set in the mask are also set in the integer_group (other bits might be set
in the integer_group but are not checked).
■ For point groups, the X, Y, and Z tests can be combined into a single string,
with each operator separated by commas (for example, ">,>,*"). If an
operator is omitted from the string (for example, "=,<>" leaves out the Z
test), then the “anything goes” operator, "*", is assumed.
■ Direction vectors (group type 210) can be compared only with the operators
"*", "=", and "!=" (or one of the equivalent “not equal” strings).
The grouping operators are specified by -4 groups, like the relational operators.
They are paired and must be balanced correctly in the filter list or the ssget
call will fail. An example of grouping operators in a filter list follows:
(ssget "X"
'(
(-4 . "<OR")
(-4 . "<AND")
(0 . "CIRCLE")
(40 . 1.0)
(-4 . "AND>")
(-4 . "<AND")
(0 . "LINE")
(8 . "ABC")
(-4 . "AND>")
(-4 . "OR>")
)
)
Grouping operators are not allowed within the -3 group. Multiple application
names specified in a -3 group use an implied AND operator. If you want to
test for extended data using other grouping operators, specify separate -3
groups and group them as desired. To select all circles having extended data
for either application "APP1" or "APP2" but not both, enter the following:
(ssget "X"
'((0 . "CIRCLE")
(-4 . "<XOR")
(-3 ("APP1"))
(-3 ("APP2"))
(-4 . "XOR>")
)
)
You can simplify the coding of frequently used grouping operators by setting
them equal to a symbol. The previous example could be rewritten as follows
(notice that in this example you must explicitly quote each list):
(setq <xor '(-4 . "<XOR")
xor> '(-4 . "XOR>") )
(ssget "X"
(list
'(0 . "CIRCLE")
<xor
'(-3 ("APP1"))
'(-3 ("APP2"))
xor>
)
)
As you can see, this method may not be sensible for short pieces of code but
can be beneficial in larger applications.
; drawing.
(if (not fname)
(princ "\nNo entities in drawing. ")
(progn
(setq ourset (ssadd fname)) ; Creates a selection set
of the
; first entity.
(ssadd lname ourset) ; Adds the last entity to
the
; selection set.
)
)
The example runs correctly even if only one entity is in the database (in which
case both entnext and entlast set their arguments to the same entity name).
If ssadd is passed the name of an entity already in the selection set, it ignores
the request and does not report an error. The following function removes the
first entity from the selection set created in the previous example:
(ssdel fname ourset)
If there is more than one entity in the drawing (that is, if fname and lname are
not equal), then the selection set ourset contains only lname, the last entity
in the drawing.
The function sslength returns the number of entities in a selection set, and
ssmemb tests whether a particular entity is a member of a selection set. Finally,
the function ssname returns the name of a particular entity in a selection set,
using an index to the set (entities in a selection set are numbered from 0).
The following code shows calls to ssname:
; entity in sset.
; entity in sset.
(if (not ent4)
(princ "\nNeed to select at least four entities. ")
)
(setq ilast (sslength sset)) ; Finds index of the last
entity
; in sset.
; Gets the name of the
; last entity in sset.
(setq lastent (ssname sset (1- ilast)))
Regardless of how entities are added to a selection set, the set never contains
duplicate entities. If the same entity is added more than once, the later
additions are ignored. Therefore, sslength accurately returns the number of
distinct entities in the specified selection set.
Object Handling
AutoLISP provides functions for handling objects. The object-handling
functions are organized into two categories: functions that retrieve the entity
name of a particular object, and functions that retrieve or modify entity data.
See Object-Handling Functions (page 143) in AutoLISP Function Synopsis, (page
119) for a complete list of the object-handling functions.
The following code fragment illustrates how ssadd can be used in conjunction
with entnext to create selection sets and add members to an existing set.
(setq e1 (entnext))
(if (not e1) ; Sets e1 to name of first
entity.
The entlast function retrieves the name of the last entity in the database. The
last entity is the most recently created main entity, so entlast can be called
to obtain the name of an entity that has just been created with a call to
command.
You can set the entity name returned by entnext to the same variable name
passed to this function. This “walks” a single entity name variable through
the database, as shown in the following example:
(setq one_ent (entnext)) ; Gets name of first
entity.
(while one_ent
.
. ; Processes new entity.
.
(setq one_ent (entnext one_ent))
) ; Value of one_ent is
now nil.
Entities in drawings that are cross-referenced by way of XREF Attach are not
actually part of the current drawing; their handles are unchanged but cannot
be accessed by handent. However, when drawings are combined by means of
INSERT, INSERT *, XREF Bind (XBIND), or partial DXFIN, the handles of
entities in the incoming drawing are lost, and incoming entities are assigned
new handle values to ensure each handle in the current drawing remains
unique.
The list returned from selecting a block with nentsel is summarized as follows:
The Mij, where 0 le; i, j le; 2, are the Model to World Transformation Matrix
coordinates; X, Y, Z is the entity definition data point expressed in MCS
coordinates, and X', Y', Z' is the resulting entity definition data point expressed
in WCS coordinates.
To transform a vector rather than a point, do not add the translation vector
(M30 M31 M32 from the fourth column of the transformation matrix).
NOTE This is the only AutoLISP function that uses a matrix of this type. The
nentselp function is preferred to nentsel because it returns a matrix similar to
those used by other AutoLISP and ObjectARX functions .
Using the entity name previously obtained with nentsel, the following example
illustrates how to obtain the MCS start point of a line (group code 10)
contained in a block definition:
Command: (setq edata (assoc 10 (entget (car ndata))))
The user has drawn a line with the following sequence of commands:
Command: line
From point: 1,2
To point: 6,6
To point: Enter
An AutoLISP application can retrieve and print the definition data for the line
by using the following AutoLISP function:
(defun C:PRINTDXF ( )
(setq ent (entlast)) ; Set ent to last entity.
(setq entl (entget ent)) ; Set entl to association list
of
; last entity.
(setq ct 0) ; Set ct (a counter) to 0.
(textpage) ; Switch to the text screen.
(princ "\nentget of last entity:")
)
(princ) ; Exit quietly.
)
This would print the following:
entget of last entity:
(-1 . <Entity name: 1bbd1c8>)
(0 . "LINE")
(330 . <Entity name: 1bbd0c8>)
(5 . "69")
(100 . "AcDbEntity")
(67 . 0)
(410 . "Model")
(8 . "0")
(100 . "AcDbLine")
(10 1.0 2.0 0.0)
(11 6.0 6.0 0.0)
(210 0.0 0.0 1.0)
The -1 item at the start of the list contains the name of the entity. The entmod
function, which is described in this section, uses the name to identify the
entity to be modified. The individual dotted pairs that represent the values
can be extracted by using assoc with the cdr function.
Sublists for points are not represented as dotted pairs like the rest of the values
returned. The convention is that the cdr of the sublist is the group's value.
Because a point is a list of two or three reals, the entire group is a three- (or
four-) element list. The cdr of the group is the list representing the point, so
the convention that cdr always returns the value is preserved.
The codes for the components of the entity are those used by DXF. As with
DXF, the entity header items (color, linetype, thickness, the attributes-follow
flag, and the entity handle) are returned only if they have values other than
the default. Unlike DXF, optional entity definition fields are returned whether
or not they equal their defaults and whether or not associated X, Y, and Z
coordinates are returned as a single point variable, rather than as separate X
(10), Y (20), and Z (30) groups.
When writing functions to process entity lists, make sure the function logic
is independent of the order of the sublists; use assoc to guarantee this. The
assoc function searches a list for a group of a specified type. The following
code returns the object type "LINE" (0) from the list entl.
(cdr (assoc 0 entl))
If the DXF group code specified is not present in the list (or if it is not a valid
DXF group), assoc returns nil.
Modifying an Entity
The entmod function modifies an entity. It passes a list that has the same
format as a list returned by entget but with some of the entity group values
(presumably) modified by the application. This function complements entget.
The primary mechanism by which an AutoLISP application updates the
database is by retrieving an entity with entget, modifying its entity list, and
then passing the list back to the database with entmod.
The following code fragment retrieves the definition data of the first entity
in the drawing and changes its layer property to MYLAYER.
(setq en (entnext)) ; Sets en to first entity name
; in the drawing.
(setq ed (entget en)) ; Sets ed to the entity data
; for entity name en.
(setq ed
(subst (cons 8 "MYLAYER")
(assoc 8 ed) ; Changes the layer group in ed.
There are restrictions on the changes to the database that entmod can make;
entmodcannot change the following:
■ The entity's type or handle.
■ Internal fields. (Internal fields are the values that AutoCAD assigns to
certain group codes: -2, entity name reference; -1, entity name; 5, entity
handle.) Any attempt to change an internal field—for example, the main
entity name in a seqend subentity (group -2)—is ignored.
■ Viewport entities. An attempt to change a viewport entity causes an error.
If the entity list refers to a layer name that has not been defined in the current
drawing, entmod creates a new layer. The attributes of the new layer are the
standard default values used by the New option of the AutoCAD LAYER
command.
The entmod function can modify subentities such as polyline vertices and
block attributes.
If you use entmod to modify an entity in a block definition, this affects all
INSERT or XREF references to that block. Also, entities in block definitions
cannot be deleted by entdel.
For entity types introduced in AutoCAD Release 13 and later releases, you
must also specify subclass markers (DXF group code 100) when creating the
entity. All AutoCAD entities have the AcDbEntity subclass marker, and this
must be explicitly included in the entmake list. In addition, one or more
subclass marker entries are required to identify the specific sub-entity type.
These entries must follow group code 0 and must precede group codes that
are specifically used to define entity properties in the entmake list. For
example, the following is the minimum code required to entmake an MTEXT
entity:
(entmake '(
(0 . "MTEXT")
(100 . "AcDbEntity") ; Required for all post-R12
entities.
(8 . "ALAYER")
(100 . "AcDbMText") ; Identifies the entity as MTEXT.
(10 4.0 4.0 0.0)
(1 . "Some\\Ptext")
)
)
3DFACE ARC
ATTDEF ATTRIB
CIRCLE DIMENSION
INSERT LINE
SEQEND SHAPE
SOLID TEXT
TRACE VERTEX
VIEWPORT
The entmake function verifies that a valid layer name, linetype name, and
color are supplied. If a new layer name is introduced, entmake automatically
creates the new layer. The entmake function also checks for block names,
dimension style names, text style names, and shape names, if the entity type
requires them. The function fails if it cannot create valid entities. Objects
created on a frozen layer are not regenerated until the layer is thawed.
As the previous paragraphs imply, entmake can construct only one complex
entity at a time. If a complex entity is being created and entmake receives
invalid data or an entity that is not an appropriate subentity, both the invalid
entity and the entire complex entity are rejected. You can explicitly cancel
the creation of a complex entity by calling entmake with no arguments.
The following example contains five entmake functions that create a single
complex entity, an old-style polyline. The polyline has a linetype of DASHED
and a color of BLUE. It has three vertices located at coordinates (1,1,0), (4,6,0),
and (3,2,0). All other optional definition data assume default values. (For this
example to work properly, the linetype DASHED must be loaded.)
(entmake '((0 . "POLYLINE") ; Object type
(62 . 5) ; Color
(6 . "dashed") ; Linetype
(66 . 1) ; Vertices follow
) )
(entmake '((0 . "VERTEX") ; Object type
(10 1.0 1.0 0.0) ; Start point
) )
(entmake '((0 . "VERTEX") ; Object type
(10 4.0 6.0 0.0) ; Second point
) )
(entmake '((0 . "VERTEX") ; Object type
(10 3.0 2.0 0.0) ; Third point
) )
(entmake '((0 . "SEQEND"))) ; Sequence end
NOTE Before you use entmake to create a block, you should use tblsearch to
ensure that the name of the new block is unique. The entmake function does not
check for name conflicts in the block definitions table, so it can redefine existing
blocks. See Symbol Table and Dictionary Access (page 114) for information on
using tblsearch.
Anonymous Blocks
The block definitions (BLOCK) table in a drawing can contain anonymous
blocks (also known as unnamed blocks), that AutoCAD creates to support
hatch patterns and associative dimensioning. The entmake function can
create anonymous blocks other than *Dnnn (dimensions) and *Xnnn (hatch
patterns). Unreferenced anonymous blocks are purged from the BLOCK
definition table when a drawing is opened. Referenced anonymous blocks
(those that have been inserted) are not purged. You can use entmake to create
a block reference (insert object) to an anonymous block. (You cannot pass an
anonymous block to the INSERT command.) Also, you can use entmake to
redefine the block. You can modify the entities in a block (but not the block
object itself) with entmod.
Consider the following: If the first entity in the current drawing is an old-style
polyline with several vertices, the following code modifies the second vertex
of the polyline and regenerates its screen image.
(setq e1 (entnext)) ; Sets e1 to the polyline's entity
name.
(setq v1 (entnext e1)) ; Sets v1 to its first vertex.
(setq v2 (entnext v1)) ; Sets v2 to its second vertex.
(setq v2d (entget v2)) ; Sets v2d to the vertex data.
(setq v2d
(subst
'(10 1.0 2.0 0.0)
(assoc 10 v2d) ; Changes the vertex's location
in v2d
v2d ; to point (1,2,0).
)
)
(entmod v2d) ; Moves the vertex in the drawing.
(entupd e1) ; Regenerates the polyline entity
e1.
NOTE To ensure that all instances of the block references are updated, you must
regenerate the drawing by invoking the AutoCAD REGEN command (with
command). The entupd function is not sufficient if the modified entity is in a
block definition.
When using entmake, the object type determines where the object will reside.
For example, if a layer object is passed to entmake, it automatically goes to
the layer symbol table. If a graphic object is passed to entmake, it will reside
in the current space (model or paper).
■ Symbol table entries that are not in the APPID table can have many of
their fields modified with entmod. To be passed to entmod, a symbol table
record list must include its entity name, which can be obtained from entget
VPORT *ACTIVE
LINETYPE CONTINUOUS
STYLE STANDARD
DIMSTYLE STANDARD
BLOCKS *MODEL_SPACE
BLOCKS *PAPER_SPACE
(1001 .
(1000, .
1002-1071 Registered application name 2)
(1001 XDATA fields)
.
.
.
Registered application name 3)
.
.
Long 1071. A 32-bit signed (long) integer. If the value that appears in a 1071
group is a short integer or real value, it is converted to a long integer; if it is
invalid (for example, a string), it is converted to a long zero (0L).
NOTE AutoLISP manages 1071 groups as real values. If you use entget to retrieve
an entity's definition list that contains a 1071 group, the value is returned as a
real, as shown in the following example:
(1071 . 12.0)
If you want to create a 1071 group in an entity with entmake or entmod, you
can use either a real or an integer value, as shown in the following example:
(entmake '((..... (1071 . 12) .... )))
(entmake '((..... (1071 . 12.0) .... )))
(entmake '((..... (1071 . 65537.0) .... )))
(entmake '((..... (1071 . 65537) .... )))
But AutoLISP still returns the group value as a real:
(entmake '((..... (1071 . 65537) .... )))
The preceding statement returns the following:
(1071 . 65537.0)
ObjectARX always manages 1071 groups as long integers.
Several other extended data groups have special meanings in this context (if
the application chooses to use them):
Control String 1002. An xdata control string can be either "{" or "}". These
braces enable the application to organize its data by subdividing it into lists.
The left brace begins a list, and the right brace terminates the most recent list.
Lists can be nested.
NOTE
If a 1001 group appears within a list, it is treated as a string and does not begin
a new application group.
Binary Data 1004. Binary data that is organized into variable-length chunks,
which can be handled in ObjectARX with the ads_binary structure. The
maximum length of each chunk is 127 bytes.
NOTE AutoLISP cannot directly handle binary chunks, so the same precautions
that apply to long (1071) groups apply to binary groups as well.
World Space Position 1011. Unlike a simple 3D point, the WCS coordinates
are moved, scaled, rotated, and mirrored along with the parent entity to which
World -Direction 1013. A 3D point that is rotated or mirrored along with the
parent, but not scaled, stretched, or moved. The WCS direction is a normalized
displacement that always has a unit length.
Distance 1041. A real value that is scaled along with the parent entity.
Scale Factor 1042. Also a real value that is scaled along with the parent.
The DXF group codes for xdata are also described in the DXF Reference.
Registration of an Application
To be recognized by AutoCAD, an application must register the name or names
that it uses. Application names are saved with the extended data of each entity
that uses them, and also in the APPID table. Registration is done with the
regapp function, which specifies a string to use as an application name. If it
successfully adds the name to APPID, it returns the name of the application;
otherwise it returns nil. A result of nil indicates that the name is already
present in the symbol table. This is not an actual error condition but an
expected return value, because the application name needs to be registered
only once per drawing.
To register itself, an application should first check that its name is not already
in the APPID table. If the name is not there, the application must register it.
Otherwise, it can simply go ahead and use the data, as described later in this
section.
The following fragment shows the typical use of regapp. (The tblsearch
function is described in Symbol Table and Dictionary Access (page 114).)
(setq appname "MYAPP_2356") ; Unique application
name.
(if (tblsearch "appid" appname) ; Checks if already
registered.
(princ (strcat
"\n" appname " already registered. "))
(if (= (regapp appname) nil) ; Some other problem.
(princ (strcat
Entering the preceding code at the command line returns a list that looks
something like this:
((-1 . <Entity name: 600000c0>) (0 . "INSERT") (8 . "0") (2
. "*X0")
(10 0.0 0.0 0.0) (41 . 1.0) (42 . 1.0) (50 . 0.0) (43 . 1.0)
(70 . 0) (71 . 0)
(44 . 0.0) (45 . 0.0) (210 0.0 0.0 1.0) (-3 ("ACAD" (1000 .
"HATCH")
(1002 . "{") (1070 . 16) (1000 . "LINE") (1040 . 1.0) (1040
. 0.0)
(1002 . "}"))))
This fragment shows a typical sequence for retrieving xdata for two specified
applications. Note that the application argument passes application names in
list form:
(setq working_elist
(entget ent_name
'("MY_APP_1" "SOME_OTHER") ; Only xdata from "MY_APP_1"
(if working_elist
(progn
... ; Updates working entity
groups.
(entmod working_elist) ; Only xdata from registered
) ; applications still in
the
) ; working_elist list are
modified.
As the sample code shows, you can modify xdata retrieved by entget by using
a subsequent call to entmod, just as you can use entmod to modify normal
definition data. You can also create xdata by defining it in the entity list passed
to entmake.
NOTE Because the strings passed by application can include wild-card characters,
an application name of "*" will cause entget to return all extended data attached
to an entity.
When you reference entities in other drawings (for example, entities that are
attached with XREF), you can avoid protests from AUDIT by using extended
entity strings (group 1000) rather than handles (group 1005). The handles of
cross-referenced entities are either not valid in the current drawing, or they
conflict with valid handles. However, if an XREF Attach changes to an XREF
Bind or is combined with the current drawing in some other way, it is up to
the application to revise the entity references accordingly.
When drawings are combined by means of INSERT, INSERT*, XREF Bind
(XBIND), or partial DXFIN, handles are translated so they become valid in the
current drawing. (If the incoming drawing did not employ handles, new ones
are assigned.) Extended entity handles that refer to incoming entities are also
translated when these commands are invoked.
When an entity is placed in a block definition (with the BLOCK command),
the entity within the block is assigned new handles. (If the original entity is
restored by means of OOPS, it retains its original handles.) The value of any
xdata handles remains unchanged. When a block is exploded (with the
EXPLODE command), xdata handles are translated in a manner similar to the
way they are translated when drawings are combined. If the xdata handle
refers to an entity that is not within the block, it is unchanged. However, if
the xdata handle refers to an entity that is within the block, the data handle
is assigned the value of the new (exploded) entity's handle.
Xrecord Objects
Xrecord objects are used to store and manage arbitrary data. They are composed
of DXF group codes with normal object groups (that is, non-xdata group
codes), ranging from 1 through 369 for supported ranges. These objects are
similar in concept to xdata but is not limited by size or order.
The following examples provide methods for creating and listing xrecord data.
(defun C:MAKEXRECORD( / xrec xname )
; create the xrecord's data list.
(setq xrec '((0 . "XRECORD")(100 . "AcDbXrecord")
(1 . "This is a test xrecord list")
Symbol Tables
Symbol table entries can also be manipulated by the following functions:
■ entdel
■ entget
■ entmake
■ entmod
■ handent
The first call to tblnext returns the first entry in the specified table. Subsequent
calls that specify the same table return successive entries, unless the second
argument to tblnext (rewind) is nonzero, in which case tblnext returns the
first entry again.
In the following example, the function GETBLOCK retrieves the symbol table
entry for the first block (if any) in the current drawing, and then displays it
in a list format.
(defun C:GETBLOCK (/ blk ct)
(setq blk (tblnext "BLOCK" 1)) ; Gets the first BLOCK
entry.
(setq ct 0) ; Sets ct (a counter) to
0.
(textpage) ; Switches to the text
screen.
(princ "\nResults from GETBLOCK: ")
(repeat (length blk) ; Repeats for the number
of
; members in the list.
(print (nth ct blk)) ; Prints a new line, then
As with tblnext, the first argument to tblsearch is a string that names a table,
but the second argument is a string that names a particular symbol in the
table. If the symbol is found, tblsearch returns its data. This function has a
third argument, setnext, that you can use to coordinate operations with tblnext.
If setnext is nil, the tblsearch call has no effect on tblnext, but if setnext is
non-nil, the next call to tblnext returns the table entry following the entry
found by tblsearch.
The setnext option is useful when you are handling the VPORT symbol table,
because all viewports in a particular viewport configuration have the same
name (such as *ACTIVE).
If the VPORT symbol table is accessed when TILEMODE is turned off, any
changes have no visible effect until TILEMODE is turned on. Do not confuse
VPORTS,which is described by the VPORT symbol table with paper space viewport
entities.
The following processes all viewports in the 4VIEW configuration:
(setq v (tblsearch "VPORT" "4VIEW" T)) ; Finds first VPORT
entry.
(while (and v (= (cdr (assoc 2 v)) "4VIEW"))
.
. ; ... Processes
entry ...
.
(setq v (tblnext "VPORT")) ; Gets next VPORT
entry.
)
Dictionary Entries
A dictionary is a container object, similar to the symbol tables in functions.
Dictionary entries can be queried with the dictsearch and dictnext functions.
Each dictionary entry consists of a text name key plus a hard ownership handle
reference to the entry object. Dictionary entries may be removed by directly
passing entry object names to the entdel function. The text name key uses
the same syntax and valid characters as symbol table names.
Category Summary
Functions in this synopsis are organized into the following categories:
■ Basic: Application-handling, arithmetic, equality and conditional,
error-handling, function-handling, list manipulation, string-handling, and
symbol-handling functions
■ Utility: Conversion, device access, display control, file-handling, geometric,
query and command, and user input functions
■ Selection Set, Object, and Symbol Table: Extended data-handling,
object-handling, selection set manipulation, and symbol table-handling
functions
■ Memory Management
■ VLX Namespace: Function exposure, document namespace variable access,
and error-handling functions
■ Namespace Communication: Blackboard-addressing and multi-document
loading functions
■ Property List (PIist) Handling
119
Functions are grouped by data type and by the action they perform. Detailed
information on each function is provided in the alphabetical listings in the
AutoLISP Reference.
Note that any functions not described here or in other parts of the
documentation are not officially supported and are subject to change in future
releases.
Basic Functions
Utility Functions
Basic Functions
The basic functions consist of the arithmetic, string-handling, equality and
conditional, list manipulation, symbol-handling, function-handling,
error-handling, and application-handling functions.
Application-Handling Functions
The following table provides summary descriptions of the AutoLISP
application-handling functions.
Application-handling functions
Function Description
Function Description
Arithmetic Functions
The following table provides summary descriptions of the AutoLISP arithmetic
functions.
Arithmetic functions
Function Description
(- (subtract) [number number] ...) Subtracts the second and following numbers from
the first and returns the difference
Function Description
(/ (divide) [number number] ...) Divides the first number by the product of the
remaining numbers and returns the quotient
(~ (bitwise NOT) int) Returns the bitwise NOT (1's complement) of the
argument
Function Description
(logand [ int int ...]) Returns the result of the logical bitwise AND of
a list of integers
(logior [ int int ...]) Returns the result of the logical bitwise inclusive
OR of a list of integers
(max [ number number ...]) Returns the largest of the numbers given
(min [ number number ...]) Returns the smallest of the numbers given
(rem [ num1 num2 ...]) Divides the first number by the second, and re-
turns the remainder
Function Description
(= (equal to) numstr [numstr] ...) Returns T if all arguments are numerically equal,
and returns nil otherwise
(/= (not equal to) numstr [numstr] ...) Returns T if the arguments are not numerically
equal, and nil if the arguments are numerically
equal
(< (less than) numstr [numstr] ...) Returns T if each argument is numerically less
than the argument to its right, and returns nil
otherwise
(<= (less than or equal to) numstr Returns T if each argument is numerically less
[numstr] ...) than or equal to the argument to its right, and
returns nil otherwise
(> (greater than) numstr [numstr] ...) Returns T if each argument is numerically
greater than the argument to its right, and re-
turns nil otherwise
(>= (greater than or equal to) numstr Returns T if each argument is numerically
[numstr] ...) greater than or equal to the argument to its
right, and returns nil otherwise
(Boole func int1 [ int2 ...]) Serves as a general bitwise Boolean function
(cond [( test result ...) ...]) Serves as the primary conditional function for
AutoLISP
Function Description
(equal expr1 expr2 [fuzz]) Determines whether two expressions are equal
(while testexpr [ expr ...]) Evaluates a test expression, and if it is not nil,
evaluates other expressions; repeats this process
until the test expression evaluates to nil
Error-Handling Functions
The following table provides summary descriptions of the AutoLISP
error-handling functions.
Error-handling functions
Function Description
Function Description
Function-Handling Functions
The following table provides summary descriptions of the AutoLISP
function-handling functions.
Function-handling functions
Function Description
(defun-q-list-ref ' function) Displays the list structure of a function defined with
defun-q
Function Description
(progn [expr] ...) Evaluates each expression sequentially, and returns the
value of the last expression
(untrace function ...) Clears the trace flag for the specified functions
Function Description
(append lst ...) Takes any number of lists and runs them
together as one list
Function Description
(foreach name lst [ expr ...]) Evaluates expressions for all members of
a list
(mapcar function list1 ... listn) Returns a list of the result of executing a
function with the individual elements of
a list or lists supplied as arguments to the
function
(subst newitem olditem lst) Searches a list for an old item and returns
a copy of the list with a new item substi-
tuted in place of every occurrence of the
old item
Function Description
(vl-every predicate-function list [ more-lists]...) Checks whether the predicate is true for
every element combination
(vl-position symbol list) Returns the index of the specified list item
(vl-some predicate-function list [ more-lists]...) Checks whether the predicate is not nil
for one element combination
Function Description
String-Handling Functions
The following table provides summary descriptions of the AutoLISP
string-handling functions.
String-handling functions
Function Description
Function Description
(vl-string-position char-code str Looks for a character with the specified AS-
[ start-pos [ from-end-p]]) CII code in a string
(vl-string-search pattern string [ start-pos]) Searches for the specified pattern in a string
(vl-string-subst new-str pattern string Substitutes one string for another, within a
[ start-pos]) string
Function Description
Symbol-Handling Functions
The following table provides summary descriptions of the AutoLISP
symbol-handling functions.
Symbol-handling functions
Function Description
Function Description
Utility Functions
The utility functions consist of query and command, display control, user
input, geometric, conversion, file-handling, and device access functions.
Conversion Functions
The following table provides summary descriptions of the AutoLISP conversion
functions.
Conversion functions
Function Description
(angtos angle [mode [precision]]) Converts an angular value in radians into a string
Function Description
(cvunit value from to) Converts a value from one unit of measurement
to another
Function Description
(grread [track] [allkeys [curtype]]) Reads values from any of the AutoCAD input
devices
Function Description
(grdraw from to color [highlight]) Draws a vector between two points, in the current
viewport
(grtext [box text [highlight]]) Writes text to the status line or to screen menu
areas
Function Description
File-Handling Functions
The following table provides summary descriptions of the AutoLISP
file-handling functions.
File-handling functions
Function Description
(open filename mode) Opens a file for access by the AutoLISP I/O
functions
Function Description
Geometric functions
Function Description
(inters pt1 pt2 pt3 pt4 [onseg]) Finds the intersection of two lines
(polar pt ang dist) Returns the UCS 3D point at a specified angle and
distance from a point
Function Description
Function Description
Function Description
Function Description
(getangle [pt] [msg]) Pauses for user input of an angle, and returns that
angle in radians
(getfiled title default ext flags) Prompts the user for a file name with the standard
AutoCAD file dialog box, and returns that file name
(getint [msg]) Pauses for user input of an integer, and returns that
integer
(getkword [msg]) Pauses for user input of a keyword, and returns that
keyword
(getorient [pt] [msg]) Pauses for user input of an angle, and returns that
angle in radians
Function Description
(getpoint [pt] [msg]) Pauses for user input of a point, and returns that
point
(getreal [msg]) Pauses for user input of a real number, and returns
that real number
(getstring [cr] [msg]) Pauses for user input of a string, and returns that
string
(initget [bits] [string]) Establishes keywords for use by the next user input
function call
Function Description
(xdsize lst) Returns the size (in bytes) that a list occupies when it
is linked to an object (entity) as extended data
Object-Handling Functions
The following table provides summary descriptions of the AutoLISP
object-handling functions.
Object-handling functions
Function Description
Function Description
(entnext [ename]) Returns the name of the next object in the drawing
Function Description
(ssget [mode] [pt1 [pt2]] [pt-list] Prompts the user to select objects (entities), and
[filter-list]) returns a selection set
(sssetfirst gripset [pickset]) Sets which objects are selected and gripped
Function Description
Function Description
(tblsearch table-name symbol [setnext]) Searches a symbol table for a symbol name
Function Description
Function Description
(vl-doc-set symbol value) Sets the value of a variable in the associated document's
namespace
(vl-exit-with-error “msg”) Passes control from a VLX error handler to the *error*
function of the associated document namespace
Function Description
(vl-bb-ref ' variable) Returns the value of a variable from the blackboard
namespace
(vl-bb-set ' variable value) Sets the value of a variable in the blackboard
namespace
(vl-load-all “filename”) Loads a file into all open AutoCAD documents, and
into any document subsequently opened during the
current AutoCAD session
Function Description
(vl-propagate ' variable) Copies the value of a variable into all open AutoCAD
documents, and into any document subsequently
opened during the current AutoCAD session
Function Description
(vl-registry-read reg-key Returns data stored in the Property List for the
[ val-name]) specified key/value pair
Error Codes
The following table shows the values of error codes generated by AutoLISP.
The ERRNO system variable is set to one of these values when an AutoLISP
The ERRNO system variable is not always cleared to zero. Unless it is inspected
immediately after an AutoLISP function has reported an error, the error that
its value indicates may be misleading. This variable is always cleared when
starting or opening a drawing.
NOTE The possible values ofERRNO, and their meanings, are subject to change.
Value Meaning
0 No error
Value Meaning
13 Invalid handle
Value Meaning
Value Meaning
53 Duplicate APPID
Value Meaning
Value Meaning
157 | Index
redefining AutoCAD commands 32, converting data types and units 61,
34 72
related publications 2 angular values from radians or
sending commands to AutoCAD degrees 64, 65
prompt 43 ASCII code conversions 65
text extents 56, 60 coordinate system
undoing commands issued with transformations 70, 72
command function 46 measurement unit
user input functions 49, 55 conversions 67, 69
accessing user input from point transformations 72
devices 74 string conversions 61, 64
allowable input 50 synopsis of functions 135
arbitrary keyboard input 54, 55 data types 6
controlling user-input function entity names 8, 9
conditions 52, 55 file descriptors 9
getting user input 49, 52 integers 6, 7
getxxx functions 49, 52 lists 8
input options 53 reals 7
keyword options 53, 54 selection sets 8
pausing for user input 44, 45 strings 8
validating input 55 symbols and variables 10
AutoCAD groups, accessing 117 device access and control
Autodesk World Wide Web site 2 functions 74
AutoLISP synopsis of 136
accessing AutoCAD groups 117 dictionary functions 116, 117
accessing user input with 74 display-control functions 137
application-handling functions 122 displaying messages with 17, 18
AutoCAD display control 47, 49 dotted pairs 26, 27
graphics and text windows 48 equality and conditional
low-level graphics 48, 49 functions 126
overview 47, 48 equality verification 21
closing files in programs 9 error codes 149
comments in program files 11 error-handling 38, 41, 126, 127
communicating with AutoCAD 42 exiting quietly 18
converting data types and expressions 3, 5
units 61, 72 extended data functions
device access and control 74 attaching extended data to
display control 47, 49 entities 111, 112
file-handling functions 72 filtering selection sets for
geometric utilities 55, 60 extended data 80
getting user input 49, 55 group codes for extended
query and command data 106
functions 42, 47 handles in extended data 112,
conditional branching and 113
looping 21 managing memory use 112
control characters in strings 18, 19
158 | Index
organization of extended finding intersection of two
data 107, 109 lines 55
registration of finding polar coordinates of
applications 109, 110 points 55
retrieving extended data 106, object snap 56
110, 111 overview 55, 56
synopsis of 143 synopsis of 139
file-handling functions text extents 56, 60
file search 73, 74 integer overflow handling 6, 7
synopsis of 138, 139 interacting with users 74
foreign-language support 44 list processing functions 26, 27
formatting code 11 adding items to list
function synopsis (summary) 119 beginning 22, 23
basic functions 121, 134 combining lists 22
category summary 119, 120 dotted pairs 26, 27
memory management grouping related items 22
functions 147 point lists 23, 26
namespace communication retrieving items from lists 21,
functions 149 22
Property List functions 149 returning all but first
selection set, object, and symbol element 22
table functions 147 substituting items 22, 23
utility functions 134, 142 synopsis of 131
VLX namespace functions 147 manipulating AutoCAD objects 74,
function syntax 5 117
function-handling 28, 38 extended data 106, 113
adding commands 31 object-handling 86, 106
c\ selection set handling 75, 86
xxx functions 30, 34 symbol table and dictionary
defining functions 28, 29 access 114, 117
defining functions with xrecord objects 113
arguments 36, 38 matching parentheses 4
defun function 28, 37 memory management
defun-q function 29 functions 147
local variables in functions 34, namespace communication
36 functions 149
redefining AutoCAD number handling 14
commands 32, 34 object-handling functions 86, 106
special forms 37, 38 blocks and 89, 92
synopsis of functions 127, 128 entity access functions 92
functions, as lists 29 entity data functions 92, 102
geometric utilities 55, 60 entity name functions 86, 92
finding angle between line and X extended data 106, 113
axis 55 non-graphic
finding distance between two object-handling 104,
points 55 106
Index | 159
polylines (old-style and synopsis of 145, 146
lightweight) 103 testing whether an entity is a
selection sets 75, 86 member 84
symbol table and dictionary selection set, object
entries 114, 117 and symbol table
synopsis of 145 functions 142, 147
xrecord objects 113 spaces in code 11
output functions 16, 21 special forms 37, 38
control characters in quoted string-handling 14, 16, 133
strings 18, 19 symbol and function-handling 28,
displaying messages 17, 18 38
wild-card matching 20, 21 symbol table access functions 114,
predefined variables 13, 14 116
program files 11 symbol-handling 28, 134
comments 11 undoing commands issued with
formatting code 11 command function 46
Property List functions 149 user input functions
query and command functions 42, accessing user input from
47 devices 74
configuration control 47 allowable input 50
foreign-language support 44 arbitrary keyboard input 54, 55
inspecting and changing system controlling user-input function
and environment conditions 52, 55
variables 47 getting user input 49, 52
passing pick points to AutoCAD getxxx functions 49, 52
commands 45, 46 input options 53
pausing for user input 44, 45 keyword options 53, 54
sending commands to AutoCAD pausing for user input 44, 45
prompt 43 synopsis of 142
synopsis of 141 validating input 55
undoing commands issued with utility functions 134, 142
command function 46 conversion functions 135
referring to entities for multiple device access functions 136
sessions 9 display-control functions 137
selection set handling functions 75, file-handling functions 138,
86 139
adding entities 83, 84 geometric functions 139
creating selection sets 75, 77 query and command
deleting entities 83, 84 functions 141
finding number of entities 84, user input functions 142
85 variables
passing selection sets between assigning values to 10, 12
AutoLISP and ObjectARX data type 10, 12
applications 85, 86 displaying value of 13
returning entity names 84 nil variables 13
selection set filter lists 77, 85 predefined 13, 14
160 | Index
Visual LISP extended functions close function 9
VLX namespace functions 147 closing
xrecord objects 113 files in AutoLISP programs 9
combining lists 22
combining strings in AutoLISP 15
B command function
backslash foreign-language support 44
for control characters in quoted passing pick points to AutoCAD
strings 18, 19 commands 45, 46
using within quoted strings 18, 19 pausing for user input 44, 45
backslash (\\) sending commands to AutoCAD
for control characters in quoted prompt 43
strings 18, 19 undoing commands 46
using within quoted strings 18, 19 comments
balance of parentheses, checking in in AutoLISP program files 11
VLISP 4 in unit definition file 69
blocks concatenating strings in AutoLISP 15
working with 101 conditional branching and looping in
AutoLISP 21
configuration control 47
C cons function
adding items to list beginning 22
c\ creating dotted pairs 26, 27
xxx functions 30, 34 control characters
caddr function 25 in quoted strings 18, 19
cadr function 24, 25, 26 controlling AutoCAD display 47, 49
car function graphics and text windows 48
for point lists 24, 25, 26 low-level graphics 48, 49
handling dotted pairs 27 menus 48
retrieving items from lists 22 overview 47, 48
case (of text and symbols) conversion functions 61, 72
automatic changing of by angular values from radians or
AutoLISP 14 degrees 64, 65
converting with strcase ASCII code conversions 65
function 14, 15 coordinate system
equality checking and 21 transformations 70, 72
symbols, automatic case changing AutoCAD coordinate
of 14 systems 70, 71
case sensitivity overview 70
comparison functions and 21 point transformations 72
of equality functions 21 specifying coordinate
of grouping operators 83 systems 71
of input functions 53 valid integer codes 72
of symbol names 10 measurement unit conversions 67,
cdr function 69
handling dotted pairs 27 point transformations 72
returning all but first list element 22
Index | 161
string conversions 61, 64 redefining AutoCAD commands 32,
synopsis of 135 34
converting string case 14, 15 defun-q function 64, 65
coordinate system transformations degrees, converting to radians 65
AutoCAD coordinate systems 70, deleting
71 entities 93
entity context and coordinate selection set entities 83, 84
transform data 88, 92 stripping file extensions 15, 16
overview 70 derived units 69
point transformations 72 device access and control functions 74
specifying coordinate systems 71 accessing user input 74
valid integer codes 72 synopsis of 136
creating dictionary and symbol table handling
complex entities 98, 100 functions 147
selection sets 75, 77 dictionary functions 116, 117
curve-fit polylines, processing 103 dictionary objects 106
Customization Guide 2 dictnext function 116
cvunit function 67 dictsearch function 116, 117
display control functions 137
Display Coordinate System 70, 71
D displaying
data types controlling AutoCAD display 47, 49
AutoLISP graphics and text windows 48
entity names 8, 9 low-level graphics 48, 49
file descriptors 9 menus 48
integers 6, 7 overview 47, 48
lists 8 display control functions 136, 137
overview 6 messages in AutoLISP 17, 18
reals 7 variable values 13
selection sets 8 distof function 63
strings 8 dotted pairs 26, 27
symbols 10 drawing area and entity data
variables 10, 12 functions 102
extended data organization 107, drawings
109 adding entities to 96, 98
defining new units 68 DXF Reference 2
defun function 28, 37
adding commands 31 E
c\
xxx functions 30, 34 entdel function 93
compatibility with AutoCAD entget function 93, 95, 106, 110, 111
versions 29 entities
defining functions 28, 29 adding to drawings 96, 98
with arguments 36, 38 blocks 101
local variables in functions 34, 36 changing 95, 96
complex 93, 98
162 | Index
handles and use of 87, 88 polylines and 103
modifying 95, 96 symbol table objects and 104
names, obtaining 86, 87 entnext function 87, 103
obtaining information on 93, 95 entsel function 86
referring to across multiple entupd function 102
sessions 9 environment variables, inspecting and
entity access functions 92 changing 47
entity data functions 92, 102 equality and conditional functions 126
adding entities to drawings 96, 98 equality verification in AutoLISP 21
anonymous blocks 101 ERRNO system variable 149
creating complex entities 98, 100 error codes
deleting entities 93 AutoLISP 149
drawing area and 102 errors
modifying entities 95, 96 *error* function 39
obtaining entity information 93, 95 AutoLISP error handling 38, 41
working with blocks 101 catching and continuing
entity filter lists for selection sets 77, 85 execution 41
examples 77, 78 continuing after 41
filtering for extended data 80 error-handling functions 38, 40, 127
logical grouping of filter tests 82, intercepting with
83 vl-catch-all-apply 41
overview 77, 79 vl-catch-all-apply, using 41
relational tests 80, 82 escape codes in strings 18, 19
selection set manipulation 83, 85 exiting
wild-card patterns in 79 quietly in AutoLISP 18
entity name data type expressions
defined 8 AutoLISP 3, 5
overview 8, 9 form for 3, 4
referring to entities across multiple function syntax 5
sessions 9 matching parentheses 4
entity name functions 86, 92 quotation marks and parentheses 5
entity access functions 92 extended data 106, 113
entity context and coordinate attaching to entities 111, 112
transform data 88, 92 filtering selection sets for 80
entity handles and their uses 87, 88 group codes for 106
overview 86, 87 handles in 112, 113
retrieving entity names 86, 87 managing memory use 112
setting entity name to variable organization of 107, 109
name 87 registration of applications 109, 110
entlast function 87 retrieving 106, 110, 111
entmake function 96, 101, 104 synopsis of 143
entmod function
dictionary objects and 106
drawing area and 102
F
modifying entities 95, 96 file descriptor data type
non-graphic object handling 104 defined 9
Index | 163
overview 9 functions
file extensions application-handling 121, 122
stripping 15 arithmetic 122, 124
file-handling functions 72, 138, 139 as AutoCAD commands 30, 34
file search 73, 74 as lists 30, 34
synopsis of 138, 139 c\
files xxx functions 30, 34
AutoLISP program files 11 controlling AutoCAD display 47, 49
comments 11 graphics and text windows 48
formatting code 11 low-level graphics 48, 49
closing in AutoLISP programs 9 menus 48
file-handling functions 72, 138, 139 overview 47, 48
file search 73, 74 conversion functions
synopsis of 138, 139 angular values from radians or
stripping file extensions 15 degrees 64, 65
unit definition file 67, 69 ASCII code conversions 65
filter lists for selection sets 77, 85 coordinate system
examples 77, 78 transformations 70, 72
filtering for extended data 80 measurement unit
logical grouping of filter tests 82, conversions 67, 69
83 point transformations 72
overview 77, 79 string conversions 61, 64
relational tests 80, 82 synopsis of 134, 135
selection set manipulation 83, 85 device access and control
wild-card patterns in 79 synopsis of 135
findfile function 73 device access and control
floating point numbers, distance to functions 74
floating point function 63 accessing user input 74
forcing line breaks in strings 19 dictionary functions 116, 117
foreign-language support 44 display control functions 137
formatting code 11 entity access functions 92
function-handling functions 28, 38 entity data functions 92, 102
adding commands 31 adding entities to drawings 96,
c\ 98
xxx functions 30, 34 anonymous blocks 101
defining functions 28, 29 creating complex entities 98,
defining functions with 100
arguments 36, 38 deleting entities 93
defun function 28, 37 drawing area and 102
defun-q function 34, 36 modifying entities 95, 96
local variables in functions 34, 36 obtaining entity
redefining AutoCAD commands 32, information 93, 95
34 working with blocks 101
special forms 37, 38 entity name functions 86, 92
synopsis of 128 entity access functions 92
164 | Index
entity context and coordinate geometric utilities 55, 60
transform data 88, 92 finding angle between line and X
entity handles and their axis 55
uses 87, 88 finding distance between two
overview 86, 87 points 55
retrieving entity names 86, 87 finding intersection of two
setting entity name to variable lines 55
name 87 finding polar coordinates of
equality and conditional 125, 126 points 55
error-handling 126 object snap 56
extended data functions 106, 113 overview 55, 56
attaching extended data to synopsis of 139
entities 111, 112 text extents 56, 60
filtering selection sets for list handling
extended data 80 synopsis of 131
group codes for extended list handling functions 26, 27
data 106 adding items to list
handles in extended data 112, beginning 22, 23
113 combining lists 22
managing memory use 112 dotted pairs 26, 27
organization of extended grouping related items 22
data 107, 109 point lists 23, 26
registration of retrieving items from lists 21,
applications 109, 110 22
retrieving extended data 106, returning all but first
110, 111 element 22
synopsis of 143 substituting items 22, 23
file-handling functions 72 local variables in 34, 36
file search 73, 74 making available
synopsis of 137, 138 as AutoCAD commands 30, 34
function-handling memory management
synopsis of 128 functions 147
function-handling functions 28, 38 namespace communication
adding commands 31 functions 149
c\ number handling in AutoLISP 14
xxx functions 30, 34 object-handling functions
defining functions 28, 29 entity access functions 92
defining functions with entity data functions 92, 102
arguments 36, 38 entity name functions 86, 92
local variables in functions 34, non-graphic
36 object-handling 104,
redefining AutoCAD 106
commands 32, 34 polylines, old-style and
special forms 37, 38 lightweight 103
synopsis of 145
Index | 165
output functions 16, 21 selection set, object, and symbol
control characters in quoted table functions 142,
strings 18, 19 147
displaying messages 17, 18 symbol-handling functions 134
wild-card matching 20, 21 utility functions 134, 142
Property List functions 149 VLX namespace functions 147
query and command functions symbol table access functions 114,
configuration control 47 116
foreign-language support 44 syntax conventions in AutoLISP 5
inspecting and changing system user input functions
and environment accessing user input from
variables 47 devices 74
passing pick points to AutoCAD allowable input 50
commands 45, 46 arbitrary keyboard input 54, 55
pausing for user input 44, 45 controlling user-input
sending commands to AutoCAD conditions 52, 55
prompt 43 getting user input 49, 52
synopsis of 141 getxxx functions 49, 52
undoing commands issued with input options 53
command function 46 keyword options 53, 54
selection set handling functions pausing for user input 44, 45
adding entities 83, 84 synopsis of 142
creating selection sets 75, 77 validating input 55
deleting entities 83, 84 user-defined
finding number of entities 84, defining with defun 28, 37
85 Visual LISP extensions
passing selection sets between VLX namespace functions 147
AutoLISP and ObjectARX VLX namespace functions 147
applications 85, 86 fundamental units 68
returning entity names 84
selection set filter lists 77, 85
synopsis of 145, 146
G
testing whether an entity is a garbage collection 85, 147
member 84 geometric utilities 55, 60, 139
special forms 37, 38 finding
string-handling 133 angle between line and X
summary of axis 55
basic functions 121, 134 distance between two points 55
category summary 119 intersection of two lines 55
memory management polar coordinates of points 55
functions 147 object snap 56
namespace communication overview 55, 56
functions 149 synopsis of 139
Property List functions 149 text extents 56, 60
getangle function 50, 51
getcorner function 49, 50
166 | Index
getdist function 49, 50 overflow handling by AutoLISP 6,
getenv function 47 7
getfiled function 73, 74 overview 6, 7
getint function 49, 50 intercepting program errors 41
getkword function 50, 52 international language considerations 44
getorient function 50, 51
getpoint function 49, 50
getreal function 49, 50
L
getstring function 49, 50 languages, supporting foreign 44
getting user input 49, 55 lines (graphic)
accessing user input from devices 74 finding angle between line and X
allowable input 50 axis 55
arbitrary keyboard input 54, 55 finding intersection of two lines 55
controlling user-input function old-style and lightweight
conditions 52, 55 polylines 103
getxxx functions 49, 52 processing curve-fit and spline-fit
input options 53 polylines 103
keyword options 53, 54 lines (text)
pausing for user input 44, 45 forcing line breaks in strings 19
validating input 55 list data type
getvar function 47 defined 8
getxxx functions 49, 55 overview 8
graphscr function 48 list function
grdraw function 48, 49 forming point lists 23
group codes for regular and extended grouping related items 22
data 106, 107 list handling
grread function 74 adding items to list beginning 22,
grtext function 48, 49 23
grvecs function 48, 49 association lists 27
combining lists 22
H creating lists 22, 27
dotted pairs 26, 27
handent function 87, 88, 112 grouping related items 22
handles improper lists 26
entity handles and their uses 87, 88 point lists 23, 26
in extended data 112, 113 proper lists 26
retrieving items from lists 21, 22
returning all but first element 22
I substituting items 22, 23
improper lists 26 synopsis of 128, 131
inches, converting to meters 67 local variables 34, 36
initget function 51, 52, 55
integer data type M
defined 6
number handling in AutoLISP 14 manipulating AutoCAD objects 74, 117
extended data 106, 113
Index | 167
object-handling 86, 106 O
selection set handling 75, 86
symbol table and dictionary Object Coordinate System 70
access 114, 117 Object Snap modes 56
xrecord objects 113 ObjectARX applications
matching parentheses passing selection sets between
in AutoLISP code 4 AutoLISP and 85, 86
matching wild-cards in strings 20, 21 ObjectARX Reference 2
measurement unit conversions 67, 69 objects
memory dictionary objects 106
freeing 85, 147 entity access functions 92
garbage collection 85, 147 entity data functions 92, 102
managing extended data memory adding entities to drawings 96,
use 112 98
memory management anonymous blocks 101
functions 147 creating complex entities 98,
menucmd function 48 100
menus (AutoCAD) deleting entities 93
controlling 48 drawing area and 102
meters, converting inches to 67 modifying entities 95, 96
obtaining entity
information 93, 95
N working with blocks 101
names/naming entity name functions 86, 92
entity name functions 86, 92 entity access functions 92
setting entity name to variable entity context and coordinate
name 87 transform data 88, 92
stripping file extensions 15, 16 entity handles and their
symbol naming restrictions 10 uses 87, 88
symbol table entries that cannot be overview 86, 87
renamed 105 retrieving entity names 86, 87
variables 10 setting entity name to variable
namespaces name 87
namespace communication manipulating AutoCAD objects 74,
functions 148, 149 117
VLX namespace functions 147 extended data 106, 113
nentsel function 86, 88, 92 object-handling 86, 106
nentselp function 88, 91 selection set handling 75, 86
newline character 19 symbol table and dictionary
nil variables access 114, 117
exiting quietly 18 xrecord objects 113
overview 13 modifying
nth function 21, 22 with entmod 95, 96
ntmod function, anonymous blocks object-handling functions 86, 106
and 101 entity access functions 92
number handling in AutoLISP 14 entity data functions 92, 102
168 | Index
entity name functions 86, 92 pick points, passing to AutoCAD
non-graphic commands 45, 46
object-handling 104, point lists 23, 26
106 points
polylines, old-style and coordinate system
lightweight 103 transformations 70, 72
synopsis of 143 finding distance between 55
selection set handling functions finding polar coordinates of 55
adding entities 83, 84 transformations 72
creating selection sets 75, 77 polylines
deleting entities 83, 84 old-style and lightweight 103
finding number of entities 84, processing curve-fit and spline-fit
85 polylines 103
passing selection sets between predefined variables, AutoLISP 13, 14
AutoLISP and ObjectARX prin1 function 17
applications 85, 86 princ function
returning entity names 84 exiting quietly 18
selection set filter lists 77, 85 output display from 17
synopsis of 145, 146 print function 17
testing whether an entity is a printing
member 84 messages in AutoLISP 17, 18
symbol table objects 104, 105 prompt function 17
xrecord objects 113 proper lists 26
obtaining entity information 93, 95 Property List functions 149
operators, relational, for selection set filter Property List functions for Mac 149
lists 80, 82
osnap function 56
output functions 16, 21
Q
control characters in quoted query and command functions
strings 18, 19 configuration control 47
displaying messages 17, 18 foreign-language support 44
wild-card matching 20, 21 inspecting and changing system and
environment variables 47
P passing pick points to AutoCAD
commands 45, 46
Paper Space DCS 71 pausing for user input 44, 45
parentheses sending commands to AutoCAD
matching in AutoLISP code 4 prompt 43
passing pick points to AutoCAD synopsis of 139
commands 45, 46 undoing commands issued with
passing selection sets between AutoLISP command function 46
and ObjectARX quotation marks
applications 85, 86 and parentheses in expressions 5
PAUSE symbol 13, 44, 45 using within quoted strings 18, 19
pausing for user input 44, 45 quote function, forming point lists 24
PI variable 13
Index | 169
quoted strings selection set handling functions 75, 86,
control characters in 18, 19 145, 146
selection sets
adding entities to 83, 84
R creating 75, 77
radians deleting entities from 83, 84
converting degrees to 64, 65 filter lists 77, 85
converting to degrees 64, 65 examples 77, 78
read-char function 74 filtering for extended data 80
read-line function 74 logical grouping of filter
real data type tests 82, 83
converting to string 61, 62 overview 77, 79
defined 7 relational tests 80, 82
number handling in AutoLISP 14 selection set manipulation 83,
overview 7 85
scientific notation for 7 wild-card patterns in 79
redefining AutoCAD commands 32, 34 finding number of entities 84, 85
redraw function 48 passing between AutoLISP and
regapp function 109, 111 ObjectARX
registration of applications 109, 110 applications 85, 86
relational operators for selection set filter returning entity names 84
lists synopsis of functions for
logical grouping of 82, 83 handling 145
overview 80, 82 testing whether an entity is a
replacing member 84
list items 22, 23 sending commands to AutoCAD
restrictions prompt 43
restricted characters 10 setq function 12
symbol naming restrictions 10 setvar function 47
retrieving single quotation mark, forming point
entity names 86, 87 lists 24
extended data 106, 110, 111 Snap modes 56
items from lists 21, 22 spaces
return character in quoted strings 19 in AutoLISP code 11
rtos function 61, 62 special characters
control characters in quoted
strings 18, 19
S relational operators for selection set
filter lists 80, 82
scientific notation for reals 7 special forms 37, 38
searching spline-fit polylines, processing 103
for file names 73, 74 ssadd function 83, 84
selecting ssdel function 83, 85
entities 86, 88, 92 ssget function
objects 86, 88, 92 creating selection sets 75, 77
selection set data type selection set filter lists 77, 85
defined 8
170 | Index
sslength function 84, 85 and dictionary handling
ssmemb function 84 functions 146
ssname function 84 entries that cannot be
storing arbitrary data 113 modified 105
strcase function 14, 15 entries that cannot be
strcat function 15 renamed 105
string data type objects 104, 105
defined 8 symbol-handling functions 133, 134
overview 8 system variables
strings ERRNO 149
ASCII code conversions 65 specifying values 47
AutoLISP output functions 16, 21
AutoLISP string-handling 14, 16
concatenating 15
T
control characters in quoted T symbol 13
strings 18, 19 TAB character in quoted strings 19
converting angles to 62, 63 tblnext function 115, 116
converting case 14, 15 tblsearch function 115, 116
converting reals to 61, 62 terpri function 19
DIESEL string expressions 48 text extents 56, 60
displaying messages 17, 18 textbox function 56, 60
finding number of characters 15 textpage function 48
forcing line breaks in 19 textscr function 48
returning substrings 15, 16 trans function 70, 72
string conversions 61, 64
string-handling functions 131, 133
stripping file extensions 15, 16 U
wild-card matching 20, 21
stripping file extensions 15, 16 unbalanced parentheses, checking in
strlen function 15, 16 AutoLISP 4
subst function 22, 23 underscore (_)
substituting list items 22, 23 for foreign-language support 44
substr function 15, 16 undoing
symbol table commands issued with command
names 21 function 46
objects 104, 105 unit conversions 67, 69
symbols inches to meters 67
AutoLISP data type 10 overview 67
AutoLISP symbol-handling 28 unit definition file 67, 69
case setting of 10, 21 unit definition file 67, 69
defined 10 defining new units 68
naming restrictions 10 derived units 69
PAUSE symbol 44, 45 fundamental units 68
restricted characters 10 user comments 69
symbol table valid name definitions 68
access functions 114, 116 updating
entities 95, 96
Index | 171
user comments 69 case sensitivity of 10
User Coordinate System 70 defined 10
user input functions displaying values 13
accessing user input from devices 74 environment variables, inspecting and
allowable input 50 changing 47
arbitrary keyboard input 54, 55 local variables in functions 34, 36
controlling user-input names, case and 10
conditions 52, 55 naming 10
getting user input 49, 52 nil variables 13
getxxx functions 49, 52 predefined 13, 14
input options 53 system variables
keyword options 53, 54 specifying values 47
pausing for user input 44, 45 Visual LISP extended functions
synopsis of 141, 142 VLX namespace functions 147
validating input 55 vl-catch-all-apply 41
user-defined functions VLX namespace functions 147
defining with defun function 28,
37
adding commands 31
W
c\ wcmatch function 20, 21
xxx functions 30, 34 Web site for Autodesk 2
compatibility with AutoCAD wild-card characters
versions 29 in filter lists for selection sets 79
local variables in functions 34, matching in strings 20, 21
36 windows
redefining AutoCAD controlling AutoCAD graphics and
commands 32, 34 text windows 48
with arguments 36, 38 World Coordinate System 70
World Wide Web site for Autodesk 2
V
valid name definitions 68
X
variables xdroom function 112
assigning values 10, 12 xdsize function 112
AutoLISP 12, 14 xrecord objects 113
AutoLISP data type 10
172 | Index