找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 807|回复: 10

[求助] [求助]:新建选择集,如何能拾取块里的单独一个对象添加到选择集?

[复制链接]
发表于 2008-2-14 11:28:45 | 显示全部楼层 |阅读模式

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

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

×
TRIM命令,提示在选择对象时,如果选择的是块里的对象,是仍然可以以块中所选择的对象作为边界进行剪裁和延伸的,但是如果我把TRIM命令用LISP组合起来,就不行了,想选择块中的对象,结果却选择了整个块对象。
如何新建一个选择集,能让其选中块内的单独的对象?

  1.   [FONT=courier new]
  2. (defun c:t (/ cm ps ss)
  3.   (princ "\n* 修剪对象→|边=延伸、组选=关闭| *")
  4.   (setq cm (getvar "cmdecho"))
  5.   (setq ps (getvar "pickstyle"))
  6.   (setq *error* ee_err)
  7.   (setvar "cmdecho" 1)
  8.   (setvar "pickstyle" 0)
  9.   (setvar "edgemode" 1)
  10.   (princ "\n选择对象或 <全部选择>:")
  11.   (if (setq ss (ssget))
  12.       (command ".trim" ss "")
  13.       (command ".trim" "" "e" "n")
  14.   )
  15.   (setvar "cmdecho" cm)
  16.   (setvar "pickstyle" ps)
  17.   (princ)
  18. )

  19. (defun ee_err (s)  (setvar "cmdecho" cm)  (setvar "pickstyle" ps)  (command "_.undo" "_e"))
  20.   [/FONT]


利用上面的代码,如果选择块的话,将是整个块对象。但是如果用TRIM命令来选择块中的对象对,则是选择的是块中的单一的一个对象,为什么会有这样的区别?请求高手们指点一下?另我是一个LISP外行,上面的代码如何修改可以让其选择块中的单一的一个对象做为剪裁边界呀?

谢谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2008-2-14 21:16:22 | 显示全部楼层
;| ssget 帮助:
:N  Call ssnamex for additional information on container blocks and transformation matrices for any entities selected during the ssget operation.
This additional information is available only for entities selected via graphical selection methods such as Window, Crossing, and point picks.
Unlike the other object selection methods, :N may return multiple entities with the same entity name in the selection set. For example, if the
user selects a subentity of a complex entity such as a BlockReference, PolygonMesh, or old style polyline, ssget looks at the subentity that is
selected when determining if it has already been selected. However, ssget actually adds the main entity (BlockReference, PolygonMesh, an so on)
to the selection set. The result could be multiple entries with the same entity name in the selection set (each will have different subentity
information for ssnamex to report).
Notes on the Object Selection Methods

When using the :N selection method, if the user selects a subentity of a complex entity such as a BlockReference, PolygonMesh, or old style
polyline, ssget looks at the subentity that is selected when determining if it has already been selected. However, ssget actually adds the main
entity (BlockReference, PolygonMesh, etc.) to the selection set. It is therefore possible to have multiple entries with the same entity name in
the selection set (each will have different subentity information for ssnamex to report). Because the :N method does not guarantee that each
entry will be unique, code that relies on uniqueness should not use selection sets created using this option.
When using the L selection method in an MDI environment, you cannot always count on the last object drawn to remain visible. For example, if
your application draws a line, and the user subsequently minimizes or cascades the AutoCAD drawing window, the line may no longer be visible.
If this occurs, ssget with the "L" option will return nil.
|;
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2008-2-14 22:58:32 | 显示全部楼层
对象选择方法说明

在使用 :N 选择方法时,如果用户选择了一个复杂图元(如 BlockReference、PolygonMesh 或老式多段线)的子图元,那么 ssget 将查看该子图元是否已被选中。不过,ssget 实际上会将主图元(如 BlockReference 和 PolygonMesh)添加到选择集中。这样就很可能会在选择集中出现多个同名图元,而 ssnamex 获得的每个图元的子图元信息各不相同。由于 :N 方法不能保证每个图元的唯一性,所以不应对由该选项创建的选择集应用需要保证唯一性的代码。
在 MDI 环境中使用 L 选择方法时,最后一个绘制的对象并不一定就是可见的。例如,如果绘制了一条直线,然后将 AutoCAD 绘图窗口最小化或层叠放置,这条直线可能就看不见了。这时,使用 L 选项的 ssget 将返回 nil。

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

使用道具 举报

 楼主| 发表于 2008-2-15 09:25:58 | 显示全部楼层
看不懂,也不知道怎么办?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 208个

财富等级: 日进斗金

发表于 2008-2-15 10:02:23 | 显示全部楼层
[php](defun c:test ()
  (setq ss (ssget ":N")
        a 0
  )
  (repeat (sslength ss)
    (setq ent (ssnamex ss a))
    (princ (cadr (car ent)))
    (princ (strcat ": " (cdr (assoc 0 (entget (cadr (car ent)))))))
    (terpri)
    (setq a (1+ a))
  )
)[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2008-2-15 13:54:32 | 显示全部楼层
哎呀,楼上的代码不就是我昨天看完贴子想的吗?
不过,粗粗试了,还以为没效果呢。。。呵呵。。
学习喽..
但是代码是不对的吧。。。
如果ss是一个,那么选择出来的块中的图元,不也只有一个??
还没实现
期待中。。。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2008-2-15 19:06:49 | 显示全部楼层
确实难受,块中的对象不能 ssadd 添加到选择集中去,可能在ssadd定义中对复合对象作了过滤。
不知道有没有曲径。
延伸5楼的代码如下:
[PHP]
(defun C:TEST (/ SS0 SS1 I EN)
    (princ "\n选择对象或 <全部选择>:")
    (if        (setq SS0 (ssget ":N")
        )
        (progn
            (setq SS1 (ssadd)
                  I   0
            )
            (repeat (sslength SS0)
                (setq EN (cadar (ssnamex SS0 I)))
                (ssadd EN SS1) ;_*就在这里*
                (redraw EN 3)
                (setq I (1+ I))
            )
            (command "_.trim" SS1 "")
        )
        (command "_.trim" "")
    )
)

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

使用道具 举报

发表于 2008-2-16 21:26:25 | 显示全部楼层
(DEFUN C:TT ()
(command "_.trim" )
(WHILE (/= 0 (GETVAR "CMDACTIVE"))
  (COMMAND PAUSE)
)
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-2-16 23:46:25 | 显示全部楼层
刀兄,如何实现我的想法:
当用户选择剪裁边界后,就把edgemode=1
当用户没有选择剪裁边界,直接回车后,就把edgemode=0
且要可以选择块中的单个对象作为剪裁边界?
谢谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2008-2-17 22:37:08 | 显示全部楼层
用nentsel可以提取块中的某一图元,在此基础上再做处理,如何?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-2-19 08:41:51 | 显示全部楼层
可是我根本就不懂lisp呀?哪位大侠可以帮我改改?
谢谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-16 21:50 , Processed in 0.320486 second(s), 49 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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