yrgui 发表于 2008-10-4 09:49

我们一起学习lisp开发(第三辑)

第三辑来做个机械图里面标注各种粗糙度的程序,我非常喜欢,总是爱不释手。
这一辑的难度和第二辑比起来提高了不少,二楼再贴上设计思路吧。该程序主要是 if 和 progn 两个函数,先看代码:
;;;定义rough命令标注各种粗糙度
;;;当粗糙度值指定为零时,标注毛面
(defun c:rough (/ v1 v2 p0 p01 p1 p2 p3 p4 h h1 s al alf alf1)
   (setq v1 (getvar "cmdecho"));获取cmdecho当前值
   (setq v2 (getvar "osmode"));获取当前值
   (setvar "cmdecho" 0);关掉命令提示
   (setvar "osmode" 0);关闭光标标记
   (setq p0 (getpoint "\n指定插入点:"));指定符号插入点
   (setq p01 (osnap p0 "nea"));nea捕捉(*)
   (setq h (getdist "\n粗糙度数值字高<3.5>: "))
   (if (not h) (setq h 3.5));直接回车(not h)为“T”赋予推荐字高
   (setq h1 (* h 1.61658))
   (if p01;条件p01
       (progn;捕捉到最近点
          (setq alf1 (angle p01 p0));(*)
          (setq p0 p01)
          (setq alf (- alf1 (* 0.5 pi)));角alf1减去90度
       )
       (progn;未捕捉到最近点
          (setq alf (getangle p0 "\n旋转角<0.0>: "))
          (if (not alf) (setq alf 0.0));回车接受推荐值
       )
   );if
   (setq al (+ alf (/ pi 3)))
   (setq p1 (polar p0 al (* 2 h1)))
   (setq p2 (polar p0 al h1))
   (setq al (+ alf (/ pi 1.5)))
   (setq p3 (polar p0 al h1))
   (setq al (+ alf (* 0.5 pi)))
   (setq p4 (polar p0 al (* 1.4 h1)))
   (setq s (getstring "\n输入表面粗糙度的值<6.3>: "))
   (if (= 0 (strlen s)) (setq s "6.3"));回车接受默认值
   (setq alf (/ (* alf 180) pi));弧度转角度
   (setq alf (cond;分支函数
               ( (and (> alf 90) (<= 270)) (- alf 180) );
               ( (> 270)                   (- alf 360) );
               ( (= alf -90)                   90 );
               ( t alf);
             );cond
   )
   (if (= s "0")
       (progn;标注非加工表面
          (setq p4 (polar p0 al (* 0.933333 h)));p4为符号中的圆心
          (command "line" p1 p0 p3 "")
          (command "circle" p4 (* 0.466666 h))
       )
       (progn;标注加工表面
          (command "line" p2 p3 p0 p1 "")
          (if (> (strlen s) 3);如果字符多于三个
            (setq p4 (polar p4 (+ al (* 0.5 pi)) (* 0.4 h)));点p4左移
          )
          (command "text" "m" p4 h alf s);“m”为中点对齐文字
       )
   )
   ;;恢复环境设置
   (setvar "cmdecho" v1)
   (setvar "osmode" v2)
   (princ);静默退出
)
这里对两个函数稍作解析:
if函数语法是 (if判断条件 条件为真执行语句 [条件为假执行语句]),中括号的意思就是该项可有可无,条件为假就是判断条件的值为 nil ,执行语句只能是一句,多句时用progn函数将它们拼成一条,progn的语法是 (progn [一系列语句])
写程序时注意简略得当,没必要去将一个小程序作的非常完美、无懈可击,其实只要不影响使用,能完成所要任务就可以了




[ 本帖最后由 yrgui 于 2008-10-4 09:51 编辑 ]

yrgui 发表于 2008-10-4 10:14

如下图所示当程序提示指点时,我们在红色直线上方附近单击一点p0,(setq p01 (osnap p0 "nea"))通过最近捕捉,当然得到的p01是p0到红色直线的垂足,这样旋转方向就能自动确定下来了。如果在空白处点选,由于没捕捉到对象,p0为 nil 执行:
(progn;未捕捉到最近点
(setq alf (getangle p0 "\n旋转角<0.0>: "))
(if (not alf) (setq alf 0.0));回车接受推荐值
)
下面这两句就是当我们给粗糙度的值为0时,由后面的if 语句控制程序走向标注毛面,直接回车,字符串s的长度为零,所以给各常用值作为默认。
(setq s (getstring "\n输入表面粗糙度的值<6.3>: "))
(if (= 0 (strlen s)) (setq s "6.3"));回车接受默认值

tmfly 发表于 2008-10-4 16:01

好的东西,先下来用用!

kent1968 发表于 2008-10-6 14:39

好的东西好的东西

jjproe 发表于 2008-10-10 00:06

标注各种粗糙度的程序,怎样装上cad?谢谢!!!!

yrgui 发表于 2008-10-10 13:20

原帖由 jjproe 于 2008-10-10 00:06 发表 http://askcad.com/bbs/images/common/back.gif
标注各种粗糙度的程序,怎样装上cad?谢谢!!!!
第一辑里都说了,把附件解压得到LSP格式文件。在命令行执行appload命令,找到该文件加载后rough命令就可以用了。

tufeiabcd 发表于 2008-10-10 16:33

这种帖子怎么没给奖励呢。。。。以后得做一个专辑。。。

╭╀‰虫子╮ 发表于 2008-12-13 22:30

真的,是好东西.跟着入门拉

心灵深处一号 发表于 2008-12-17 19:48

这么方便 用这样标出来的标准 肯定很有序标准

这么方便    用这样标出来的标准肯定很有序标准

he03cs 发表于 2008-12-18 00:09

可以把这个程序作为一个按钮工具挂在系统中,每次画图时自动加载、使用。
我的AutoCAD里就是这样做的。

wylong2009 发表于 2008-12-30 11:21

真的,是好东西.跟着入门

slh8410 发表于 2009-3-19 10:56

正需要呐,非常感谢

xhqwuhun 发表于 2009-4-25 10:31

真的不错的lisp教程.学习了.谢谢.

dotwu 发表于 2009-4-25 10:41

原帖由 he03cs 于 2008-12-18 00:09 发表 http://www.askcad.com/bbs/images/common/back.gif
可以把这个程序作为一个按钮工具挂在系统中,每次画图时自动加载、使用。
我的AutoCAD里就是这样做的。


等着你这样的高手来做,呵呵.

ZJW研究 发表于 2009-7-23 17:59

建议LZ多占楼,动态效果有关问题

原帖由 心灵深处一号 于 2008-12-17 19:48 发表 http://www.askcad.com/bbs/images/common/back.gif
这么方便    用这样标出来的标准肯定很有序标准


我会常来看的,这位高手发帖时建议多占几楼,好补充的!还有LZ发的动态的东东是怎么搞成的?谢谢!!!
【:victory: 】
页: [1] 2 3
查看完整版本: 我们一起学习lisp开发(第三辑)