明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2673|回复: 6

[已解答] 错误: quit / exit abort 怎么办?

[复制链接]
发表于 2016-3-20 19:00:00 | 显示全部楼层 |阅读模式

DCL程序:
yxp:dialog{label="画圆斜坡的数据输入";
:column{
:edit_box{label="起点(x)=";key="XB";edit_limit=40;edit_width=10;value=0;}
:edit_box{label="    (y)=";key="YB";edit_limit=40;edit_width=10;value=0;}
:edit_box{label="中点(x)=";key="XM";edit_limit=40;edit_width=10;value=0;}
:edit_box{label="    (y)=";key="YM";edit_limit=40;edit_width=10;value=0;}
:edit_box{label="终点(x)=";key="XE";edit_limit=40;edit_width=10;value=0;}
:edit_box{label="    (y)=";key="YE";edit_limit=40;edit_width=10;value=0;}
}
:boxed_radio_row{label="比例尺";
:row{:radio_button{label="1:500";key="S05";valuse=0;}
radio_button{label="1:1000";key="S1";valuse=0;}
radio_button{label="1:2000";key="S2";valuse=0;}}}
:row{label="左侧或右侧且是否加固";
:toggle{label="左";key="L";value=0;}
:toggle{label="右";key="R";value=0;}
:toggle{label="固";key="Y";value=0;}}
ok_cancel;
}

lsp程序:
(defun getile()                                       ;从DCL控件中获取编辑框中当前值得子程序
  (setq xb (atof(get_tile"XB")))                      ;获取起点坐标
    (setq yb (atof(get_tile"YB")))
    (setq xm (atof(get_tile"XM")))
    (setq ym (atof(get_tile"YM")))                    ;获取中间点坐标
    (setq xe (atof(get_tile"XE")))                    ;获取终点坐标
    (setq ye (atof(get_tile"YE")))
  );end subroutine

(defun c:yxp()                                        ;加载DCL文件
  (setq id(load_dialog "yxp.dcl"))
  (if(< id 0) (exit))
  (if(not(new_dialog "yxp" id)) (exit))

  (action_tile "S05" "(setq S 0.5)")                 
   (action_tile "S1" "(setq S 1.0)")
   (action_tile "S2" "(setq S 2.0)")
  (action_tile "L" "(setq LR 1)")
   (action_tile "R" "(setq LR 2)")
   (action_tile "Y" "(setq JG 3)")

  (action_tile "accept" "(getile) (done_dialog 1)")  ;定义控件动作函数
  (start_dialog)                                     ;激活对话框
  (unload_dialog id)                                 ;下载对话框

                                                     ;以上对话框驱动程序写完
  
(setq PB(list xb yb) PM(list xm ym) PE(list xe ye))
  (command "point"PB  "point"PM "point"PE "")
  (setq D(distance PB PE))
  (setq A1(angle PB PM) A2(angle PB PE) A3(angle PE PB) A4(angle PE PM))
  (setq FB (- A1 A2) FE(- A3 A4) PI2(* pi 2))
  (if(< FB 0) (setq FB(+ FB PI2)))
  (if(< FE 0) (setq FE(+ FE PI2)))
  (setq F(+ FB FE) R(/ D(*(sin F) 2)))
  (setq F1(- (/ pi 2) F) ABC (-A2 F1))
  (if(< ABC 0)(setq ABC(+ ABC PI2)))
  (setq C (polar PB ABC R))
  (command "arc" PB PM PE "")
  (set DF(/(* 4 S) R) DF2(/ DF 2))
  (setq ACB(angle C PB) ACE(angle C PE))
  (setq FF 0)
  (while (<(+ FF DF) (* F 2))
    (setq FF(+ FF DF))
    (setq AP2(- ACB FF) AP1(+ AP2 DF2))
    (if(= LR 1) (setq R3(+ R(* 0.5 S)) R4(+ R(* 2S)) R5(+ R S)))
     (if(= LR 2) (setq R3(- R(* 0.5 S)) R4(- R(* 2S)) R5(- R S)))
    (setq P1(polar C AP1 R) P3(polar C AP1 R3) P5(polar C AP1 R5))
    (setq P2(polar C AP2 R) P4(polar C AP2 R4))
    (command "line" P1 P3 "") (command "line" P2 P4 "")
    (if(= JG 3) (command "circle" P5(* 0.1 S) ""))
    );end while
  (setq PB1 (polar C ACB R4) PE1(polar C ACE R4))
  (command "line" PB PB1 "") (command "line" PE PE1 "")
(set JG 0)
  (princ)
  );end yxp

