CAD开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

AutoLISP 开发指南

将 3D 点转换为 2D 点

2023-1-5 08:33| 发布者: admin| 查看: 457| 评论: 0|来自: AutoCAD

花园路径程序中的另一个有用功能是将 3D 点转换为 2D 点。AutoCAD 通常使用 3D 坐标,但某些图元(如轻量级多段线)始终表示为 2D 坐标。函数返回的点是 3D 的,因此您需要创建一个函数来转换它们。getpoint

将 3D 点转换为 2D 点的步骤

  1. 在控制台窗口提示符下输入以下内容:
    (defun 3dPoint->2dPoint (3dpt)(list (car 3dpt) (cadr 3dpt)))
  2. 通过在控制台提示符下输入以下内容来测试函数:
    (3dpoint->2dpoint (list 10 20 0))

    这有效,但花园路径应用程序还有另一个考虑因素。尽管在 LISP 函数中,数字是整数还是实数通常无关紧要,但 ActiveX 函数并非如此,您将在本课的后面部分使用。ActiveX 函数需要实数。您可以轻松修改函数以确保它返回实数而不是整数。

  3. 在控制台提示符下输入以下代码:
    (defun 3dPoint->2dPoint (3dpt)(list (float(car 3dpt)) 
    (float(cadr 3dpt))))
  4. 再次运行该函数:
    (3dpoint->2dpoint (list 10 20 0))

    请注意,返回值现在是实数(由十进制值指示)。

  5. 再次测试函数,这次使用函数。在控制台提示符下输入以下内容:getpoint
    (setq myPoint(getpoint))
  6. 在 AutoCAD 绘图区域中选取一个点。

    该函数返回一个 3D 点。getpoint

  7. 在控制台提示符下输入以下内容:
    (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

路过

雷人

握手

鲜花

鸡蛋

最新评论

QQ|Archiver|CAD开发者社区 ( 苏ICP备2022047690号-1 )

GMT+8, 2024-5-19 14:29

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

返回顶部