Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
George Omura. Lisp programing tutorial for AutoCAD customization / 620.0.The ABC's of AutoLISP - Omura, George.pdf
Скачиваний:
140
Добавлен:
02.05.2014
Размер:
1.55 Mб
Скачать

The ABC’s of AutoLISP by George Omura

session lasts, and can be retrieved through evaluation by any other function. However, all of the functions and variables you have created in this session will be lost as soon as you exit the drawing editor.

We should mention that you must include a space before and after the slash sign in the argument list. If these spaces are not present, you will get an error message.

In both the adsquare and Square2 functions above we left out the c:. As we mentioned, this allows the function to be used by other functions like a subprogram. You can also use functions defined in this way in the middle of other commands by entering the name of the function enclosed by parentheses at the command prompt. For example, you could define a function that converts centimeters to inches. Carefully enter the following function:

(defun CMTOI (cm)

(* cm 0.3937)

)

Now suppose you started the Insert command to insert a symbol file into a drawing. When the prompt

X scale factor (1) / Corner / XYZ:

appears, you could enter

(cmtoi 90)

to signify that your symbol is to be given the scale of 90 centimeters.

The AutoLISP function Cmtoi will convert the 90 to 35.433 and enter this value for the X scale factor prompt. This can be quite useful where a value conversion or any other type of data conversion is wanted.

Automatic Loading of Programs

Eventually, you will find that some of your AutoLISP programs are indispensable to your daily work. You can have your favorite set of AutoLISP programs automatically load at the beginning of every editing session by collecting all of your programs into a single file called Acad.lsp. Be sure that Acad.lsp is in your AutoCAD directory. By doing this, you don't have to load your programs every time you open a new file. AutoCAD will look for Acad.LSP when it enters the drawing editor, and if it exists, AutoCAD will load it automatically.

1.Exit AutoCAD and check to see if you already have a file called Acad.lsp in your Acad directory. If so, rename it to Acadtemp.lsp.

2.Next, rename the Box.lsp file to Acad.lsp. Place Acad.lsp in your AutoCAD directory if it isn't there already.

3.Start AutoCAD and open any file. When the drawing editor loads, notice the following message in the prompt area:

42

Copyright © 2001 George Omura,,World rights reserved

The ABC’s of AutoLISP by George Omura

Loading acad.lsp...

Now, the box program is available to you without having to manually load it.

Though the Acad.lsp file only contained the box program, you could have included several programs and functions in that single file. Then, you would have access to several AutoLISP programs by loading just one file.

Managing Large Acad.lsp files

As you begin to accumulate more AutoLISP functions in your ACAD.lsp file, you will notice that AutoCAD takes longer to load them. This delay in loading time can become annoying especially when you just want to quickly open a small file to make a few simple revisions. Fortunately, there is an alternative method for automatically loading programs that can reduce AutoCAD's start-up time.

Instead of placing the programs code in Acad.lsp, you can use a program that loads and runs the program in question. For example, you could have the following line in place of the box program in the Acad.lsp file:

(defun c:BOX () (load "/lsp/box") (c:box))

We will call this a box loader function. Once the above function is loaded, entering Box at the command prompt will start it. This box loader function then loads the real Box program which in turn replaces this box loader function. The (c:box) in the box loader function is evaluated once the actual box program has been loaded thus causing the box program to run. C:BOX is the symbol representing the program BOX so when it evaluated, like any function, it will run.

As you can see, this program takes up considerably less space that the actual box program and will therefore load faster at start-up time. You can have several of these loading programs, one for each AutoLISP function or program you wish to use on a regular basis. Imagine that you have several programs equivalent in size to the box program. the Acad.lsp file might be several pages long. A file this size can take 30 seconds to load. If you reduce each of those programs to one similar to the box loader function above, you substantially reduce loading time. Several pages of programs could be reduced to the following:

(defun C:PROGM1 () (load "/lsp/progm1") (C:PROGM1))

