fyhfsf 发表于 2007-1-25 21:42:00

[求助]局部隐藏,恢复可见,局部显示

请高手编一LISP,要求又局部隐藏功能,即将选取的实体马上隐藏(注意不是隐藏实体所在的图层啊),需要再将其恢复;局部显示功能,即只显示所选取的实体(不是实体所在的图层),其他全部关闭,其实我所说的就是天正6.0以上版本里的一小工具的功能,真爽啊!

song宋_74729 发表于 2018-2-21 12:55:00

sailorcwx 发表于 2007-1-28 06:18
我觉得之前那个没什么问题啊。第一、re不是经常使用;第二、就算你退出时忘记把隐藏的对象恢复也不会影响你 ...

把建立一个隐藏的图层,把你需要隐藏的东西全转到那里去 怎么改2楼源码

sdls 发表于 2019-5-19 06:57:16

谢谢两们大侠的分享!两个都用了

guankuiwu 发表于 2021-1-10 00:03:13

这个功能也不错了。

sailorcwx 发表于 2007-1-25 23:21:00

<p>;;局部隐藏/显示 v1.0 by sailorcwx 2007.01<br/>;;隐藏的对象仅为临时隐藏,重生(REGEN)后将重新显示</p><p>(defun c:hredraw ( / YH_DOWHAT YH_INDEX YH_SELECTION YH_SELECTION1)<br/>&nbsp; (setq YH_selection (ssget))<br/>&nbsp; (initget "H R")<br/>&nbsp; (setq YH_dowhat (GETKWORD "\n隐藏选择对象&lt;H&gt;;保留选择对象&lt;R&gt;"))<br/>&nbsp; (if (or (= YH_dowhat "R") (= YH_dowhat "r"))<br/>&nbsp;&nbsp;&nbsp; (progn<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq YH_selection1 (ssget "X"))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq YH_index 0)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (repeat (sslength YH_selection)<br/>&nbsp;(setq YH_selection1 (ssdel (ssname YH_selection YH_index) YH_selection1))<br/>&nbsp;(setq YH_index (1+ YH_index))<br/>&nbsp;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq YH_selection YH_selection1)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp; (setq YH_index 0)<br/>&nbsp; (repeat (sslength YH_selection)<br/>&nbsp;&nbsp;&nbsp; (redraw (ssname YH_selection YH_index) 2)<br/>&nbsp;&nbsp;&nbsp; (setq YH_index (1+ YH_index))<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp; (princ)<br/>&nbsp; )</p>

fyhfsf 发表于 2007-1-26 09:46:00

<p><strong><font face="Verdana" color="#61b713">sailorcwx真是强啊,多谢了!如果能在r14下用就更好了,象你表示敬意!</font></strong></p>

fyhfsf 发表于 2007-1-26 10:03:00

本帖最后由 作者 于 2007-1-26 10:27:41 编辑 <br /><br /> 我搞错了<font color="#000000">!r14也能用!唯一不满意之处就是用RE恢复可见,图纸稍大时速度有点慢啊</font>

sailorcwx 发表于 2007-1-26 17:52:00

那你希望怎么样恢复可见。编译后速度可能会快一点

fyhfsf 发表于 2007-1-27 23:29:00

本帖最后由 作者 于 2007-1-28 20:34:26 编辑 <br /><br /> 谢谢<strong><font face="Verdana" color="#61b713">sailorcwx,我不会编程,有这样一思路,不知行的通否?把原一个命令分为三个,一是局部隐藏:将选中的实体信息保存,再将选中实体颜色改为CAD背景颜色、实体冻结,隐藏实体;二、恢复可见:将隐藏实体恢复原颜色、解冻实体即可;三、仅显示选中实体:将选中实体反选,改为CAD背景色即可。这样也许恢复可见速度会快些?我说的轻松,可能做起来就难了,还请sailorcwx多想办法啊,谢了!</font></strong>

sailorcwx 发表于 2007-1-28 06:18:00

<p>我觉得之前那个没什么问题啊。第一、re不是经常使用;第二、就算你退出时忘记把隐藏的对象恢复也不会影响你的图档。你所说的冻结颜色我不会,不过我有个办法就是把建立一个隐藏的图层,把你需要隐藏的东西全转到那里去,记录它所在图层,需要恢复的时候再转回去。不过有个问题就是如果你退出的时候忘记恢复的话就只能人工一个一个转回去了。再说,速度也是一样的。其实你如果会读我的程序的话,你就会知道,我的程序其实是逐个隐藏的,所以图大了之后,对象多了,运行的时间就会长一点,这就是慢的原因。</p>

fyhfsf 发表于 2007-1-29 12:11:00

还是你说的有道理,<font face="Verdana" color="#61b713"><strong>sailorcwx,还有一事相求,CAD的trim命令剪切物体时,只能点选要剪切的实体,或是输入F实现多选,能否更改trim命令,使之能选择要剪切的物体时,可采用多种选择功能?就像我们用MOVE命令时,可采用的选择功能那样,</strong><font color="#000000">谢啦!</font></font>

xiaobao02 发表于 2009-8-15 01:03:00

<p>赞,看到现在关于显示隐藏的LISP,此楼最好,精简,实用!</p><p>小小建议:程序再修改一下,不要使用者输入H了,直接隐藏选择的对象</p><p>再提示:选择对象隐藏选择对象已隐藏,请继续选择!</p><p>给使用者多一点选择的余地!这样会更爽!</p>

vbn2012 发表于 2015-12-5 09:10:03

如果说和天正的局部隐藏,局部可见,全部可见一样那就更好了,附上论坛里面一个人的源码,但是不稳定,只能隐藏,有时显示不了,我不懂,你可以参考参考
;;; 命令: VB, VQ
;;; 功能: VB 部分隐藏选中的物体,VQ 全部显示所有物休。
;;; 备注: 放样时用得较多
*************************************************************************
;;快速隐藏物体
(vl-load-com)
;对象显示与隐藏
(defun obj_onf (ss mode)
(if (= (type ss) 'PICKSET)
    (vlax-for OBJ (vla-get-activeselectionset
      (vla-get-activedocument (vlax-get-acad-object))
      )
      (if (/=(vla-get-visible OBJ) mode) (vla-put-visible OBJ mode))
    )
)
)
;图层显示与隐藏
(defun lay_onf (LayName mode)
(if (= (type LayName) 'STR)
    (vlax-for lay (vla-get-layers
      (vla-get-activedocument (vlax-get-acad-object))
      )
      (if (eq (strcase (vla-get-name lay)) (strcase LayName))
(if(/=(vla-get-layeron lay) mode)
    (vla-put-layeron lay mode)
    )
)
    )
)
)

;;;把选择集的物体转化为Lisp 图元表
(defun S2L:ENT (ss / i l objs)
(setq i -1 l (sslength ss) objs nil)
(repeat l
    (setq objs (cons(ssname ss (setq i (1+ i))) objs))
)
)
;;;把选择集的物体转化为VLisp 图元表
(defun S2V:ENT (ss / i l objs)
(setq i -1 l (sslength ss) objs nil)
(repeat l
    (setq objs (cons(vlax-ename->vla-object (ssname ss (setq i (1+ i)))) objs))
)
)
;__
;;全部显示
(defun C:VQ (/ OBJ lay)
(princ "【全部显示】")
(obj_onf (ssget "x") :vlax-true)
(vlax-for lay(vla-get-layers
      (vla-get-activedocument (vlax-get-acad-object))
    )
    (if(/= (vla-get-layeron lay) :vlax-true)
      (vla-put-layeron lay :vlax-true)
    )
)
(princ)
)
;;部分隐藏
(defun C:VB (/ OBJ)
(princ "【部分隐藏】")
(obj_onf (ssget) :vlax-false)
(princ)
)
;;部分显示
(defun C:vw (/ S2L:ENT ss ssent )
(princ "【部分显示】")
(setq ss (ssget "x")
      ssent (ssget)
ssent (S2L:ENT ssent)
)
(foreach s ssent (setq ss (ssdel s ss)))
(setq ss (mapcar 'vlax-ename->vla-object (S2L:ENT ss)))
(foreach s ss (vla-put-visible s :vlax-false))
(princ)
)
页: [1] 2
查看完整版本: [求助]局部隐藏,恢复可见,局部显示