Calculating Points (Polar)
The Polar function is defined in the AutoCAD Customization manual as follows :
POLAR : Returns the UCS 3D point at a specified angle and distance from a point.
(polar pt ang dist)
This, I believe, is one of the most useful functions in the AutoCAD stable.
In a nutshell, you feed it a point, tell it the angle and distance from
that point that you want to be, and it will return the second point.
Can you imagine having to do that using car, cadr, etc.
First you would have to break the list down into each separate component, do all the calculations on each individual item, and then re-construct the list.
What a pain!!
Following is an example of how to use POLAR to construct a simple square or rectangle from values input by the user :
(defun DTR (a) ;degrees to radians function (* PI (/ a 180.0)) );defun ;========================================= (defun C:BOX1 (/ IP P1 P2 P3 LENGTH HEIGHT ;define function and declare OLDSNAP OLDBLIP OLDLIGHT) ;variables as local (setq OLDSNAP (getvar "OSMODE") ;store system variables OLDBLIP (getvar "BLIPMODE") OLDLIGHT (getvar "HIGHLIGHT") );setq ;========================================= (setvar "CMDECHO" 0) ;change system variables (setvar "BLIPMODE" 0) (setq IP (getpoint "\nInsertion Point: ")) ;get insertion point (setvar "OSMODE" 0) ;switch off snap (setq LENGTH (getreal "\nEnter Length: ") ;get length of box HEIGHT (getreal "\nEnter Height: ") ;get height of box );setq ;========================================= (setq P1 (polar IP (DTR 0.0) LENGTH) ;calculate first corner P2 (polar P1 (DTR 90.0) HEIGHT) ;calculate second corner P3 (polar P2 (DTR 180.0) LENGTH) ;calculate third corner );setq ;========================================= (command "PLINE" IP "W" "" "" P1 P2 P3 "C" );command ;draw the box ;========================================= (prompt "\nRotation Angle: ") ;prompt the user for rotation (command "ROTATE" "LAST" "" IP pause) ;rotate the box ;========================================= (setvar "OSMODE" OLDSNAP) ;reset system variables (setvar "BLIPMODE" OLDBLIP) (setvar "HIGHLIGHT" OLDLIGHT) (princ) ;exit quietly );defun
To save you typing here's the source code : Box1 Lisp (1 Kb)
As you can see, we first need to write a function to convert radians to degrees. This is because when we deal with angles in AutoLISP they must be in Radians.
Hint : This could be a Global function loaded from your Acad Lisp file.
Now to our main routine.
The first thing that we do is define the function and declare all the
variables as local. (Only used within this program.)
Then we save certain system variables, before changing them, so that we can reset them later.
Next we ask the user for Insertion Point, Length and Height of the box.
We then use the POLAR function to calculate the remaining 3 corners of the
box. (PT1, PT2 and PT3).
Then, just to be kind, we allow the user to rotate the box.
(That's why we drew the box using a Pline.)
Lastly, we reset all the system variables that we changed back to their original state.