明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2175|回复: 11

[经验] 发个帖子 签个到 循环结构拙见,望大佬继续补全

[复制链接]
发表于 2022-2-22 22:10:58 | 显示全部楼层 |阅读模式
本帖最后由 xj6019 于 2022-3-20 10:10 编辑

接触lisp也有点时间了,从啥也不会,到能玩点很简单的,也是一路跌跌撞撞,整理了一部分常见的循环结构,给现在和未来玩lisp的朋友们一个学习的参照吧,几个结构直接将自己的单个功能代码套里面就可以用,大佬请无视,因为确实算是低级的整理了,但是看论坛里好像也没有单独整理的,就发出来玩一下吧,也希望大佬有其他好的方法继续补充:


(defun c:NM (/ i s1 ss)  ;常规循环结构1
  (setq i -1)
  (if (setq ss (ssget ":S"(list '(0 . "*TEXT")(cons 8 "图层"))))
    (while (and(setq s1 (ssname ss (setq i (1+ i)))))               
                        (vla-put-Color  (Vlax-Ename->Vla-Object s1) 2) ;单个图元处理的函数
                )
  )
        (princ)
)
(defun c:NM (/ en i n ss)  ;常规循环结构2
        (if (setq ss (ssget ":S"(list '(0 . "*TEXT")(cons 8 "图层"))))
                (progn
                        (repeat (setq n (sslength ss))
                                (setq en (ssname ss (setq n (1- n))))
                                (vla-put-Color  (Vlax-Ename->Vla-Object en) 2) ;单个图元处理的函数
                        )
                )
        )
        (princ)
)
(defun c:NM (/ ss doc) ;VL循环结构


  (vl-load-com)
  (setq  doc(vla-get-ActiveDocument(vlax-get-acad-object)))
        (if(setq ss (ssget ":S"(list '(0 . "*TEXT"))))
                (vlax-for x (vla-get-ActiveSelectionSet doc)
                        (vla-put-Color  x 2) ;单个图元处理的函数
                )
        )
        (princ)
)
(defun c:NM(/ lst ss ss2list) ;图元表mapcar循环结构
        (defun ss2list (SS)(vl-remove-if-not '(lambda(x)(= 'ENAME (type x))) (mapcar 'cadr (ssnamex SS))))
        (if (setq lst (ss2list(setq ss (ssget ":S"(list '(0 . "*TEXT")(cons 8 "图层"))))))
                (mapcar '(lambda(a)   
                                                         (vla-put-Color  (Vlax-Ename->Vla-Object a) 2) ;单个图元处理的函数
                                                 )        
                        lst)
        )
        (princ)
)




(defun c:NM (/ ss) ;自定义循环结构
        (xj-ssfun (setq ss (ssget ":S"(list '(0 . "*TEXT")(cons 8 "图层"))))
                (eval '(lambda(a)
                                                 (vla-put-Color  (Vlax-Ename->Vla-Object a) 2) ;单个图元处理的函数
                                         )
                )
        )
        (princ)
)


自定义循环的子函数:
        (defun xj-ssfun(ss fun / lst ss2list)
                (defun ss2list (SS)(vl-remove-if-not '(lambda(x)(= 'ENAME (type x))) (mapcar 'cadr (ssnamex SS))))
                (if (setq lst (ss2list ss))
                        (mapcar '(lambda(a) (fun a))      
                                lst)
                )
                (princ)
        )
















本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 5明经币 +5 收起 理由
Bao_lai + 1 很给力!
xmq1103 + 1 很给力!
bssurvey + 1 赞一个!
USER2128 + 1 赞一个!
start4444 + 1 赞一个!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2023-8-2 11:56:33 | 显示全部楼层
本帖最后由 baitang36 于 2023-8-2 11:57 编辑

楼主研究的很仔细,其实只有前面三个是真的循环,后面的mapcar是个函数,fas中没有repeat while vlax-for这三个函数的,这三个都是用if和goto配合来实现的。
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2022-2-22 22:42:45 | 显示全部楼层
自定义循环的子函数:
        (defun xj-ssfun(ss fun / lst ss2list)
                (defun ss2list (SS)(vl-remove-if-not '(lambda(x)(= 'ENAME (type x))) (mapcar 'cadr (ssnamex SS))))
                (if (setq lst (ss2list ss))
                        (mapcar '(lambda(a) (fun a))       
                                lst)
                )
                (princ)
        )
发表于 2022-2-23 10:41:18 | 显示全部楼层
本帖最后由 e2002 于 2022-2-23 10:50 编辑

如果对list的items遍历需要返回1个对应的处理结果list,那就 mapcar最合适;如果需要返回的是各种需求的各种不同的结果,那就 foreach(vlax-for适用于vla对象的集合的遍历)
repeat适用于明确的知道或者能计算出循环次数的情况,
while适用于不确定循环次数(或不想去计算循环次数),是否循环下去依赖于某种条件的情况(AutoLISP 一般常用 while...do 形式,do...while这种可以换个写法用 while bLoop...替代)

AutoLISP的  cond 与 C 的 switch case 有差异,case结束后不会进入下一个case,所以不需要有 break;
 楼主| 发表于 2022-2-22 22:15:52 | 显示全部楼层
本帖最后由 xj6019 于 2022-2-23 13:23 编辑

我本人比较笨,全融会贯通的写函数现在也还是不太行,所以习惯性的整理一些常见的函数结构,遇到什么情况就把对应的函数,堆起来,这几种循环结构就是学习中积累下来的,对于想快速玩转代码的朋友可以尝试一下这种思路,就是太死板,适合懒人思维的人,有能力的尽量函数从基础学起来,慢慢积累经验,比我这样的肯定要好的多





 楼主| 发表于 2022-2-23 11:00:17 | 显示全部楼层
e2002 发表于 2022-2-23 10:41
如果对list的items遍历需要返回1个对应的处理结果list,那就 mapcar最合适;如果需要返回的是各种需求的各 ...

感谢版主点评,确实以上每种写法还能有其他变种,个人学习中,以上整理出来的,感觉分别是一个类种了吧,类种之外还能细化出其他的变种写法,那就是自由发挥的空间了。这样搞一下方便直接套用,适合我这种小白类人群的玩法
 楼主| 发表于 2022-2-23 13:19:19 | 显示全部楼层
本帖最后由 xj6019 于 2022-2-23 13:21 编辑

附件内容与帖子内容完全一致,大家可以直接复制论坛文字,可以别付币下文件了。并且发现一奇怪的现象,明经币扣了别人的,我的也没增长,论坛的bug吗?
发表于 2022-2-23 13:42:26 | 显示全部楼层
谢谢分享,自定义循环结构没给自定义函数
 楼主| 发表于 2022-2-23 14:59:27 | 显示全部楼层
cghdy 发表于 2022-2-23 13:42
谢谢分享,自定义循环结构没给自定义函数

没仔细看吧    去看3楼

评分

参与人数 1明经币 +1 收起 理由
xmq1103 + 1 赞一个!

查看全部评分

发表于 2022-2-23 17:23:34 | 显示全部楼层
xj6019 发表于 2022-2-23 14:59
没仔细看吧    去看3楼

哦哦,谢谢,你这分享还挺别致的
发表于 2022-2-25 21:43:08 | 显示全部楼层
哦哦,谢谢,你这分享还挺别致的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-17 00:36 , Processed in 0.189068 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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