明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4692|回复: 8

第九章 映射和循环函数

[复制链接]
发表于 2012-11-9 22:14 | 显示全部楼层 |阅读模式
第九章 映射和循环函数
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 值。



    该贴已经同步到 明经通道的微博
发表于 2012-11-10 12:39 | 显示全部楼层
持续关注中!
发表于 2012-11-29 08:59 | 显示全部楼层
这些函数还没用过,努力学习
发表于 2012-12-15 09:14 | 显示全部楼层
这些函数还没用过,努力学习中
发表于 2015-8-11 14:42 | 显示全部楼层
新人学习中
发表于 2017-10-12 15:38 | 显示全部楼层
继续支持....个人这方面的知识还是比较欠缺的,学习了
发表于 2019-10-16 15:02 | 显示全部楼层
这些函数还没用过,努力学习中
发表于 2023-4-8 16:43 | 显示全部楼层
循环函数是很熟悉了 但是 映射这个词第一次接触  好奇
发表于 2023-4-8 17:12 | 显示全部楼层
vl-every这个有点烧脑啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-26 11:04 , Processed in 0.653923 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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