刚刚入手LISP,程序是照着书上抄的,但是书上程序中有image控件,我没有打上去,因为没有图。
 楼主| 发表于 2016-3-21 09:39:56 | 显示全部楼层
请教高手。谢谢了。
发表于 2016-3-21 09:59:57 | 显示全部楼层

单单就这个程序的这个提示,实际上并不是错误,而是以这种方式退出,这是exit(quit)函数的正常提示,也就是说,exit函数是使用出错中断方式退出的。
exit退出是最低级的退出方式,正常程序中很少使用,一般只用在一些无法预料的出错时的退出,你的这个程序是示例程序,侧重点应该是对话框的运用,所以使用exit退出是一种“偷懒”的方法。
一般情况下,可以把程序定义成一个个的子函数,然后根据条件进行判别,满足条件则继续,不满足条件则“什么都不做”(退出)。例如:
  1. (defun c:yxp()                                        ;加载DCL文件
  2.   (setq id(load_dialog "yxp.dcl"))
  3.   (if(>= id 0) (yxp_main))                   ;满足条件则执行,否则什么都不做
  4. )

  5. (defun yxp_main()
  6.   (if (new_dialog "yxp" id) (yxp_main1))
  7. )

  8. (defun yxp_main1()
  9.   (action_tile "S05" "(setq S 0.5)")  
  10. ...
  11. )

当然,这是就你的程序做一个示例,也只是方法的一种,在正常条件下,还有其它的方法判断,比如石油while函数循环判断等,这里就不一一叙述了。
没细看你的程序,是不是还有其它错误就不多说了,这里仅仅就exit函数做点解释,希望能对你有用。
发表于 2016-3-21 11:50:53 | 显示全部楼层
本帖最后由 啵浪鼓 于 2016-3-21 12:04 编辑

楼上ll_j讲的非常精辟了,点赞!
exit程序退出显示就是quit / exit abort 方式处理的,想要无声退出可以将这2句改一下就好了
(if(< id 0) (exit))
==>
(if(>= id 0) (yxp_main))


  (if(not(new_dialog "yxp" id)) (exit))
==>
(if (new_dialog "yxp" id) (yxp_main1))
 楼主| 发表于 2016-3-21 11:58:16 | 显示全部楼层
ll_j 发表于 2016-3-21 09:59
单单就这个程序的这个提示,实际上并不是错误,而是以这种方式退出,这是exit(quit)函数的正常提示,也 ...

谢谢了
 楼主| 发表于 2016-3-21 11:58:56 | 显示全部楼层
啵浪鼓 发表于 2016-3-21 11:50
楼上ll_j讲的非常精辟了,点赞!
exit程序退出显示就是quit / exit abort 方式处理的,想要无法退出可以将 ...

谢谢解答。
发表于 2022-7-1 10:05:30 | 显示全部楼层
1)调用函数 load_dialog  DCL 文件加载入内存,并获得标识码dcl_id。
(setq dcl_id (load_dialog "F:/dia.dcl"))  ; 注意符号“/ ”
2)调用 new_dialog
(new_dialog dlgname dcl_id [action [screen-pt]])

dlgname 参数是用于指定对话框的一个字符串,而 dcl_id 参数用于指定 DCL 文件(必须先调用 load_dialog 函数获取其值)。
screen-pt 参数是一个二维点表,它用于指定对话框在屏幕上的位置的 X、Y 坐标。该点通常指定的是对话框的左上角,但它还与平台有关,其值通常用系统单位来表示。如果将其指定为 '(-1 -1),那么打开对话框时它会显示在缺省位置上(即 AutoCAD 的图形屏幕的中心位置)。
如果指定了 screen-pt 参数,就必须指定 action 参数。action 参数是一个字符串,它包含了用来表示缺省动作的一个 AutoLISP 表达式。如果不想定义缺省动作,可以传给 action 参数一个空字符串 ("")。
如果 new_dialog 函数调用成功,它返回 T;否则它返回 nil。
在调用 new_dialog 失败时,调用 start_dialog会导致不可预知的结果。因此必须
检查 new_dialog 的返回值。

(if (not (new_dialog "dia1" dcl_id1))(exit))   ;检查语句示例

3)        若 new_dialog 的返回不是 nil,则调用 start_dialog 来控制 AutoCAD 和用户之间的交互操作。start_dialog 函数显示对话框并接受用户输入。start_dialog 函数不需要参数。
(start_dialog)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-9-29 19:16 , Processed in 0.177832 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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