找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 711|回复: 6

[LISP程序]:永远的话题:关闭/打开图层,历程和我的方法

[复制链接]
发表于 2004-3-19 10:46:47 | 显示全部楼层 |阅读模式

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

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

×
其实具体这个程序写了很久了,关闭/打开图层的其他程序则还有更久远的例子。
因为要给同事介绍这个程序,所以
让我们来回顾这段历程——

一开始你只是想:能不能选一个实体就关闭那个实体所在的那个图层?
当然能,于是就实现了。
现在流行的关闭图层的LISP都是这个思路。

关闭是关闭了,可你要再恢复那个图层。。。那个什么图层呢?你只是点了一下,甚至都不知道那个图层是什么名字!
是的,除了关闭,还能不能恢复所关闭的那个图层?
当然能,于是又实现了。

你的图形不可避免地越来越复杂了——你点这个点那个,点来点去点烦了,于是你想:
能不能一次性选好几个要关闭的东西呢?
当然能,你能想到就能实现,于是真的实现了。

现在你可以一次关闭很多图层,并且在需要的时候一次性恢复他们。总之,你的注意力越来越集中在图形上,而不是那些让你头晕的图层名称。
然而。。。管理图层总是有很多然而——
然而你关闭A、B层之后,又关闭了C层,现在就只能恢复C层了。
于是你想:能不能把C层添加到原来关闭的A、B层里面去,然后一起恢复?
当然能,于是你得到了现在这个程序:

SF.LSP
适用于R12以上版本。
第一次使用时,直接选取要关闭图层所在的实体
已经有关闭图层时,会出现两个选项:
R恢复:恢复以前关闭的图层
A添加:关闭更多图层,并添加到以前的设置中,将来可以一起恢复。

[php]

;;; v1.0 1998-06-10     origenal version
;;;                     off/freeze layers by selecting objects; and restore them at one time
;;; v2.0 2000-07-04     no freeze anymore, new ADD option to add selection set
;;;                     rename to SF
;;;

(defun c:sf (/ ss amt lay_list idx lay_name key lay_all str)
  (prompt "\nWritten by Little Fish, 6-10-1998. Ver 2.0")
  (setq olderr *error*)
  (defun *error* (s)
    (setvar "cmdecho" 0)
    (command "undo" "end")
    (setvar "cmdecho" 1)
    (setq *error* olderr olderr nil)
    (princ)
  )

  (setvar "cmdecho" 0)
  (if (= (substr (getvar "acadver") 1 2) "12")
    (command "undo" "group")
    (command "undo" "begin")
  )
  (setvar "cmdecho" 1)

  (if snf_lay
    (progn
      (princ (strcat "\nLayer(s) stored: " snf_lay ".\nRestore/Add/<Select object(s)>: "))
      (initget "Restore Add")
      (setq key (getkword))
      (cond
        ( (= key "Restore")
          (setq key "on")
        )
        ( (= key "Add")
          (setq key "off" snf_add t)
        )
        ( t
          (setq key "off")
        )
      )
    )
    (setq key "off")
  )
  (if (= key "off")
    (setq ss (ssget)
          lay_list (list)
          idx 0
    )
  )
  (setq amt (if ss (sslength ss) 0))

  (repeat amt
    (setq lay_name (cdr (assoc 8 (entget (ssname ss idx)))))
    (if (member lay_name lay_list)
      nil
      (if (= lay_name (getvar "clayer"))
        nil
        (setq lay_list (append lay_list (list lay_name)))
      )
    )
    (setq idx (1+ idx))
  )

  (if lay_list
    (setq lay_all (substr (apply 'strcat (mapcar '(lambda (str) (strcat "," str)) lay_list)) 2))
    (if (= key "on") (setq lay_all snf_lay))
  )
  (if lay_all
    (progn
      (if snf_add (setq lay_all (strcat snf_lay "," lay_all)))
      (setvar "cmdecho" 0)
      (command "layer" key lay_all "")
      (setq snf_lay (if (= key "off") lay_all nil))
      (setq snf_add nil)
    )
  )

  (setvar "cmdecho" 0)
  (command "undo" "end")
  (setvar "cmdecho" 1)
  (setq *error* olderr)
  (princ)
)

(princ "loaded. Start as C:SF. ")
(princ)

[/php]

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

已领礼包: 23个

财富等级: 恭喜发财

发表于 2004-3-19 12:57:17 | 显示全部楼层
2002开始有了一个LayerP命令,可以恢复到之前的图层状态....8-)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-3-19 13:15:38 | 显示全部楼层
用layerstate非常方便,可以保存很多种状态,你要做的只是选择恢复到哪种状态
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-3-19 15:42:36 | 显示全部楼层
to: e2002
那个命令还不错,但和这个SF的功能并不重叠。因为它真正是老老实实地恢复“上一次”。
但大多数情况,你要的却是“上一次关闭”的那些东西。

to:小菜
是很方便,看你用来干什么。
我觉得它的方便之处是用于保存一些“固定”状态,比如出图时的状态。
而如果要用于保存千变万化的工作状态,那还不如直接去图层管理好了。
2005好像会加强这个功能,PhotoshopCS也增加了类似的图层组合管理功能。可见大家心意相通啊 :)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 07:58 , Processed in 0.252989 second(s), 43 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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