明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2556|回复: 14

[已解答] “反向隐藏”达不到‘反向’的效果

[复制链接]
发表于 2015-10-12 19:41:22 | 显示全部楼层 |阅读模式
;;;阿甘兄弟的代码,前面两个命令“隐藏物体”和“恢复隐藏”挺好用的,
;;;但是“反向隐藏”没有达到反向的效果,执行后全部都隐藏了,恳请帮忙诊断能达到反向的效果。。


;[隐藏物体]
(defun c:yc (/ AcadObject AcadDocument LayersObj ss n i ent ob lay vlay lay-tn)
(setq AcadObject (vlax-get-acad-object)
              AcadDocument (vla-get-ActiveDocument AcadObject)
              LayersObj (vla-get-layers AcadDocument)
);end setq
(princ "\n请选择需要隐藏的物体" )
(if (setq ss (ssget))
               (progn
                      (setq n (sslength ss))
                      (setq i (- n 1))
                      (repeat n
                             (setq ent (ssname ss i)
                                    ob (vlax-ename->vla-object ent)
                                    lay (vla-get-layer ob)
                                    vlay (vla-item LayersObj lay)
                            );end setq
                             (if (= (setq lay-tn (vla-get-lock vlay)) :vlax-true);如果图层锁定
                                    (vla-put-lock vlay :vlax-false);先解锁图层
                            );end if
                             (vla-put-visible ob :vlax-false)
                             (if (= lay-tn :vlax-true)
                                    (vla-put-lock vlay :vlax-true);再锁定图层,恢复图层状态
                            );end if
                             (setq i (1- i))
                     );end repeat
                      (princ "\n已隐藏选择物体" )
));end if
(princ)
);end defun
;[恢复隐藏]
(defun c:xs (/ AcadObject AcadDocument LayersObj ss n i ent ob lay vlay lay-tn)
(setq AcadObject (vlax-get-acad-object)
              AcadDocument (vla-get-ActiveDocument AcadObject)
              LayersObj (vla-get-layers AcadDocument)
);end setq
(if (setq ss (ssget "x" '((60 . 1))))
               (progn
                      (setq n (sslength ss))
                      (setq i (- n 1))
                      (repeat n
                             (setq ent (ssname ss i)
                                    ob (vlax-ename->vla-object ent)
                                    lay (vla-get-layer ob)
                                    vlay (vla-item LayersObj lay)
                            );end setq
                             (if (= (setq lay-tn (vla-get-lock vlay)) :vlax-true)
                                    (vla-put-lock vlay :vlax-false)
                            );end if
                             (vla-put-visible ob :vlax-true)
                             (if (= lay-tn :vlax-true)
                                    (vla-put-lock vlay :vlax-true)
                            );end if
                             (setq i (1- i))
                     );end repeat
                      (princ "\n已显示隐藏物体" )
              );end progn
               (princ "\n本图无隐藏物体" )
);end if
;(vla-regen AcadDocument AcAllViewPorts) 图形较大有时需要重生成才显示 可把这句加上
(princ)
);end defun
;[隐藏物体(反)]
(defun c:yf (/ AcadObject AcadDocument LayersObj ssObj ss ob n i ent ob ss2 ss3 lay vlay lay-tn)
(setq AcadObject (vlax-get-acad-object)
              AcadDocument (vla-get-ActiveDocument AcadObject)
              LayersObj (vla-get-layers AcadDocument)
);end setq
(princ "\n请选择不需要隐藏的物体" )
(if (setq ss (ssget))
               (progn
                      (setq ss2 (ssget "x" ))
                      (setq n (sslength ss))
                      (setq i (- n 1))
                      (repeat n
                             (setq ent (ssname ss i))
                             (if (setq ss3 (ssdel ent ss2))
                                    (setq ss2 ss3)
                            );end if
                             (setq i (1- i))
                     );end repeat
                      (sssetfirst nil ss2)
                      (setq ssObj (vla-get-ActiveSelectionSet AcadDocument))
                      (vlax-for ob ssObj
                             (setq lay (vla-get-layer ob)
                                    vlay (vla-item LayersObj lay)
                            );end setq
                             (if (= (setq lay-tn (vla-get-lock vlay)) :vlax-true)
                                    (vla-put-lock vlay :vlax-false)
                            );end if
                             (vla-put-visible ob :vlax-false)
                             (if (= lay-tn :vlax-true)
                                    (vla-put-lock vlay :vlax-true)
                            );end if
                     );end vlax-for
                      (princ "\n已隐藏非选择物体" )
));end if
(sssetfirst nil nil)
(princ)
);end defun
(princ "\n[隐藏物体-yc]/[恢复隐藏-xs]/[隐藏物体(反)-yf]" )

点评

很喜欢。飞诗曾经用group的把隐藏的对象组织起来,所以存在在位编辑时失效。这种全局的隐藏显示解决group应用场景缺陷问题。然,窃以为锁定的对象不要再进行隐藏操作,否则,感觉有悖于锁定的本义。  发表于 2015-10-14 09:58
"觉得好,就打赏"
还没有人打赏,支持一下

本帖被以下淘专辑推荐:

  • · 学习|主题: 95, 订阅: 8
发表于 2018-8-30 18:51:19 | 显示全部楼层
谢谢大神,牛牛牛牛!!!
发表于 2015-10-13 08:47:50 | 显示全部楼层
  1. ;[隐藏物体(反)]
  2. (defun c:yf (/ AcadObject AcadDocument LayersObj ssObj ss ob n i ent ob ss2 ss3 lay vlay lay-tn)
  3. (setq AcadObject (vlax-get-acad-object)
  4.       AcadDocument (vla-get-activedocument AcadObject)
  5.       LayersObj (vla-get-layers AcadDocument)
  6. );end setq
  7. (princ "\n请选择不需要隐藏的物体" )
  8. (if (setq ss (ssget)) (progn
  9.   (setq ss2 (ssget "x"))
  10.   (repeat (setq i (sslength ss))
  11.    (ssdel (ssname ss (setq i (1- i))) ss2)
  12.   );end repeat
  13.   (sssetfirst nil ss2)
  14.   (repeat (setq i (sslength ss2))
  15.    (setq ent (ssname ss2 (setq i (1- i)))
  16.          ob (vlax-ename->vla-object ent)
  17.          lay (vla-get-layer ob)
  18.          vlay (vla-item LayersObj lay)
  19.    );end setq
  20.    (if (= (setq lay-tn (vla-get-lock vlay)) :vlax-true);如果图层锁定
  21.     (vla-put-lock vlay :vlax-false);先解锁图层
  22.    );end if
  23.    (vla-put-visible ob :vlax-false)
  24.    (if (= lay-tn :vlax-true)
  25.     (vla-put-lock vlay :vlax-true);再锁定图层,恢复图层状态
  26.    );end if
  27.   );end repeat
  28.   (princ "\n已隐藏非选择物体" )
  29. ));end if
  30. (sssetfirst nil nil)
  31. (princ)
  32. );end defun
发表于 2015-10-13 10:01:49 | 显示全部楼层
嘿嘿,顶一个哈
发表于 2015-10-13 10:06:06 | 显示全部楼层
非常好用,谢谢
发表于 2015-10-13 10:10:43 | 显示全部楼层
ymcui 发表于 2015-10-13 10:06
非常好用,谢谢

大哥能否把你的lsp发一个啊,我的合并代码后,反隐藏  没有反应啊,谢谢了
发表于 2015-10-13 10:21:16 | 显示全部楼层
本帖最后由 ivde 于 2015-10-13 10:26 编辑

(defun c:yf (/ ss s sl e)
  (if (and (progn
      (setq ss (ssget))
      (vl-cmdf ".select" "all" "r" ss "")
      (setq s (ssget "P")
      )
    )
      )
    (progn
      (setvar "cmdecho" 0)
      (layerstate-save "tmpHide")
      (vl-cmdf ".layer" "U" "*" "")
      (setq sl (sslength s))
      (while (setq e (ssname s (setq sl (1- sl))))
(entmod (append (entget e) '((60 . 1))))
      )
      (layerstate-restore "tmpHide")
      (layerstate-delete "tmpHide")
    )
  )
  (princ)
)

发表于 2015-10-13 10:57:46 | 显示全部楼层
ZZXXQQ 发表于 2015-10-13 08:47

隐藏了反向,那怎么再把隐藏后的显示出来呢?
发表于 2015-10-13 11:35:08 | 显示全部楼层
lingduwx 发表于 2015-10-13 10:10
大哥能否把你的lsp发一个啊,我的合并代码后,反隐藏  没有反应啊,谢谢了

我就用的,ZZXXQQ 的程序.
发表于 2015-10-13 11:40:23 | 显示全部楼层
qmqyqj 发表于 2015-10-13 10:57
隐藏了反向,那怎么再把隐藏后的显示出来呢?

;[恢复隐藏]
(defun c:xs (/ AcadObject AcadDocument LayersObj ss n i ent ob lay vlay lay-tn)
(setq AcadObject (vlax-get-acad-object)
              AcadDocument (vla-get-ActiveDocument AcadObject)
              LayersObj (vla-get-layers AcadDocument)
);end setq
(if (setq ss (ssget "x" '((60 . 1))))
               (progn
                      (setq n (sslength ss))
                      (setq i (- n 1))
                      (repeat n
                             (setq ent (ssname ss i)
                                    ob (vlax-ename->vla-object ent)
                                    lay (vla-get-layer ob)
                                    vlay (vla-item LayersObj lay)
                            );end setq
                             (if (= (setq lay-tn (vla-get-lock vlay)) :vlax-true)
                                    (vla-put-lock vlay :vlax-false)
                            );end if
                             (vla-put-visible ob :vlax-true)
                             (if (= lay-tn :vlax-true)
                                    (vla-put-lock vlay :vlax-true)
                            );end if
                             (setq i (1- i))
                     );end repeat
                      (princ "\n已显示隐藏物体" )
              );end progn
               (princ "\n本图无隐藏物体" )
);end if
;(vla-regen AcadDocument AcAllViewPorts) 图形较大有时需要重生成才显示 可把这句加上
(princ)
);end defun
发表于 2015-10-13 13:06:57 | 显示全部楼层
哎,不知道咋回事就是不行,我自己也无语了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-12-27 09:46 , Processed in 0.201756 second(s), 34 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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