今天分享一个函数foreach,在编制参数化自动绘图程序的时候,会用到多个变量设定初始数值,刚刚开始我 (setq text 100),dcl的就是 (set_tile "Text1" "2900"),
引用一段LL_J前辈的话:
“函数是 AutoLISP 的灵魂,学习和使用 AutoLISP 的过程,从头至尾都贯穿着函数,
但在我的学习过程中,似乎一直似是而非似非而是,没有一个完整的概念,所以本文
也是个人的学习思考的小结,希望能给初学者一个整体的、朦胧的印象。
没有系统学习过,所以文中难免有理解错误,希望大家能海涵并提出批评指正。
如果把函数比作一道菜,AutoLISP 就是一桌大餐,有人追求的是美味,但我希望
AutoLISP 的爱好者们更追求这每一道菜的制作过程。”
在学习的过程中,有过茫然,有过失望,但在茫茫代码中,你的辛苦会有收获,记得
当年写出第一个代码时,喜悦开心的心情,就不用我说了。
其实我一直在想,写代码是为了什么,难道真是为了完成一个程序的喜悦吗,答案肯
定是否定的,一切都是为了工作,人这一辈子唯有工作挣钱养家停不下来。
抱歉哈,说了一堆不愿意听的,看下面的吧
在函数帮助里面是这样解释这个函数的
将表中的所有成员以指定变量的身份带入表达式求值 (foreach name list [expr...])foreach 函数遍历表,将其中每一个元素依次赋给变量,并对每一个表达式求值。可以指定任意多个表达式。 参数 name 表中元素将被赋给该名称指定的变量。 list 由要求值的元素组成的表。 expr 要对 list 中元素求值的表达式。 返回值 最后一次计算 expr 的结果。如果未指定 expr,foreach 返回 nil。
帮助里面的例子:我们只讲数值,我只用到数值,其他的应用需要前辈补充
(foreach n '(a b c) (print n))
返回
A
B
C C
相当于
(print a)
(print b) (print c)理解一下,也就是
(函数foreach 新的变量n 表'(a b c) (分别打印表中的数值print 新的变量(对原表中的数值进行更新后的值) n))
讲一个直观的例子,相信大家都遇到多次偏移的时候
先来一个分段的,加强理解这个函数运行的过程
- (defun c:tt (/ n)
- (foreach n '(50 100 300 600)
- (command "offset" n
- (entsel "\n选择需要偏移的对象")
- (getpoint "\n指定偏移方向一点") "")
- )
- (princ)
- )
代码执行需要重复4次,选择4次对象,4次指定偏移点,偏移的距离就是 '(50 100 300 600)也就是说这个函数是以表中的个数来的。
问题来了,能不能点一次,自动偏移4次,当然是可以的,看下面
- (defun c:tt2 (/ en pt n)
- (setq en (entsel "\n选择需要偏移的对象")
- pt (getpoint "\n指定偏移方向一点"))
- (foreach n '(50 100 300 600)
- (command "offset" n en pt "");此处可以和上面的对比
- )
- (princ)
- )
执行结果
这里已经能实现,点一次对象,偏移不同距离,其实foreach还有很多的妙用,论坛里面有不少
看到这里我相信你已经能理解这个函数的用法和运行的方式了,有的人说了,你这个距离都是以开始线为基准的
我需要的是已偏移后的线为基准(此处的线仅是代表),好的,再继续看下面
- (defun c:tt3 (/ en pt n)
- (setq en (entsel "\n选择需要偏移的对象")
- pt (getpoint "\n指定偏移方向一点"))
- (setq x 0);先设定为0
- (foreach n '(50 100 300 600)
- (setq x (+ n x));这里意思就是在原有表中1数据+X=0+50,以此类推表2=50+100、表3......
- (command "offset" x en pt "");此处可以和上面的对比
- )
- (princ)
- )
执行结果
论坛里面有很多的前辈,免费发布自己的函数,他们真的是无私的人,给他们点赞,别看就几行代码,给你带来的是经济效益,也有可能成为你
养家的资本(哈哈,又说到这个上面了)。
最后我把源码放上来,不想复制的就下载
|