将 3D 点转换为 2D 点
花园小径程序中的另一个有用功能是将 3D 点转换为 2D 点。AutoCAD 通常使用三维坐标,但某些图元(如轻量级多段线)始终应为二维坐标。函数返回的点是 3D 的,因此您需要创建一个函数来转换它们。getpoint
将 3D 点转换为 2D 点
- 在控制台窗口提示符下输入以下内容:
(defun 3dPoint->2dPoint (3dpt)(list (car 3dpt) (cadr 3dpt)))
- 通过在控制台提示符下输入以下内容来测试函数:
(3dpoint->2dpoint (list 10 20 0))
这可行,但花园小径应用还有另一个考虑因素。尽管在 LISP 函数中,数字是整数还是实数通常无关紧要,但 ActiveX 函数并非如此,您将在本课后面使用。ActiveX 函数需要实数。您可以轻松修改函数以确保它返回实数而不是整数。
- 在控制台提示符下输入以下代码:
(defun 3dPoint->2dPoint (3dpt)(list (float(car 3dpt))
(float(cadr 3dpt))))
- 再次运行该函数:
(3dpoint->2dpoint (list 10 20 0))
请注意,返回值现在是实数(由十进制值表示)。
- 再次测试该函数,这次使用该函数。在控制台提示符下输入以下内容:getpoint
(setq myPoint(getpoint))
- 在 AutoCAD 绘图区域中选取一个点。
该函数返回一个 3D 点。getpoint
- 在控制台提示符下输入以下内容:
(3dPoint->2Dpoint myPoint)
请注意返回的 2D 点。
现在将该函数添加到 gpmain.lsp 文件中,就像您对 .新代码应如下所示:Degrees->Radians
;;;--------------------------------------------------------------;
;;; 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)))
)
请注意,函数标题包含有关将来应在此函数上执行的一些工作的评论。如果您想获得一些额外的积分,请考虑如何使此功能万无一失,以便无效数据不会使其崩溃。
提示:和功能...numberplistp
(listp '(1 1 0)) => T
(numberp 3.4) => T
|