乐筑天下

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

[编程交流] 为每个o创建新列表

[复制链接]

10

主题

39

帖子

29

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
50
发表于 2022-7-5 22:41:43 | 显示全部楼层 |阅读模式
嗨,我会尽量说清楚的。我有一个lisp,可以多次偏移对象。为了进一步处理,我需要按lisp创建的相反顺序列出对象,这有点容易,但如果偏移量从原始对象创建了2个对象,我还需要将对象作为不同的列表进行区分或分组。
在附件中,你可以看到一个随机对象的结果(见上图),不同的颜色代表我需要分离的不同组,我正在运行的代码将首先创建红色偏移,然后是最大的蓝色偏移和最大的绿色偏移,其余的蓝色偏移,最后是剩余的绿色偏移。在底部对象上也会发生类似的情况
我曾想过每次创建两个以上的对象时都要创建一个新列表,但我找不到给每个列表一个唯一名称的方法(例如:list1、list2、list3等),因为无法告诉将创建多少个对象。
我已经没有主意了,所以任何帮助都将不胜感激。
抵消图纸
回复

使用道具 举报

10

主题

39

帖子

29

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
50
发表于 2022-7-5 22:57:16 | 显示全部楼层
如果有帮助,这是我用来抵消的lisp:
  1. ;Alfredo Rodriguez, 18 May 2014
  2. ;This will offset an object multiple times
  3. ;It will offset to the inside/outside, up/down, left/right depending on the drawing direction
  4. ;So it's better to always set a maximum number of offsets or else it could offset indefinitely
  5. ;For this reason, if use default is chosen, it will offset the object 20 times, or you can
  6. ;choose how many times to offset. If object is offset to the wrong side, enter a negative distance (ej: -3 instead of 3)
  7. ;I'm not a lisp professional, so I can't guaranty any results obtained with this code, so use with care.
  8. (defun c:cntoffset (/ ename dist vobj obj objlist objlist2 how_many count maxcount thisdrawing size listname)
  9. (vl-load-com)
  10. (setq  thisdrawing (vla-get-activedocument (vlax-get-acad-object)))    ;This  makes the Undo command erase only what's drawn in this lisp
  11. (vla-StartUndoMark thisdrawing)    ;This makes the Undo command erase only what's drawn in this lisp
  12.        (null (initget 7))
  13.        (while (setq ent (ssget))
  14.            (setq dist (getdist "\nEnter offset distance: "))
  15.            (setq how_many (sslength ent))
  16.            (setq count 0)
  17.       
  18.            (or
  19.            (setq maxcount (getdist "\nEnter number of offsets (or press Enter to use default): "))
  20.            (setq maxcount 50)
  21.            )
  22.            
  23.            (while (/= count how_many)
  24.                (setq ename (ssname ent count))
  25.                (setq obj (list (vlax-ename->vla-object ename)))
  26.                  (setq objlist (append obj objlist))
  27.                (setq count (+ count 1))
  28.            )
  29.                (setq count 0)
  30.                (while (and (/= count maxcount) (/= objlist nil))
  31.                    (setq count (+ count 1))
  32.                    (setq vobj (car objlist))
  33.                    (if (vlax-method-applicable-p vobj "Offset")
  34.                        ;(progn ;Activate this line during testing to see order in which objects are drawn
  35.                            (if (vl-catch-all-error-p
  36.                                (setq objlist2 (vl-catch-all-apply 'vlax-invoke
  37.                                (list vobj 'Offset (- dist)))))
  38.                                (progn (setq objlist2 nil)
  39.                                    (prompt "\n*** Can not offset that object, try again. ***")
  40.                                      (setq count 0)
  41.                                )
  42.                            (setq size (length objlist2));To see if more than one object was created
  43.                            )
  44.                               
  45.                            ;(prompt "\nDone") ;Activate this line during testing to see order in which objects are drawn
  46.                             ;(alert "\nJust for testing!!!") ;Activate this  line during testing to see order in which objects are drawn
  47.                         ;Activate this line during testing to see order in which objects are drawn
  48.                    )
  49.                    (if (> size 1);To create a different list name for each object, but this seens to be going nowhere
  50.            (progn (setq count2 1)
  51.                    (while (< count2 size)
  52.                    (setq count2 (+ count2 1))
  53.                    (setq listname (strcat "polylist" (itoa count2)))
  54.                    )
  55.            )
  56.            )
  57.                    (setq objlist (append objlist2 (cdr objlist)))
  58.                )
  59.                (setq objlist nil)
  60.                (setq objlist2 nil)
  61.        )
  62. (vla-EndUndoMark thisdrawing)    ;This makes the Undo command erase only what's drawn in this lisp
  63. (princ)
  64. )
回复

使用道具 举报

5

主题

956

帖子

963

银币

初来乍到

Rank: 1

铜币
35
发表于 2022-7-5 23:21:34 | 显示全部楼层
也许可以参考一下这个句柄,它是增量十六进制还是唯一的名称?
_$(handent“e23”)
每一步都连接/附加到一个列表中
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 23:31:34 | 显示全部楼层
像hanhphuc一样,只需使用(Entlast)创建每个偏移量,并将对象添加到选择集,然后就可以检索每个偏移量。根据需要重复多个选择集。
回复

使用道具 举报

10

主题

39

帖子

29

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
50
发表于 2022-7-5 23:47:42 | 显示全部楼层
嗨,伙计们。谢谢你的回答。
然而,我不确定我是否理解你的建议。。。问题是,在某个点上,偏移创建了多个实体,因此第一个实体将被追加到列表中,其他实体必须存储起来,以便在第一个实体进一步偏移后添加到列表中。
例如:A创建B,B创建C,D和E,C创建F和G(然后返回“nil”),D创建H和I(然后返回“nil”),E创建J(和“nil”),因此最终列表必须是(A B C F G)(D H I)(E J)。这可以在任何级别重复多次。
 
所以我做的是这样的:
将创建的对象存储在临时列表中,如果其大小大于1,则将临时列表的car附加到mylist,然后将临时列表设置为其自身的cdr。一旦返回“nil”,就会在mylist中插入一个标记,并附加临时列表的car,然后再次将临时列表设置为其自身的cdr。直到不再创建任何对象为止。
然后使用该标记创建一个列表,该列表由我的函数处理,然后删除,创建另一个包含项目的列表,直到下一个标记,依此类推。
 
这是我写的代码中处理这个问题的部分,以防它对任何人有帮助,或者如果有任何关于如何改进它的建议。
“polylist”是我要找的列表。
 
  1. (setq count 0)
  2.                (while (and (/= count maxcount) (/= objlist nil))
  3.                    (setq count (+ count 1))
  4.                    (setq vobj (car objlist))
  5.                    (if (vlax-method-applicable-p vobj "Offset")
  6.                        ;(progn ;Activate this line during testing to see order in which objects are drawn
  7.                            (if (vl-catch-all-error-p
  8.                                (setq objlist2 (vl-catch-all-apply 'vlax-invoke
  9.                                (list vobj 'Offset (- dist)))))
  10.                                (progn (setq objlist2 nil)
  11.                    (prompt "\n*** Can not offset that object, try again. ***")
  12.                    (setq count 0)
  13.                                  (setq polylist (append polylist (list "p" (car polylist2))))
  14.                                (setq polylist2 (cdr polylist2))
  15.                                )
  16.                                (setq size (length objlist2));To see if more than one object was created
  17.                            )
  18.                ;(prompt "\nDone") ;Activate this line during testing to see order in which objects are drawn
  19.                            ;(alert "\nJust for testing!!!") ;Activate this line during testing to see order in which objects are drawn
  20.                         ;Activate this line during testing to see order in which objects are drawn
  21.                    )
  22.                    (if (> size 1);To separate list if more than one object was created
  23.                        (progn
  24.                            (setq polylist (append polylist (list (car objlist2))))
  25.                            (setq polylist2 (append polylist2 (cdr objlist2)))
  26.                        )
  27.                              (setq polylist (append polylist objlist2))
  28.                    )
  29.                    (setq objlist (append objlist2 (cdr objlist)))
  30.                )
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-7-7 09:35 , Processed in 2.087723 second(s), 63 queries .

© 2020-2025 乐筑天下

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