Another useful function
in the garden path program converts 3D points to 2D points. AutoCAD usually
works with 3D coordinates, but some entities, such as lightweight
polylines, are always meant to be 2D. The points returned by the *getpoint* function
are 3D, so you need to create a function to convert them.

To convert a 3D point to a 2D point

- Enter the following at the
Console window prompt:
(defun 3dPoint->2dPoint (3dpt)(list (car 3dpt) (cadr 3dpt)))

- Test the function by
entering the following at the Console prompt:
(3dpoint->2dpoint (list 10 20 0))

This works, but there is another consideration for the garden path application. Although it often doesn't matter whether a number is an integer or a real in LISP functions, this isn't the case with ActiveX functions, which you'll use later in this lesson. ActiveX functions require real numbers. You can easily modify the function to ensure it returns reals instead of integers.

- Enter the following
code at the Console prompt:
(defun 3dPoint->2dPoint (3dpt)(list (float(car 3dpt))

(float(cadr 3dpt))))

- Run the function again:
(3dpoint->2dpoint (list 10 20 0))

Notice the return values are now reals (indicated by the decimal values).

- Test the function again,
this time using the
*getpoint*function. Enter the following at the Console prompt:(setq myPoint(getpoint))

- Pick a point in the AutoCAD drawing area.
- Enter the following
at the Console prompt:
(3dPoint->2Dpoint myPoint)

Now add the function to the

*gpmain.lsp*file, just as you did with*Degrees->Radians*. The new code should look like the following:;;;--------------------------------------------------------------;

;;; Function: 3dPoint->2dPoint ;

;;;--------------------------------------------------------------;

;;; Description: This function takes one parameter representing a;

;;; 3D point (list of three integers or reals), and ;

;;; converts it into a 2D point (list of two reals).;

;;; There is no error checking on the 3D point ;

;;; parameter -- it is assumed to be a valid point. ;

;;;--------------------------------------------------------------;

;;; To do: Add some kind of parameter checking so that this ;

;;; function won't crash a program if it is passed a ;

;;; null value, or some other kind of data type than a ;

;;; 3D point. ;

;;;--------------------------------------------------------------;

(defun 3dPoint->2dPoint (3dpt)

(list (float(car 3dpt)) (float(cadr 3dpt)))

)

Note that the function heading includes a comment about some work you should do on this function in the future. If you want to earn some extra credit, think about how you would go about foolproofing this function so that invalid data does not make it crash.

Hint:

*numberp*and*listp*functions…(listp '(1 1 0)) => T

(numberp 3.4) => T