乐筑天下

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

[编程交流] 循环以删除重复项

[复制链接]

7

主题

29

帖子

22

银币

初来乍到

Rank: 1

铜币
35
发表于 2022-7-6 15:14:01 | 显示全部楼层 |阅读模式
我的头撞在墙上,试图让这个回路工作。
只要列表中有偶数个重复项,我几乎可以让它工作。一旦得到奇数,它就会失控,无法正确过滤出我的选择集。这是我到目前为止得到的。。
 
  1. (setq endlist (sslength ssid2))
  2.         (setq endlist2 (sslength ssid2))   
  3.         (while (< curcnt endlist2)
  4.               (progn
  5.         (Setq nxtcnt 1)        
  6.         (setq tltcnt 0)
  7.         (setq curid (ssname ssid2 0))
  8.         (setq curnum (avalue curid "PARTNUMBER"))
  9.             (while    (<= tltcnt endlist)
  10.               (progn
  11.                 (setq nxtid (ssname ssid2 nxtcnt))
  12.                 (if (/= nxtid nil)              
  13.                       (progn
  14.                 (setq nxtnum (avalue nxtid "PARTNUMBER"))
  15.                     (if (equal curnum nxtnum)                           
  16.                           (ssdel curid ssid2)                           
  17.                           (setq nxtcnt (1+ nxtcnt))
  18.                     );if end
  19.                       );progn end
  20.            );if end
  21.         (setq tltcnt (1+ tltcnt))
  22.       );progn end
  23.     );while end
  24.     (setq curcnt (1+ curcnt))
  25.     (setq endlist2 (sslength ssid2))
  26.       );progn end
  27.       
  28.     );while end
  29.     )
  30.       )
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 15:19:16 | 显示全部楼层
基本上,我有一个选择集,从绘图中抓取我的所有块。我将使用该集合在以后的例程中创建一个列表。我的问题是,一旦我有了所有的块,有些是重复的。对于列表中的每个部分,我只需要一个块。所以我试图过滤掉我的集合,使其只包含唯一的实例。enitre例程变得相当大,所以我现在只发布选择集例程。如果还不足以画出一幅清晰的图画,我可以把其余的贴出来。
请原谅我的假笔记。他们帮助我学习和理解正在发生的事情。
 
  1. ; Returns the value of an attribute
  2. (defun avalue (bname aname)
  3.        (setq cnt 0)
  4.        (setq ent bname)
  5.        (while (= cnt 0)
  6.          (setq ent (entnext ent))
  7.          (setq entl (entget ent))
  8.          (setq entn (cdr (assoc 2 entl)))
  9.          (if (equal entn aname)
  10.              (progn
  11.               (setq cnt 1)
  12.               (setq aval (cdr (assoc 1 entl)))
  13.              );progn
  14.          ); if
  15.       ); while
  16. ); avalue
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 15:28:14 | 显示全部楼层
硬八
 
有点困惑。(cons 2“PARTID”)过滤器意味着只接受1个块名。插入的哪一部分是重复的?插入点?属性值?
 
(ssdel)可以从选取集中删除实体,但需要一些参数进行比较-大卫
回复

使用道具 举报

7

主题

29

帖子

22

银币

初来乍到

Rank: 1

铜币
35
发表于 2022-7-6 15:31:05 | 显示全部楼层
David,我假设复制了多个同名的块,并且该属性具有不同的属性值:PARTNUMBER。
 
因此,在我的代码中,我在集合中洗牌,列出att值,然后,如果后面的块具有已经看到的属性值,则将其从集合中删除。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 15:36:29 | 显示全部楼层
刚刚使用以下代码测试了我的LISP:
 
请参阅随附的视频示例
 
  1. ; Returns the value of an attribute
  2. (defun avalue (bname aname)
  3. (setq ent (entnext bname))
  4. (while (/= "SEQEND" (cdadr (setq elist (entget ent))))
  5.    (if (equal (cdr (assoc 2 elist)) aname)
  6.        (setq aval (cdr (assoc 1 elist))))
  7.    (setq ent (entnext ent)))
  8. ) ; avalue

 
希望这有帮助!
SSFilter。拉链
回复

使用道具 举报

26

主题

1495

帖子

