本帖最后由 ggdlove 于 2013-12-17 00:44 编辑
发一个同心圆绘制程序,功能基本实现,但并不是很完美。
发现一个问题,就是没有办法捕获command出错的具体内容。
于是程序中还有个小问题,就是在点选到同心圆圆心的时候,由于发生半径为0的错误,只有退出了,没有办法捕获该错误,希望有兴趣的可以改进一下,以使他更加的完美。
入门级选手,在此抛砖引玉。- ;;*********************************************************************
- ;;同心圆绘制程序 *
- ;; *
- ;;*********************************************************************
- (defun C:CC( / err_re cmd_bak err_bak *error* ii tmp_en pt1 pt2 en tmp)
- ;;定义局部错误处理函数,处理来自command的错误
- (defun *error*(msg)
- ;;取消command命令
- (command)
- ;;当变量备份中有值的时候,恢复系统变量
- (and err_bak (setvar "errno" err_bak))
- (and cmd_bak (setvar "cmdecho" cmd_bak))
- (princ)
- )
- ;;相关的系统变量备份
- (setq err_bak (getvar "errno"))
- (setq cmd_bak (getvar "cmdecho"))
- (setvar "cmdecho" 0)
- ;;主程序开始
- (setq ii 0)
- ;;选取同心圆弧、圆<或指定圆心>
- (while (= ii 0)
- (setvar "errno" 0)
- (setq tmp_en (vl-catch-all-apply 'entsel (list "\n选取同心圆弧、圆<或指定圆心>:")))
- (setq err_re (vl-catch-all-error-p tmp_en))
- (cond
- ((= err_re T) (setq ii 1));;返回错误时,函数取消
- ((= (getvar "errno") 52) (setq ii 2));;选择为空时,即点击右键或者空格键时,跳到选取圆心步骤
- ((= (getvar "errno") 7) (setq ii 0));;选取失败时,返回继续选取图元
- ;;选取到图元,并且图元为圆弧或者圆时,取出其中的圆心点,并赋给PT1,跳到选取终点
- ((or (= (cdr (assoc 0 (entget (car tmp_en)))) "ARC") (= (cdr (assoc 0 (entget (car tmp_en)))) "CIRCLE"))
- (progn
- (setq pt1 (cdr (assoc 10 (entget (car tmp_en)))))
- (setq ii 3)
- )
- )
- ;;以上都不是是的时候,返回继续选取图元
- (T (setq ii 0))
- )
- )
- ;;选取圆心点
- (while (= ii 2)
- (setvar "errno" 0)
- (setq pt1 (vl-catch-all-apply 'getpoint (list "\n指定同心圆的圆心:")))
- (setq err_re (vl-catch-all-error-p pt1))
- (cond
- ((= err_re T) (setq ii 1));;返回错误时,函数取消
- ((= (getvar "errno") 52) (setq ii 2));;选取为空时,返回继续选取圆心点
- ((/= pt1 nil) (setq ii 3));;选取到点后,跳到选取终点
- ;;以上都不是的时候,返回继续选取圆心点
- (T (setq ii 2))
- )
- )
- ;;选取到圆心后,重复执行圆的命令
- (while (= ii 3)
- ;;监视最后一个图元
- (setq en (entlast))
- ;;绘制圆
- (setvar "cmdecho" 0)
- (command "_.circle" "non")
- ;;打开命令提示,使用圆的提示
- (setvar "cmdecho" 1)
- (command pt1 pause)
- ;;对于输入D的情况下,即最后一个图元没有变的情况,需要再给一个pause命令
- (and
- (equal en (entlast))
- (command pause)
- )
- )
- ;;系统变量恢复初始值
- (and err_bak (setvar "errno" err_bak))
- (and cmd_bak (setvar "cmdecho" cmd_bak))
- (princ)
- )
温馨提示:
提示选择圆弧、圆时,点击鼠标右键或者空格键,可以切换到选择圆心点的模式。
|