明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2305|回复: 11

如何自定义两个返回值的函数

  [复制链接]
发表于 2012-1-10 09:51:07 | 显示全部楼层 |阅读模式
函数有两个返回值,如何调用而不出错?不给这个函数形参可以吗?
;==================================================================
(DEFUN MYAREA( / ss nr tot_area txt en )
  (if (setq ss (ssget '()))
    (progn
      (setq nr      0
              tot_area 0.0
              en      (ssname ss nr)
              TXT     ""
      );end setq
      (while en
            (command "._area" "_O" en)
      (setq tot_area (+ tot_area (ATOF(RTOS (getvar "area") 2 2)))
               nr       (1+ nr)
               en       (ssname ss nr)
              TXT      (STRCAT TXT "+" (RTOS (getvar "area") 2 2) )
      );end setq
      );end while
    '(tot_area txt);这里是返回的结果
    );end progn
    nil;else if
  );end if
);end defun
;-------------------------------------------------------------
"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2012-1-10 09:55:28 | 显示全部楼层
调用时这样写感觉很怪
  (setq a1(car(myarea)))
  (setq str1(cadr(myarea)))
  (setq a2(car(myarea)))
  (setq str2(cadr(myarea)))
因为感觉没有让程序分清那个是第一次返回的结果,那里开始重新调用函数,请指教!
发表于 2012-1-10 10:35:21 | 显示全部楼层
(setq area (myarea)),不要每次都运行myarea函数
 楼主| 发表于 2012-1-10 10:51:19 | 显示全部楼层
(SETQ AREA1(MYAREA))
(SETQ AREA2(MYAREA))
(setq a1(car(AREA1)))
  (setq str1(cadr(AREA1)))
  (setq a2(car(AREA2)))
  (setq str2(cadr(AREA2)))
是这样吗?
 楼主| 发表于 2012-1-10 11:02:19 | 显示全部楼层
本帖最后由 革天明 于 2012-1-10 13:50 编辑

;==================================================================
(DEFUN MYAREA( / ss nr tot_area txt en )
  (if (setq ss (ssget '()))
    (progn
      (setq nr             0
            tot_area 0.0
            en             (ssname ss nr)
            TXT     ""
      );end setq
      (while en
        (command "._area" "_O" en)
        (setq tot_area (+ tot_area (ATOF(RTOS (getvar "area") 2 2)))
              nr       (1+ nr)
              en       (ssname ss nr)
              TXT      (STRCAT TXT "+" (RTOS (getvar "area") 2 2) )
        );end setq
      );end while
    (LIST tot_area txt)
    );end progn
    nil;else if
  );end if
);end defun
;-------------------------------------------------------------
(DEFUN C:TS()
  (SETQ AREA1(MYAREA)
        AREA2(MYAREA)
        A1(CAR AREA1)
        T1(CADR AREA1)
        A2(CAR AREA2)
        T2(CADR AREA2)
        A(- A1 A2)
  )
  (PRINC (RTOS A 0 2))
  (PRIN1)
)
改成这样就能运行了,C:TEST最好不用,是LISP保留的,使用(list )来组成表比'(..  ..)这样的好,具体原因不知道
有懂的人请指教。
发表于 2012-1-10 11:08:56 | 显示全部楼层
如此
(SETQ AREA1(MYAREA))
(SETQ AREA2(MYAREA))
就能得到两个不同结果吗?我估计area1=area2.
我将结果用list ( a  b )
然后再用你的car和cadr 分离结果。就像计算xy坐标一样。
发表于 2012-1-10 11:29:18 | 显示全部楼层
兄弟,C:TEST是系统关键字哦。
我改成了C:TT 测试没有问题啊
发表于 2012-1-10 11:32:35 | 显示全部楼层
错误: 参数类型错误: numberp: TOT_AREA
上面这句话的意思是:一个数字型的变量发生错误,该变量的名称是TOT_AREA
发表于 2012-1-10 13:58:31 | 显示全部楼层
;计算单次选定对象的总面积
(defun aream (/ olderr oldcmdecho errexit undox restore ss1 nr en)
  (defun undox ()
    (command "._undo" "_E")
    (setvar "cmdecho" oldcmdecho)
    (setq *error* olderr)
    (princ)
  )
  (setq olderr  *error*
        restore undox
        *error* errexit
  )
  (setq oldcmdecho (getvar "cmdecho"))
  (setvar "cmdecho" 0)
  (command "._UNDO" "_BE")
  (if (setq ss1 (ssget '((-4 . "<OR")
                         (0 . "POLYLINE")
                         (0 . "LWPOLYLINE")
                         (0 . "CIRCLE")
                         (0 . "ELLIPSE")
                         (0 . "SPLINE")
                         (0 . "REGION")
                         (-4 . "OR>")
                        )
                )
      )
    (progn
      (setq nr 0)
      (setq tot_area 0.0)
      (setq en (ssname ss1 nr))
      (while en
        (command "._area" "_O" en)
        (setq tot_area (+ tot_area (getvar "area")))
        (setq nr (1+ nr))
        (setq en (ssname ss1 nr))
      )
    )
  )
)
;计算面积之差
(defun C:MJ()
  (aream)
  (setq mj1 tot_area)
  (princ "\n第一次所选图形的面积是:")
  (princ mj1)
  
  (aream)
  (setq mj2 tot_area)
  (princ "\n第二次所选图形的面积是:")
  (princ mj2)
  
  (princ "\n第一次和第二次所选图形的面积之差为:")
  (- mj1 mj2)
)
发表于 2012-1-10 14:02:33 | 显示全部楼层
本帖最后由 byghbcx 于 2012-1-10 14:04 编辑
革天明 发表于 2012-1-10 11:02
;==================================================================
(DEFUN MYAREA( / ss nr tot_area ...


使用(list )来组成表比'(..  ..)这样的好,具体原因不知道,有懂的人请指教。
(list  )是组建新表,里面可以有变量值,'(..  ..),'是括号中的值禁止求值,也就是变量值不会被读取。在'(tot_area txt   ...)中会把tot_area当作自定义符号在运行。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-12-23 20:46 , Processed in 0.344965 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表