冒个烟圈 发表于 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]" )

oistre 发表于 2018-8-30 18:51:19

谢谢大神,牛牛牛牛!!!

ZZXXQQ 发表于 2015-10-13 08:47:50

;[隐藏物体(反)]
(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"))
(repeat (setq i (sslength ss))
   (ssdel (ssname ss (setq i (1- i))) ss2)
);end repeat
(sssetfirst nil ss2)
(repeat (setq i (sslength ss2))
   (setq ent (ssname ss2 (setq i (1- 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
);end repeat
(princ "\n已隐藏非选择物体" )
));end if
(sssetfirst nil nil)
(princ)
);end defun

lingduwx 发表于 2015-10-13 10:01:49

嘿嘿,顶一个哈

ymcui 发表于 2015-10-13 10:06:06

非常好用,谢谢

lingduwx 发表于 2015-10-13 10:10:43

ymcui 发表于 2015-10-13 10:06 static/image/common/back.gif
非常好用,谢谢

大哥能否把你的lsp发一个啊,我的合并代码后,反隐藏没有反应啊,谢谢了

ivde 发表于 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)
)

qmqyqj 发表于 2015-10-13 10:57:46

ZZXXQQ 发表于 2015-10-13 08:47 static/image/common/back.gif


隐藏了反向,那怎么再把隐藏后的显示出来呢?

ymcui 发表于 2015-10-13 11:35:08

lingduwx 发表于 2015-10-13 10:10 static/image/common/back.gif
大哥能否把你的lsp发一个啊,我的合并代码后,反隐藏没有反应啊,谢谢了

我就用的,ZZXXQQ 的程序.

ymcui 发表于 2015-10-13 11:40:23

qmqyqj 发表于 2015-10-13 10:57 static/image/common/back.gif
隐藏了反向,那怎么再把隐藏后的显示出来呢?

;[恢复隐藏]
(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

lingduwx 发表于 2015-10-13 13:06:57

哎,不知道咋回事就是不行,我自己也无语了
页: [1] 2
查看完整版本: “反向隐藏”达不到‘反向’的效果