乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 67|回复: 6

[编程交流] 函数(λ。。。??

[复制链接]

33

主题

267

帖子

213

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
197
发表于 2022-7-6 11:12:04 | 显示全部楼层 |阅读模式
有人能帮我理解函数-Lambda组合的目的以及它的作用吗?
 
Lee Mac的示例:
 
  1. (vla-put-TextString
  2.              (car
  3.                (vl-remove-if-not
  4.                  (function
  5.                    (lambda (x) (eq "TREE#" (strcase (vla-get-TagString x)))))
  6.                  
  7.                  (vlax-invoke Obj 'GetAttributes))) (car x))

 
我相信这是为了设置块属性,但我不明白它是如何工作的。。。
 
谢谢
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 11:26:36 | 显示全部楼层
函数vl remove if not将谓词函数与列表参数一起作为参数。
 
vl remove if not将遍历列表参数的每个成员,并通过谓词函数处理每个项,如果谓词函数返回nil,则将删除该项(vl remove if反之亦然)。
 
“函数”是将lambda表达式声明为谓词函数参数,因此不进行计算。与撇号相比,它具有一些性能优势。
 
有关更多信息,请参阅VLIDE帮助文件。
回复

使用道具 举报

33

主题

267

帖子

213

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
197
发表于 2022-7-6 11:33:49 | 显示全部楼层
好的,请说慢点,用小词
 
你能带我看一下这段代码,告诉我它实际上是如何设置属性值的吗?我想我还是不太明白它在做什么
用绳子。
 
这一切的原因是我试图用它在代码的修订版本中设置2个属性(标记ID和植物学)。
我想我已经用以下变量设置了各种值:
 
  1. (while (setq LINE  (car *lst*))
  2.       
  3.    (setq
  4.        x (atof (nth 0 line))
  5.        y (atof (nth 1 line))
  6.        z (atof (nth 2 line))
  7.        bNme (nth 3 line)
  8.        ;;rot (dtr (atof (nth 4 line)))
  9.        ; xscale (atof (nth 4 line))
  10.        ; yscale (atof (nth 5 line))
  11.        tnum (nth 4 line)
  12.        species (nth 5 line)
  13.        canopy (atof (nth 6 line))
  14.    );end setq
  15.       
  16.       
  17. (if (vl-catch-all-error-p
  18.              (setq OBJ
  19.                (vl-catch-all-apply (function vla-InsertBlock)
  20.                  (list spc (vlax-3D-point (list x y z)) bNme 1. 1. 1. *ROT*))))
  21.         
  22.          (princ "\n** Error Inserting Block **")
  23.          (progn
  24.            (vla-put-layer OBJ Lname)
  25.            (vla-put-TextString
  26.               (vl-remove-if-not
  27.                  (function
  28.                    (lambda (tnum) (eq "ID" (strcase (vla-get-TagString tnum)))))
  29.                                    (vlax-invoke Obj 'GetAttributes)) tnum)
  30.                                    
  31.            (vla-put-TextString
  32.               (vl-remove-if-not
  33.                  (function
  34.                    (lambda (botanical) (eq "botanical" (strcase (vla-get-TagString botanical)))))
  35.                                    (vlax-invoke Obj 'GetAttributes)) botanical)
  36.                  
  37.            (if (eq :vlax-true (vla-get-isDynamicBlock obj))
  38.              (progn
  39.              (setq ValLst (mapcar 'cons '("CANOPY")
  40.                     (mapcar
  41.                       (function
  42.                         (lambda (i)
  43.                           (if (equal 0.0 (distof i) 0.0001) "1" i)))
  44.                       (list (cadr LINE) (caddr x) (cadddr x)))))
  45.             
  46.                    (foreach dAtt (vlax-safearray->list
  47.                                (vlax-variant-value
  48.                                  (vla-GetDynamicBlockProperties obj)))
  49.                  (if (setq tag (assoc (strcase (vla-get-propertyName dAtt)) ValLst))
  50.                    (vla-put-value dAtt
  51.                      (vlax-make-variant (cdr tag)                        
  52.                        (vlax-variant-type (vla-get-value dAtt))))))))))
  53.          ;;(princ (strcat "Tree# " (car x)))
  54.        (setq *lst* (cdr *lst*)))

 
我不确定是否正确设置了第二个属性(因为我真的不知道它是如何做到的…)
 
谢谢
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 11:47:25 | 显示全部楼层
Cary,请注意,注意你对别人代码的修改是一种编码礼仪,否则他们的工作就会被玷污。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 11:54:07 | 显示全部楼层
一步一步地:
 
  1. (vlax-invoke <BlockObject> 'GetAttributes)
  2. ==>  (<AttribObject> <AttribObject> <AttribObject> ... <AttribObject>)
  1. (vla-get-TagString <AttribObject>)
  2. ==>  "TAG"
  1. (vl-remove-if-not
  2. (function
  3.    (lambda ( AttribObject )
  4.      (eq "TAGSTRING"
  5.        (strcase
  6.          (vla-get-TagString AttribObject)
  7.        )
  8.      )
  9.    )
  10. )
  11. (vlax-invoke <BlockObject> 'GetAttributes)
  12. )
  13. ==> (<AttribObject>)

 
GetAttributes方法将返回AttributeObject(如果与vlax invoke一起使用,则在列表中),如果没有,则使用vl remove迭代该列表。
 
在谓词函数中测试每个属性对象,并返回结果列表。
回复

使用道具 举报

33

主题

267

帖子

213

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
197
发表于 2022-7-6 12:08:03 | 显示全部楼层
 
非常抱歉:哎呀:
我对编码还是新手
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 12:16:04 | 显示全部楼层
 
不用担心,只要抬起头就行了
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-6 11:44 , Processed in 0.482188 second(s), 66 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表