- 积分
- 7871
- 明经币
- 个
- 注册时间
- 2002-1-27
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
第九章 映射和循环函数
AutoLISP提供了大量强大的映射和循环函数,如(while)、(foreach)、(mapcar)和(apply)。而Visual LISP也增加了一些更适合用于与ActiveX集合对象的函数。这些函数包括有(vlax-for)、(vl-every)和(vlax-map-collection)等等。
(vlax-map-collection object function)
应用function到集合对象的成员(对象),如果对象不是集合,则生成错误。
参数:
Object 代表集合的vla对象。
Function 用于对象的符号或lambda表达式。
示例:
(setq docs (vla-get-documents (vlax-get-acad-object)))
(vlax-map-collection docs ‘vlax-dump-object)
这将重复每个已打开文件并列表所有特性...
; IAcadDocument: An AutoCAD drawing
; 特性值:
; Active (RO) = -1
; ActiveDimStyle = #<VLA-OBJECT IAcadDimStyle 046bb644>
; ActiveLayer = #<VLA-OBJECT IAcadLayer 046bbd84>
; ActiveLayout = #<VLA-OBJECT IAcadLayout 046b8a64>
; ActiveLinetype = #<VLA-OBJECT IAcadLineType 046b89b4>
… 还有其它…
(vlax-for symbol collection [expression1 [expression2]]…)
循环集合的成员对象并对每一成员对象执行语句。如果第二个参数不是集合对象,将生成错误。引用的symbol是局部的和临时的,就如(foreach)一样。
参数:
Symbol 指定给集合中每个vla对象的符号。
Collection 代表集合的vla对象
Expressions 求值的一个或多个语句(可选项)
示例:
(setq acad (vlax-get-acad-object))
(setq layers (vla-get-layers (vla-get-activedocument acad)))
(vlax-for eachLayer layers
(princ (vla-get-name eachLayer))
(terpri)
)
这将在命令提示处列出活动图形中所有图层的名称。
(vl-position item list)
找到时返回在list中item的第n个位置。如果list中未找到item,则返回nil。第一元素的位置索引为零(0)。
参数:
Item 任何符号或值。
List 值或符号列表。
示例:
(setq mylist ‘(“A” “B” “C”))
(vl-position “B” mylist) 返回 1
(vl-position “b” mylist) 返回 nil
(vl-every predicate-function list
vl-every 函数将每个表的第一个元素作为参数(如果有多个表则形成参数表)传递给测试函数,然后传递每个表中的下一个元素,以此类推,直至其中一个表到达结束处为止。
参数:
Predicate-function测试函数。它可以是任何一个函数:参数个数和 vl-every 提供的表的个数一致,且对任何用户指定条件返回T。如果 predicate-function 结合每个元素后均返回非 nil 值,函数返回 T,否则返回 nil。
predicate-function 的值可以采用下列格式之一:
■符号(函数名)
■(function(lambda(A1 A2)...))
List(s) 被测试的列表。
示例:
在给定的文件夹中检查大于1024字节的文件:
(vl-every
(function
(lambda (filename)
(> (vl-file-size filename) 1024)
)
)
(vl-directory-files nil nil 1)
)
T
对比两个表...
(vl-every '= '(1 2) '(1 3))
返回 nil
(vl-every '= '(1 2) '(1 2 3))
返回 T
第一个表达式返回 nil,因为 vl-every 比较两个表中的第二个元素,而它们在数值上并不相等。第二个表达式返回 T,因为 vl-every 在处理完较短的表 (1,2) 中所有元素后即停止比较,而直到这时为止,两个表是相等的。如果到达了表的结束处,则 vl-every 返回非 nil 值。
_$ (setq list1 (list 1 2 3 4))
(1 2 3 4)
_$ (setq list2 nil)
nil
_$ (vl-every '= list2 list1)
T
返回值为 T,因为 vl-every 处理 nil 表时,假定已经到达了表的结束处(尽管没有对其中任何元素应用论断)。既然如此,vl-every 将返回非 nil 值。
该贴已经同步到 明经通道的微博 |
|