yrgui 发表于 2008-10-8 16:22

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

这一辑讲两个小程序,都和图块有关,涉及到选择集、符号表、对象数据表、文件读写等知识点,第一个是做一个能修改图块子对象的命令:CBC,先看代码
;;;改变对象颜色,包括图块内的子对象
(defun c:cbc (/ e1 e2 e3 c1 c2 c3)
(setq e1 (nentsel));选取对象,函数entsel可以选到子对象
(if e1
    (progn;选到对象执行
      (setq c1 (getint "\n输入新颜色号0-256: "))
      (setq c2 (cons 62 c1));组成新的颜色数据项点对
      (setq e2 (entget (car e1)));取出对象数据序列
      (setq c3 (assoc 62 e2));取出
      (if c3;判断旧的颜色数据项的有无
        (setq e2 (subst c2 c3 e2));置换旧的颜色数据项
        (setq e2 (cons c2 e2));若无则加入颜色数据项
      )
      (entmod e2);更新对象
      (setq e3 (car (cadddr e1)));取出住对象名称
      (if e3
        (entupd e3);若有主对象则更新
      )
    );结束progn
    (princ "\n未选取到对象。");未选到对象发出提示
);结束if e1
(princ)
)
如图面上有一些螺母块,我们想直接把它的两条红色中心线改为白色,或绿色,或随层都可以了。这里有几个常用函数(nentsel)选取对象或子对象、(entget ename)获得图元对象数据表、(cons 参数1 参数2)如果两个参数都是原子,则组点对返回;如果参数2是表,则将参数1作为一元素加到表中,返回新表。

第二个是统计图块使用量的程序,可以轻松统计出图中你用了多少个各种图块,并将结果写入文件。代码如下:
;;;计算图文件内所有图快数目。并做成数据序列
(defun cb(/ bt b1 c1 s1)
(setq bt '() );建立空的数据序列
(setq b1 (tblnext "block" t));读取图快表的第一笔数据
(while b1
    (setq c1 (cdr (assoc 2 b1)));取出符号表内图快名称
    (if (setq s1 (ssget "x" (list (cons 0 "insert") (cons 2 c1))))
      (setq bt (append bt (list (list c1 (sslength s1)))))
      (setq bt (append bt (list (list c1 0))))
    );计算选择集内的图快数,将结果组成元素序列加到数据序列内
    (setq b1 (tblnext "block"));读取图快符号表下一笔数据
);while
;(eval bt);回传值
;本想用eval回传值,可是在04/05的版本里总是出错,所以就改用setq
(setq bt bt)
)

;;;将图块数据写成文本文件
(defun c:wbd(/ blks cdt dname dpath rpt f1 i b1 n1)
(setq blks (cb);调用cb函数,计算图快数目
        cdt (rtos (getvar "cdate") 2 4);当前时间
        dname (getvar "dwgname");图文件名
        dpath (getvar "dwgprefix");图文件路径
        rpt (strcat dpath (substr dname 1 (- (strlen dname) 4)) "_blks.txt")
)
(princ (strcat "\n创建报表: " rpt))
(setq f1 (open rpt "w"));打开表表文件进行写入
(princ (strcat "报表文件名路径: " rpt "\n") f1)
(princ (strcat "产生时间: " cdt "\n") f1)
(princ (strcat "图文件位置: " dpath dname "\n") f1)
(setq i 0);计数器
(repeat (length blks);重复循环
    (setq b1 (nth i blks));取出第i个序列元素
    (setq n1 (itoa (cadr b1)));将插入数目转成字符
    (repeat (- 6 (strlen n1))
      (setq n1 (strcat "" n1));补空格
    )
    (princ (strcat (car b1) "\n") f1);写出图块名称
    (princ (strcat n1 "\n") f1);写出数量
    (setq i (1+ i));计数器加一
)
(close f1);关闭文件
(princ "\n完成。")
(princ)
)
这个程序稍复杂一点,静下来慢慢看也能看懂,注解都比较详细。看懂程序不是目的,要亲自动手试着去写去调试,函数语法就能很快记住,自己也会越来越有兴趣。
到这一辑纯AutoLISP的学习就差不多了,其实只用AutoLISP就能做出很多实用程序,它的函数简短,常用功能齐全,特别适合以软件应用为主的用户。后面应该是Visual LISP、ActiveX、反应器、对话框(AutoLISP驱动),这些开发进阶的学习。





[ 本帖最后由 yrgui 于 2008-10-8 16:25 编辑 ]

xhq1954425 发表于 2008-10-9 12:11

支持!:victory:

wangjial 发表于 2008-10-9 13:20

怎么没有第二辑和第三辑?

kent1968 发表于 2008-10-9 15:28

ddddddddddddddd

天之宇海之翔 发表于 2008-10-9 17:21

支持,希望楼主能从最基本的教起,一开始接触的这么复杂的,消化不了

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

原帖由 wangjial 于 2008-10-9 13:20 发表 http://askcad.com/bbs/images/common/back.gif
怎么没有第二辑和第三辑?
点击我的户名,到我空间找,方便,呵呵

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

原帖由 天之宇海之翔 于 2008-10-9 17:21 发表 http://askcad.com/bbs/images/common/back.gif
支持,希望楼主能从最基本的教起,一开始接触的这么复杂的,消化不了
说"教"真不敢当,我也是"现炒现卖"。当然只看我发表的这几辑就能学到LISP开发是不大可能的,要学会开发,肯定需要私下下功夫。我这只能算是一个引导,希望能提起大家的学习兴趣。(各辑都是按规律布置,如果前面的都还没消化,就来研读后面的肯定有难度。)

liuyu0125 发表于 2008-10-13 14:38

支持!期待楼主的作品

aajiji918 发表于 2010-7-13 12:19

看看,正需要这个功能

anping888 发表于 2010-8-20 09:59

支持!期待楼主的作品

hktk1994 发表于 2010-8-31 14:31

好东西,多多益善。

麦子爱睡觉 发表于 2010-9-22 00:13

支持楼主!!:victory:

464926236 发表于 2010-9-22 01:05

:victory: 好的 顶

dkj0322 发表于 2010-10-23 08:56

谢谢楼主的分享!好好学习下

670821306 发表于 2010-10-23 11:54

还是要靠慢慢积累:victory:
页: [1] 2
查看完整版本: 我们一起学习lisp开发(第四辑)