如何自定义两个返回值的函数
函数有两个返回值,如何调用而不出错?不给这个函数形参可以吗?;==================================================================
(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
;-------------------------------------------------------------
调用时这样写感觉很怪
(setq a1(car(myarea)))
(setq str1(cadr(myarea)))
(setq a2(car(myarea)))
(setq str2(cadr(myarea)))
因为感觉没有让程序分清那个是第一次返回的结果,那里开始重新调用函数,请指教!
(setq area (myarea)),不要每次都运行myarea函数 (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 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 )来组成表比'(....)这样的好,具体原因不知道
有懂的人请指教。
如此
(SETQ AREA1(MYAREA))
(SETQ AREA2(MYAREA))
就能得到两个不同结果吗?我估计area1=area2.
我将结果用list ( ab )
然后再用你的car和cadr 分离结果。就像计算xy坐标一样。
兄弟,C:TEST是系统关键字哦。
我改成了C:TT 测试没有问题啊
错误: 参数类型错误: numberp: TOT_AREA
上面这句话的意思是:一个数字型的变量发生错误,该变量的名称是TOT_AREA ;计算单次选定对象的总面积
(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)
) 本帖最后由 byghbcx 于 2012-1-10 14:04 编辑
革天明 发表于 2012-1-10 11:02 http://bbs.mjtd.com/static/image/common/back.gif
;==================================================================
(DEFUN MYAREA( / ss nr tot_area ...
使用(list )来组成表比'(....)这样的好,具体原因不知道,有懂的人请指教。
(list)是组建新表,里面可以有变量值,'(....),'是括号中的值禁止求值,也就是变量值不会被读取。在'(tot_area txt ...)中会把tot_area当作自定义符号在运行。
页:
[1]
2