(defun C:PROGM2 () (load "/lsp/progm2") (C:PROGM2))

(defun C:PROGM3 () (load "/lsp/progm3") (C:PROGM3))

(defun C:PROGM4 () (load "/lsp/progm4") (C:PROGM4))

(defun C:PROGM5 () (load "/lsp/progm5") (C:PROGM5))

(defun C:PROGM6 () (load "/lsp/progm6") (C:PROGM6))

(defun C:PROGM7 () (load "/lsp/progm7") (C:PROGM7))

If you imagine that each of the functions being called from the above example is several lines long then you can see

43

Copyright © 2001 George Omura,,World rights reserved

The ABC’s of AutoLISP by George Omura

that as the list of programs in Acad.lsp grows, the more space you will save. By setting up your Acad.lsp file in this way, you also save memory since functions are loaded only as they are called.

Using AutoLISP in a Menu

There are two reasons why you might write AutoLISP code directly into the menu file. The first is to selectively load external AutoLISP programs as they are needed. You may have several useful but infrequently used programs that take up valuable memory. You might prefer not load these programs at startup time. By placing them in the menu file, they will only load when they are selected from the menu. In fact, this is what the AutoShade and 3dobjects menu options do. When you pick Ashade from either the screen or pull down menu, and AutoShade is present on your computer, an AutoLISP program called Ashade.lsp is loaded.

The code of the program can be present in the menu file or you can use a method similar to the one described earlier to load external AutoLISP files. However, if you use the menu system to load external AutoLISP files, you must a slightly different method.

In the example we gave for loading programs from external AutoLISP file, the loader program is replaced by the fully operational program of the same name. But if you were to place the following expression in a menu, the program would load every time the menu option was selected.

[box]^C^C(load "box");box

There is nothing wrong with loading the program each time it is run but if the AutoLISP file is lengthy, you may get tired of waiting for the loading to complete every time you select the item from the menu. A better way to load a program from the menu is to use the If function as in the following:

[box]^C^C(if (not C:box)(load "box")(princ "Box is already loaded. ");box

In this example, we show three new functions, If, Not and Princ. The If functions checks to see if certain conditions can be met then evaluates an expression depending on the result. The If functions expects the first argument to test the condition that is to be met while the second argument is the expression to be evaluated if the condition is true. A third expression can optionally be added for cases where you want an expression to be evaluated when the test condition returns nil. The Not function returns a T for true if its argument evaluates to nil, otherwise it returns nil (see figure 2.11).

44

Copyright © 2001 George Omura,,World rights reserved

The ABC’s of AutoLISP by George Omura

Figure 2.11: Using the If function

So, in the menu sample above, if C:BOX does not exists, Not will return T for true and the If function evaluates the (load "box") expression thereby loading the Box program. If C:BOX has already been loaded, then Not function returns nil and box.lsp will not be loaded again. Instead, the second argument will be evaluated. This expression:

(princ "Box is already loaded. ")

simply displays the string:

Box is already loaded.

on the command prompt.

You may have noticed that the If function does not conform to the standard rules of evaluation. Where If is used, the second or third argument is evaluated depending on the value of the first argument.

The second reason for placing code in the menu is speed. Instead of creating a function using Defun, you can set up a program to be read and executed line by line. This saves time since the interpreter reads and executes each expression of your program as they occur in the menu listing instead of reading the entire set of expressions then executing the program. Memory is also saved since Defun is not used to define a new function. Figure 2.11 shows a listing of how the box program from chapter 1 would look as a menu option.

[BOX] ^C^C(setvar "menuecho" 1);+

(setq pt1 (getpoint "Pick first corner: "));\+

(setq pt3 (getcorner pt1 "Pick opposite corner: "));\+ (setq pt2 (list (car pt3) (cadr pt1)));+

(setq pt4 (list (car pt1) (cadr pt3)));+ line; pt1; pt2; pt3; pt4;C;)

Figure 2.12: The box program as a menu option

45

Copyright © 2001 George Omura,,World rights reserved