明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2123|回复: 3

[源码] 同心圆绘制程序

[复制链接]
发表于 2013-12-17 00:06:19 | 显示全部楼层 |阅读模式
本帖最后由 ggdlove 于 2013-12-17 00:44 编辑

发一个同心圆绘制程序,功能基本实现,但并不是很完美。
发现一个问题,就是没有办法捕获command出错的具体内容。



于是程序中还有个小问题,就是在点选到同心圆圆心的时候,由于发生半径为0的错误,只有退出了,没有办法捕获该错误,希望有兴趣的可以改进一下,以使他更加的完美。

入门级选手,在此抛砖引玉。
  1. ;;*********************************************************************
  2. ;;同心圆绘制程序                                                      *
  3. ;;                                                                    *
  4. ;;*********************************************************************
  5. (defun C:CC( / err_re cmd_bak err_bak *error* ii tmp_en pt1 pt2 en tmp)
  6.   ;;定义局部错误处理函数,处理来自command的错误
  7.   (defun *error*(msg)
  8.     ;;取消command命令
  9.     (command)
  10.     ;;当变量备份中有值的时候,恢复系统变量
  11.     (and err_bak (setvar "errno" err_bak))
  12.     (and cmd_bak (setvar "cmdecho" cmd_bak))
  13.     (princ)
  14.     )
  15.   ;;相关的系统变量备份
  16.   (setq err_bak (getvar "errno"))
  17.   (setq cmd_bak (getvar "cmdecho"))
  18.   (setvar "cmdecho" 0)
  19.   ;;主程序开始
  20.   (setq ii 0)
  21.   ;;选取同心圆弧、圆<或指定圆心>
  22.   (while (= ii 0)
  23.     (setvar "errno" 0)
  24.     (setq tmp_en (vl-catch-all-apply 'entsel (list "\n选取同心圆弧、圆<或指定圆心>:")))
  25.     (setq err_re (vl-catch-all-error-p tmp_en))
  26.     (cond
  27.       ((= err_re T) (setq ii 1));;返回错误时,函数取消
  28.       ((= (getvar "errno") 52) (setq ii 2));;选择为空时,即点击右键或者空格键时,跳到选取圆心步骤
  29.       ((= (getvar "errno") 7) (setq ii 0));;选取失败时,返回继续选取图元
  30.       ;;选取到图元,并且图元为圆弧或者圆时,取出其中的圆心点,并赋给PT1,跳到选取终点
  31.       ((or (= (cdr (assoc 0 (entget (car tmp_en)))) "ARC") (= (cdr (assoc 0 (entget (car tmp_en)))) "CIRCLE"))
  32.        (progn
  33.    (setq pt1 (cdr (assoc 10 (entget (car tmp_en)))))
  34.    (setq ii 3)
  35.    )
  36.        )
  37.       ;;以上都不是是的时候,返回继续选取图元
  38.       (T (setq ii 0))
  39.       )
  40.     )
  41.   ;;选取圆心点
  42.   (while (= ii 2)
  43.     (setvar "errno" 0)
  44.     (setq pt1 (vl-catch-all-apply 'getpoint (list "\n指定同心圆的圆心:")))
  45.     (setq err_re (vl-catch-all-error-p pt1))
  46.     (cond
  47.       ((= err_re T) (setq ii 1));;返回错误时,函数取消
  48.       ((= (getvar "errno") 52) (setq ii 2));;选取为空时,返回继续选取圆心点
  49.       ((/= pt1 nil) (setq ii 3));;选取到点后,跳到选取终点
  50.       ;;以上都不是的时候,返回继续选取圆心点
  51.       (T (setq ii 2))
  52.       )
  53.     )
  54.   ;;选取到圆心后,重复执行圆的命令
  55.   (while (= ii 3)
  56.     ;;监视最后一个图元
  57.     (setq en (entlast))
  58.     ;;绘制圆
  59.     (setvar "cmdecho" 0)
  60.     (command "_.circle" "non")
  61.     ;;打开命令提示,使用圆的提示
  62.     (setvar "cmdecho" 1)
  63.     (command pt1 pause)
  64.     ;;对于输入D的情况下,即最后一个图元没有变的情况,需要再给一个pause命令
  65.     (and
  66.       (equal en (entlast))
  67.       (command pause)
  68.       )
  69.     )
  70.   ;;系统变量恢复初始值
  71.   (and err_bak (setvar "errno" err_bak))
  72.   (and cmd_bak (setvar "cmdecho" cmd_bak))
  73.   (princ)
  74.   )
温馨提示:
提示选择圆弧、圆时,点击鼠标右键或者空格键,可以切换到选择圆心点的模式。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

本帖被以下淘专辑推荐:

发表于 2013-12-17 12:18:28 | 显示全部楼层
看着挺不错的,不过用处不太大
 楼主| 发表于 2013-12-17 15:44:45 | 显示全部楼层
duanshui83 发表于 2013-12-17 12:18
看着挺不错的,不过用处不太大

如果需要绘制几十个同心圆的时候,还是能派上用场的。
这个东西是各取所需
发表于 2015-4-16 13:35:42 | 显示全部楼层
看起来不错,赞!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-16 22:48 , Processed in 0.191754 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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