乐筑天下

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

[编程交流] 搜索列表中的项目

[复制链接]

30

主题

96

帖子

66

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
150
发表于 2022-7-6 08:57:17 | 显示全部楼层 |阅读模式
我想在字符串列表中搜索一个字符串。这怎么可能?
 
在将另一项添加到列表之前,我必须验证它是否已添加到列表中。到目前为止,我在这里。。
 
  1. (defun checklist (blst bname)
  2. (setq h (length blst))
  3. (repeat h
  4.    (if
  5.      (eq h (nth j blst))

 
如果相等,则函数应返回1。
否则,如果bname不在列表中,则函数应返回0。
这是怎么做到的?
回复

使用道具 举报

pBe

32

主题

2722

帖子

2666

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
211
发表于 2022-7-6 09:03:05 | 显示全部楼层
使用“成员”
 
(if(成员itm lst)
(然后)(否则))
)
回复

使用道具 举报

30

主题

96

帖子

66

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
150
发表于 2022-7-6 09:07:15 | 显示全部楼层
太棒了pBe,谢谢你。。。!!!
回复

使用道具 举报

22

主题

326

帖子

185

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
243
发表于 2022-7-6 09:08:47 | 显示全部楼层
vl位置为什么不?请注意,它返回列表中的第一项ok。
Ex(vl位置4’(1 2 3 4 1 2 3 4))=>3
回复

使用道具 举报

30

主题

96

帖子

66

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
150
发表于 2022-7-6 09:13:38 | 显示全部楼层

谁能告诉我下面的代码哪里出错了?写入它是为了提示每个块的计数。我知道BCOUNT命令。学习编码也是一种类似的尝试。
 
  1. (vl-load-com)
  2. (defun c:cntblk(/ allblocks n i blklst blkobj blkobjname)
  3. (setq allblocks (ssget "_X" (List (cons 0 "INSERT"))))
  4. (setq n (sslength allblocks))
  5. (setq i 1)
  6. (setq blklst (ssadd))
  7. (repeat n
  8.    (setq blkobj (ssname allblocks i))
  9.    (setq blkobjname (getEffectiveName blkobj))
  10.    (if (not (eq (member blkobjname blklst) nil))
  11.     (ssadd blkobj blklst)
  12.    )
  13.    (setq i (1+ i))
  14. )
  15. )
  16. (setq j (length blklst))
  17. (setq i 0)
  18. (textscr)
  19. (repeat j
  20. (setq ss(ssget "_X" (list (cons 0 "INSERT")(cons 2 (nth i blklst)))))
  21. (setq cnt (sslength ss))
  22. (prompt (strcat "\n" (nth i blklst) "-----------------" (itoa cnt)))
  23. (setq i (1+ i))
  24. )
  25. (defun getEffectiveName (ent)
  26. (setq obj (vlax-ename->vla-object ent))
  27. (vlax-get obj "EffectiveName")
  28. )
回复

使用道具 举报

30

主题

96

帖子

66

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
150
发表于 2022-7-6 09:16:03 | 显示全部楼层
好啊我知道我在之前的代码中犯了一个错误;
 
  1. (setq blklst (ssadd))

 
通过ssadd尝试创建空白列表
 
但是有人能纠正下面的问题吗?
 
 
  1. (vl-load-com)
  2. (defun c:cntblk(/ allblocks n i blklst blkobj blkobjname)
  3. (setq allblocks (ssget "_X" (List (cons 0 "INSERT"))))
  4. (setq n (sslength allblocks))
  5. (setq i 1)
  6. (repeat n
  7.    (setq blkobj (ssname allblocks i))
  8.    (setq blkobjname (getEffectiveName blkobj))
  9.    (if
  10. (eq (member blkobjname blklst) nil)
  11.        (if
  12.   (not (eq blklst nil))
  13.   (setq blklst (list blklst blkobjname))
  14.   (setq blklst (list blkobjname))
  15. )
  16.    )
  17.    (setq i (1+ i))
  18. )
  19. )
  20. (setq j (length blklst))
  21. (setq i 0)
  22. (textscr)
  23. (repeat j
  24. (setq ss(ssget "_X" (list (cons 0 "INSERT")(cons 2 (nth i blklst)))))
  25. (setq cnt (sslength ss))
  26. (prompt (strcat "\n" (nth i blklst) "-----------------" (itoa cnt)))
  27. (setq i (1+ i))
  28. )
  29. (defun getEffectiveName (ent)
  30. (setq obj (vlax-ename->vla-object ent))
  31. (vlax-get obj "EffectiveName")
  32. )
回复

使用道具 举报

pBe

32

主题

2722

帖子

2666

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
211
发表于 2022-7-6 09:19:12 | 显示全部楼层
blklst变量不是列表
 
哎呀。。你又发了一条。。坚持
 
您正在尝试创建选择集或块名列表吗?
 
  1. (defun c:cntblk(/ allblocks n i blklst blkobj blkobjname)
  2. (setq allblocks (ssget "_X" (List (cons 0 "INSERT"))))
  3. (setq n (sslength allblocks))
  4. (setq i [color=sienna]0[/color])
  5. (repeat n
  6.    (setq blkobj (ssname allblocks i))
  7.    (setq blkobjname (getEffectiveName blkobj))
  8.    (if [color=sienna](not (member blkobjname blklst))[/color]
  9.      [color=sienna](setq blklst (cons blkobjname blklst))[/color])
  10. (setq i (1+ i))
  11. )
  12. [color=sienna] blklst    [/color]
  13. )

 
 
使用ssadd可以创建选择集,而不是列表
使用cons/append/list//vl list*可以创建一个列表
回复

使用道具 举报

30

主题

96

帖子

66

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
150
发表于 2022-7-6 09:21:26 | 显示全部楼层
pBe,
然而,这只是将列表转储到命令窗口上。我试图计算block的实例,并给出如下提示:;
 
区块1-------------------10
区块2-------------------15
区块3-------------------8
区块4-------------------6
区块5-------------------12
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-6 09:24:13 | 显示全部楼层
查看李的区块计数器例程:眨眼:
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 09:28:18 | 显示全部楼层
以下是代码的快速修复:
 
  1. (vl-load-com)
  2. (defun c:cntblk ( / allblocks blklst blkobj blkobjname i n ss )
  3. [color=red]    (if[/color] (setq allblocks (ssget "_X" (list (cons 0 "INSERT"))))
  4. [color=red]        (progn[/color]
  5.            (setq n (sslength allblocks))
  6.            (setq i [color=red]0[/color])
  7.            (repeat n
  8.                (setq blkobj (ssname allblocks i))
  9.                (setq blkobjname (getEffectiveName blkobj))
  10.    [color=red]            (if (not (member blkobjname blklst))
  11.                    (setq blklst (cons blkobjname blklst))
  12.                )[/color]
  13.                (setq i (1+ i))
  14.            )
  15.            (textscr)
  16. [color=red]            (foreach blk blklst
  17.                (if (setq ss (ssget "_X" (list (cons 0 "INSERT") (cons 2 blk))))
  18.                    (prompt (strcat "\n" blk "-----------------" (itoa (sslength ss))))
  19.                )
  20.            )[/color]
  21. [color=red]        )
  22.    )[/color]
  23.    (princ)
  24. )
  25. (defun getEffectiveName ( ent / [color=red]obj [/color])
  26. (setq obj (vlax-ename->vla-object ent))
  27. (vlax-get obj "EffectiveName")
  28. )

 
但这不是一种很好的计数方法,因为在收集选择集时,将排除已更改可见性状态(因此变得匿名)的动态块。此外,通过这种方式,您可以有效地对块进行两次计数,因为您已经遍历了选择集以获得块列表。
 
考虑以下代码:
 
  1. (defun c:cntblk ( / allblocks blockentity blocklist blockname counter item )
  2.    (if (setq AllBlocks (ssget "_X" '((0 . "INSERT"))))
  3.        (progn
  4.            (setq counter 0)
  5.            (repeat (sslength AllBlocks)
  6.                (setq blockentity (ssname AllBlocks counter)
  7.                      blockname   (GetEffectiveName (vlax-ename->vla-object blockentity))
  8.                )
  9.                (if (setq item (assoc blockname blocklist))
  10.                    (setq blocklist (subst (cons blockname (1+ (cdr item))) item blocklist))
  11.                    (setq blocklist (cons  (cons blockname 1) blocklist))
  12.                )
  13.                (setq counter (1+ counter))
  14.            )
  15.            (foreach blk blocklist
  16.                (princ (strcat "\n" (car blk) " ----------------- " (itoa (cdr blk))))
  17.            )
  18.        )
  19.    )
  20.    (princ)
  21. )
  22. (defun GetEffectiveName ( obj )
  23.    (if (vlax-property-available-p obj 'effectivename)
  24.        (vla-get-effectivename obj)
  25.        (vla-get-name obj)
  26.    )
  27. )

 
我试图使程序的结构尽可能接近您的原始代码,以便您更容易学习。我强烈建议您仔细研究上述两种解决方案,并询问有关我使用的代码的任何问题。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-7 06:19 , Processed in 0.412173 second(s), 72 queries .

© 2020-2025 乐筑天下

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