找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2235|回复: 21

[求助] [求助]:能否自定义被ssget选中对象的显示状态(再请教关于select的新问题)

[复制链接]
发表于 2007-3-9 21:59:07 | 显示全部楼层 |阅读模式

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

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

×
最近编制了一个程序:使用命令hideent,提示选择对象,然后把选择的对象隐藏。使用showent,将隐藏的对象全部高亮显示,然后提示用户选择要恢复显示的对象,选择完毕,被选择的对象由隐藏变为显示,而未被选中的对象依然隐藏。
问题出在第2个命令,由于需要选择的对象已经高亮显示,如果要从中选择需要恢复显示的对象,则选中的对象与未被选中的隐藏对象之间无法区别(因为ssget也是把选中的对象highlight以示和其它对象有所区别)。请问能否在下面程序中把选中的对象变成普通显示呢(即showent命令中选中的对象由highlight变为unhighlight)
[PHP]
(defun c:hideent()
    (setq dc (my-ssget "\n请选择需要隐藏的对象:" nil))
    (if (= dc nil)
        (princ "\n你没有选择任何对象")
        (he dc)
     )
    (princ)
)



(defun c:showent( )
       (setq dc (ssget "X" '((60 . 1))))
       (if (= dc nil)      
       (princ "\n本图中没有任何隐藏对象!!")
       (progn
       (setq i 0)
       (while (setq entname1 (ssname dc i))
              (setq aa (entget entname1))
              (setq de (subst '(60 . 0) '(60 . 1) aa))
              (entmod de)
              (redraw entname1 3)
              (setq i (+ i 1))
       )
       (setq showe (my-ssget "\n请选择需要恢复显示的对象:" nil))
       (setq i 0)
   (if (/= showe nil)
     (progn
       (while (setq entnmame1 (ssname showe i))
              (ssdel entname1 dc)
              (redraw entname1 4)
              (setq i (+ i 1))
       )
     )
   )
       (he dc)
)
  )
       (princ)
  
)


(DEFUN my-ssget    (str str1 / ssa)
  (IF (OR (= str nil) (= str ""))
    (PRINC "\n选择对象:")
    (PRINC (STRCAT "\n" str))
  )
  (SETVAR "nomutt" 1)
  (SETQ ssa (VL-CATCH-ALL-APPLY 'ssget (list str1)));能否在这一步把已经选择的高亮对象变成unhighlight呢?
  (SETVAR "nomutt" 0)
  (IF (VL-CATCH-ALL-ERROR-P ssa)
    (exit)
    ssa
  )
)

(defun he( dc )
     (setq i 0)
     (while (setq entname (ssname dc i))
            (setq aa (entget entname))
            (setq de (append (list (car aa) (cadr aa) (caddr aa) '(60 . 1)) (cdddr aa)))
            (entmod de)
            (setq i (+ i 1))
     )

)


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

已领礼包: 24个

财富等级: 恭喜发财

发表于 2007-3-9 22:04:43 | 显示全部楼层
不明白你想干啥
建议你看一下有关redraw的帮助


整数值,用于控制图元的可见性和亮显。mode 可为下列值之一:

1 显示图元

2 隐藏图元(使其不可见)

3 亮显图元

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

使用道具 举报

 楼主| 发表于 2007-3-9 22:22:38 | 显示全部楼层
多谢回复!
不过可能不是我要的答案。
当运行(ssget)时,选择对象,如果系统变量highlight=1的话,选中的对象就被highlight。
如果我要选的对象已经highlight了,能不能在选择对象的过程中(还未退出ssget),就使已经选择的对象unhighlight呢?
***不好意思,前面把自己的代码看错了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

发表于 2007-3-9 22:58:04 | 显示全部楼层
在一个函数执行过程中,你是没有办法中断它来执行另一段代码的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-3-9 23:16:01 | 显示全部楼层
呵呵,谢谢!
发帖前我自已已经想到十有八九是不可能的了。
不过想想论坛上高手很多,想试一试。
就象我前面一个要求修改ssget提示词的主题,当时想想提示词是ssget内部已经定好的,无法改变,没想到fools老兄使用了另外的方法,问题解决的十分完美。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 24个

财富等级: 恭喜发财

发表于 2007-3-9 23:40:23 | 显示全部楼层
用(command "select" "r" ...),其他函数不变
不要忘记cmdecho -->  0
[php]
(DEFUN c:showent ()
  (SETQ dc (SSGET "X" '((60 . 1))))
  (IF (= dc nil)
    (PRINC "\n本图中没有任何隐藏对象!!")
    (PROGN (SETQ i 0)
           (WHILE (SETQ entname1 (SSNAME dc i))
             (SETQ aa (ENTGET entname1))
             (SETQ de (SUBST '(60 . 0) '(60 . 1) aa))
             (ENTMOD de)
             (SETQ i (+ i 1))
           )
           (SETVAR "nomutt" 1)
           (command "select" dc "r" pause)           
           (he (ssget "P"))
           (SETVAR "nomutt" 0)
    )
  )
  (PRINC)
)
[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-3-10 00:56:38 | 显示全部楼层
试试ssget函数中的"I"选项及sssetfirst函数
example:
(setq sel (ssget "I" '((0 . "*DIMENSION,*ATTDEF,*TEXT"))))
        (if        sel
                (progn
                        (if        (= (sslength sel) 1)
                                (progn
...
(sssetfirst nil nil)
                                        (ssget "I")
...
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-3-10 19:59:15 | 显示全部楼层
首先对fools致以十二万分的敬意,兄弟实在是高,所有看来不可能的问题到你哪儿都迎刃而解!!向你学习!!
qjcpj老兄的方法还没来得及试,先表示感谢!

新问题:当我要把所有隐藏对象全部显示时,从选择减去全部图元,结果一个图元也减不掉,不知是怎么回事?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 24个

财富等级: 恭喜发财

发表于 2007-3-10 20:34:24 | 显示全部楼层
select的选项
需要点或窗口(W)/上一个(L)/窗交(C)/框(BOX)/全部(ALL)/栏选(F)/圈围(WP)/圈交(CP)/编
组(G)/添加(A)/删除(R)/多个(M)/前一个(P)/放弃(U)/自动(AU)/单个(SI)

因为前面的程序用了r选项所以shift添加不起作用,要键入A添加,你试试
PS:闻道有先后,术业有专攻,这里高手如云,我那几招不能算高呢. :)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-3-10 20:47:08 | 显示全部楼层
不是这个意思,我是说上面的程序,我把你贴出来的函数运行,比如说我隐藏了3个对象,运行showent,然后选择这三个对象,想让它全部显示,但结果它们又全部隐藏了。
函数运行后我在命令行运行(sslength dc),显示dc的长度为3,再运行(sslength (ssget "P")) ),显示还是3,也就是说当要减去全部对象时,反而一个对象也没减去,不知是怎么回事?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 24个

财富等级: 恭喜发财

发表于 2007-3-10 21:38:37 | 显示全部楼层
你是对的,我的代码有点问题,
因为全部取消选择时,等于没有select,选择集为空
需要在调用前先用(ssget "P")保留一个选择集,然后再比较select之后的(ssget "P")是否与前相同即可
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-3-10 21:50:56 | 显示全部楼层
我刚刚也想可能是这个问题,可能select不支持减去全部对象。这样的话你在11楼说的方法好像也不能用。因为select运行后,只要运行select是减去所有对象,再(ssget "p")得到的对象同样是一个也没减去的选择集。又或许select确实把所有对象减去了,但这时候上一个选择集为空,也就时选择集不再存在了,所以(ssget "P")得到的实际上是上上一个选择集。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 24个

财富等级: 恭喜发财

发表于 2007-3-10 21:52:43 | 显示全部楼层
如果前后两个(ssget "P")相同,那么就将(SETQ dc (SSGET "X" '((60 . 1))))全部显示出来
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-3-10 21:56:48 | 显示全部楼层
但如果我什么也不减去呢(也就是什么也不选择)?这时前后两个选择集也相同,按理这时所有对象都要再次隐藏的,但他们却全部显示出来了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 24个

财富等级: 恭喜发财

发表于 2007-3-10 22:25:32 | 显示全部楼层
什么都不选,前后两个选择集不会相同,因为有(command "select" dc ...
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-17 17:38 , Processed in 0.202093 second(s), 59 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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