找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: x99

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

[复制链接]
 楼主| 发表于 2007-3-10 23:15:06 | 显示全部楼层
不知你说的是不是这样:
[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))
       )
          (setq kk1 (ssget "P"))
       (SETVAR "nomutt" 1)
           (command "select" dc "r" pause)
          (setq kk2 (ssget "P"))
       (if (/= kk1 kk2)           
           (he kk2)
       )

           (SETVAR "nomutt" 0)
    )
  )
  (PRINC)
)
[/PHP]
不过我试过,不管是全选还是一个都不选,都行不通的。前后两个选择集kk1和kk2,用上述方法比较的确不同,这是它们的名字不同,但选择集中内容是一样的,长度及所包含的图元都一样。
我使用了一个笨办法,把showent修改了一下,即先在dc中加入一个隐藏点,让用户选择不到,这时即使全选,也总有一个图元是没有选择的。到最后再把这个点删除即可。代码如下:
[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))
       )
     
     (entmake '((0 . "POINT") (60 . 1) (10 0.0 0.0 0.0)))
     (ssadd (entlast) dc)

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

使用道具 举报

已领礼包: 24个

财富等级: 恭喜发财

发表于 2007-3-11 10:27:05 | 显示全部楼层
你比较选择集是否相同的方法错误,
例如
[php]
(setq a (ssget))
(setq b (ssget "P"))
[/php]
无论用= , equal ,eq 比较a,b都返回nil,但其实两选择集相同
选择集的比较是逐项进行比较的
或者象下面这样比较
[php]
(equal (ssnamex a) (ssnamex b))
[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-3-13 10:14:44 | 显示全部楼层
可以吗?
(defun c:hideent( / dc )
    (setq dc (my-ssget "\n请选择需要隐藏的对象:" nil))
    (if (= dc nil)
        (princ "\n你没有选择任何对象")
        (he dc)
     )
    (princ)
)
(defun c:showent( / dc i entname1 aa de showe ss entname2 )
       (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))
       )
       (princ "\n请选择需要恢复显示的对象:")
       (setq showe (ssadd))
       (while (setq ss (ssget ":s"))
              (setq i 0)
              (repeat (sslength ss)
              (setq entname2 (ssname ss i))
              (redraw entname2 1)
                (if (ssmemb entname2 dc)
                    (setq showe (ssadd entname2 showe))
                    (alert "该选择中含有非隐藏对象!")
                )
              (setq i (+ i 1))
              )
              
       )
        
   (if (/= showe nil)
     (progn
       (setq i 0)
       (while (setq entname1 (ssname showe i))
              (ssdel entname1 dc)
              (redraw entname1 4)
              (setq i (+ i 1))
       )
     )
   )
      (if (/= (sslength dc) 0) (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 / i entname aa de )
     (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))
     )

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

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

发表于 2007-3-13 17:30:52 | 显示全部楼层
你的意思是在ssget命令状态下每次选择都进行高显状态的非运算??
高显<->普通
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-3-13 23:52:26 | 显示全部楼层
非也,高显状态非运算是在每个ssget命令结束后进行的。
byghbcaixin朋友巧妙地利用了一个ssget命令的循环来达到我程序所要求的目的,真是条条大路通罗马啊,受教了,十分感谢!
不过byghbcaixin 的代码中,(alert "该选择中含有非隐藏对象!")语句在实际使用的程序中应该删除,否则,一不小心多选了几个非隐藏对象,就会跳出一大堆的警告。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-3-14 09:11:45 | 显示全部楼层
对,(alert "该选择中含有非隐藏对象!")可以删除,也可以改一下只提示一次。但我发现一个问题,就是对优化多段线、样条线、椭圆之类的图元不能亮显?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-3-14 12:03:15 | 显示全部楼层
的确优化多段线、样条线、椭圆之类的图元不能亮显。另外建议加上出错处理,否则在选择显示的时候如果按下“ESC键”的话,所有隐藏实体全部显示出来了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-17 17:55 , Processed in 0.201486 second(s), 37 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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