20

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 15:44:00 | 显示全部楼层
只是想摆脱多次排序列表,然后只要检查下一步是什么,如果相同的跳过并继续通过列表一次。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 15:47:09 | 显示全部楼层
还有一个解决方案。Higlight并返回已清理的选择集。
 
  1. ; The function below collects part number blocks (partid) to use in creating a schedule
  2. ; Define the Function
  3. (defun getpart ()
  4. ;;; Sets ID selection set ("SSID") to a list and gets every entity in the drawing and filters out to only   ;;; blocks ("(cons 0 "INSERT")") and only blocks named "PARTID" ("(cons 2 "PARTID")")
  5. (SETQ SSID (ssget "X" (list (cons 0 "INSERT") (cons 2 "PARTID")(cons 66 1))))
  6. (if (= ssid nil)
  7.    (progn
  8.      (alert
  9.      "\nCannot find any Item Blocks.
  10.      \n    Check your drawing."
  11.    );alert
  12.      (princ);clean
  13.      );progn end   
  14.    (PROGN;;;Do the following.....
  15.      (SETQ idCOUNT 0);;;Sets the counter to 0
  16.      (setq EMAX(SSLENGTH SSID));;;Sets a "EMAX" to the length ("SSLENGTH") of the ID Selection Set ("SSID")   
  17.      (setq ssid2 (ssadd));creates ssid2 selection set
  18.      (setq dupss (ssadd))
  19.      (setq curcnt 0)
  20.      (setq fnd t)
  21.      (WHILE (< idCOUNT EMAX);;;While the count is less that "EMAX"....
  22.    (setq tid (ssname ssid 0))
  23.    (ssadd tid ssid2)
  24.    (SSDEL TID SSID)
  25.    (SETQ idcount(1+ idcount))
  26.      );while   
  27.         (setq endlist (sslength ssid2))
  28.         (setq endlist2 (sslength ssid2))   
  29.         (while (< curcnt endlist2)
  30.               (progn
  31.         (Setq nxtcnt 1)        
  32.         (setq tltcnt 0)
  33.         (setq curid (ssname ssid2 0))
  34.         (setq curnum (avalue curid "PARTNUMBER"))
  35.             (while    (<= tltcnt endlist)
  36.               (progn
  37.                 (setq nxtid (ssname ssid2 nxtcnt))
  38.                 (if (/= nxtid nil)              
  39.                       (progn
  40.                 (setq nxtnum (avalue nxtid "PARTNUMBER"))
  41.                     (if (equal curnum nxtnum)                           
  42.                           (ssdel curid ssid2)                           
  43.                           (setq nxtcnt (1+ nxtcnt))
  44.                     );if end
  45.                       );progn end
  46.            );if end
  47.         (setq tltcnt (1+ tltcnt))
  48.       );progn end
  49.     );while end
  50.     (setq curcnt (1+ curcnt))
  51.     (setq endlist2 (sslength ssid2))
  52.       );progn end
  53.       
  54.     );while end
  55.     )
  56.       );if end
  57.      (setq copcnt 0)
  58.      (setq copmax (sslength ssid2))
  59.      (WHILE (< copCNT copMAX);;;While the count is less that "EMAX"....
  60.    (setq tid (ssname ssid2 0))
  61.    (ssadd tid ssid)
  62.    (SSDEL TID SSID2)
  63.    (SETQ copcnt(1+ copcnt)))
  64.      );progn end      
  65. (princ);finish clean
  66. )
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 15:53:40 | 显示全部楼层
阿斯米,我认为你的方法与我的方法基本相同,只是你用VL代替。
 
只需将属性与列表中已经累积的属性进行比较,如果(member)返回T,则从SS中删除。
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-6 15:54:03 | 显示全部楼层
leemacs的代码运行得很好,我只是一点都不懂,哈哈,但我正在剖析它,边走边学习。多亏了你们,我已经基本完成了我的第一套动作,我很快就会把它贴出来,也许有人可以看看它,对他们需要做的事情有一些想法。希望我能像别人一样帮助别人。
再次感谢!
回复

使用道具 举报

2

主题

439

帖子

536

银币

限制会员

铜币
-14
发表于 2022-7-6 16:03:28 | 显示全部楼层
如果你愿意,我可以和你一起运行我的代码,注释每一行
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-4 18:16 , Processed in 0.460411 second(s), 83 queries .

© 2020-2025 乐筑天下

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