找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1872|回复: 8

[LISP程序]:怎样求选择集

[复制链接]
发表于 2004-2-3 16:05:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
怎样用纯 LISP 求“COPY”,“ARRAY”等命令生成的新的实体所组成的选择集
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2004-2-3 19:41:23 | 显示全部楼层

Re: [LISP程序]:怎样求选择集

最初由 不是我 发布
[B]怎样用纯 LISP 求“COPY”,“ARRAY”等命令生成的新的实体所组成的选择集 [/B]

(setq ss (ssadd))
(setq last0 (entlast))
(setq last0_num (sslength last0))
(command ".copy")
(setq last (entlast))
(setq last_num (sslength last))

(setq sel_num (- last_num last0_num))
(setq i 0)
(repeat sel_num
  (setq ss (ssget "x"))
  (if ss
    (ssadd (ssname ss i) ss)
  )
  (setq i (+ i 1))
)
;;方法二,推荐
(defun tttt ( / )
        (setq ss (ssadd))
        (setq ss0 (ssget))
        (setq ee (entlast))
        (setq p1 (getpoint "p1"))
        (setq p2 (getpoint "p2"))
        (command ".copy" ss0 "" p1 p2 )
        (setq ss2 (ssget "x"))
        (setq i 0)
        (setq loop T)
        (while loop
                (setq ee2 (ssname ss2 i))
                (setq i (+ i 1))
                (if (not (eq ee ee2) )
                  (progn
                                (princ "k")
                                (ssadd ee2 ss)                    
                        ) ;endthen
                        (setq loop nil)
                );endif
        );endwhile
        ss
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-2-3 21:38:56 | 显示全部楼层
多谢,经过调试,代码需作如下修改

  1. (defun tttt ( / )
  2.   (setq ss (ssadd))
  3.   (setq ss0 (ssget))
  4.   (setq ee (entlast))
  5.   (setq p1 (getpoint "p1:"))
  6.   (setq p2 (getpoint "p2:"))
  7.   (command ".copy" ss0 "" p1 p2 )
  8.   (setq ss2 (ssget "x"))
  9.   (setq i 0)
  10.   (setq loop T)
  11.   (while loop
  12.     (setq ee2 (ssname ss2 i))
  13.     (setq i (+ i 1))
  14.     (if (not (eq ee ee2))
  15.       (if (/= (cdr (assoc 0 (entget ee2))) "VIEWPORT")
  16.         (setq ss (ssadd ee2 ss))
  17.       )
  18.       (setq loop nil)
  19.     )
  20.   )
  21.   ss
  22. )



干脆做成子函数

  1. (defun new_ss (elast / ss1 ss2 ee2 i loop)
  2.   (setq ss2 (ssget "x"))
  3.   (setq i 0 loop t ss1 (ssadd))
  4.   (while loop
  5.     (setq ee2 (ssname ss2 i) i (1+ i))
  6.     (if (not (eq ee2 elast))
  7.       (if (/= (cdr (assoc 0 (entget ee2))) "VIEWPORT")
  8.         (setq ss1 (ssadd ee2 ss1))
  9.       )
  10.       (setq loop nil)
  11.     )
  12.   )
  13.   ss1
  14. )


使用时,在执行命令之前先定义

(setq ee (entlast))

再执行 COPY,ARRAY 等命令,
执行完后,

(setq ss (new_ss ee))

获得新生成实体的选择集ss
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2004-2-3 21:56:28 | 显示全部楼层
论坛以前有过讨论
语法

    (entnext [ename])

功能及参数

    如要调用此函数而随后未跟任何参数, 那么此函数会返回在数据库中第一个未被删除的图元名。如果, 其后跟随着[ename] 参数, 它将返回在数据库中 [ename] 之后, 第一个未删除的图元名。若在数据库中没有下一个图元, 那么将返回 nil。此函数会返回主要图元及子图元。

    由 ssget 所选择的图元就是主图元, 它不包含图块的属性或多段线的顶点。经过 entnext 的简单方法, 您也可以存取这些复杂图元的内部结构。一旦您获取了这些子图素的名称, 您就可像其他的图元一样来操作它。如果您经过entnext 函数来获取一个子图元的名称, 您就可以再经过entnext 函数来寻找一个含有 seqend 图元的表, 然后再由这个图元表中取出 -2 群组, 这就是主图元的名称。

范例

(setq e1 (entnext));        设定 E1 为图形中第一个图元的名称

    (setq e2 (entnext e1));    设定 E2 为在 E1 后那个图元的名称



  1. (defun c:test (/ ss ss1 e)
  2.   (setq        e   (entlast)
  3.         ss1 (ssadd)
  4.   )
  5.   (setq ss (ssget))
  6.   (command ".copy" ss "" pause pause)
  7.   (while (setq e1 (entnext e))
  8.     (ssadd e1 ss1)
  9.   )
  10.   ss1
  11. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-2-4 08:37:12 | 显示全部楼层
(setq ss0 (ssget "x"))
....copy,array....
(command ".select" "all" "r" ss0 "")
(setq ss (ssget "p"))
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-8-31 19:36:55 | 显示全部楼层
我是新手,我不会编程,请各位大侠把程序补全:如何复制,删除,移动指定图层上的对象,过滤其它的对象(执行移动命令提示选择对象时,只能选择某一图层的物体,不能选择其它图层上的物体),例如天正建筑Tch中就有擦除墙线命令,可以仅仅删除wall层上的对象,擦除标注,可以仅仅删除dim层上对象。请各位大侠帮忙。谢谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-9-2 15:41:22 | 显示全部楼层
好帖!!我也要学习学习,希望斑竹多发这样有指导性的文章
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8779个

财富等级: 富甲天下

发表于 2004-9-2 19:09:07 | 显示全部楼层
楼上各位在写代码的时候能否顺手加上注释呢?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-9-4 13:24:10 | 显示全部楼层
最初由 zuicai 发布
[B]楼上各位在写代码的时候能否顺手加上注释呢? [/B]

同意楼上说的,请各位大侠加上注释,方便我等初学者学习。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2025-9-27 10:12 , Processed in 0.189900 second(s), 48 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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