lostbalance 发表于 2017-8-5 08:37:50

[lostbalance]快速切换图层

本帖最后由 lostbalance 于 2023-7-21 22:54 编辑

发个帖子庆祝下明经重开{:soso__10418160594608475187_1:}(是火狐的关系吗,好像不能使用插件里的默认表情=。=)

最近有感于每次切换图层太麻烦,终于下定抽了点时间编一个快速切换图层的插件。主要功能,有总面板可以切换图层,也可以使用或关闭自定义快捷键快速切换图层;切换时,之前有选中对象的,则切换选中对象的图层,否则,切换当前图层。
主要的就是_DefunSwitchLayers 和_SwitchLayers 两个函数,另外几个是做扩展功能的,但主功能没花多少时间,扩展功能反而调试了好久{:soso__3669389859068460655_4:}。里面的wyb函数,基本上都是论坛上或者LM、GXL、猫大师、黄大师等大师的名作(虽然可能名字被我改了,主要是管理和使用上方便点)。我一开始打算放的,但是发现好多还引用了其他的wyb函数,一层套一层,有总无穷尽的感觉……大家先看看手头有没有通功能的,可以替换下。

------------------------------------------------------------------------------------------------------------
WYB-开始的函数,很多都是嵌套的,我之后看情况慢慢补。可以关注下下面的淘帖lostbalance系列
------------------------------------------------------------------------------------------------------------
鉴于回帖挺多,放个精简的版本出来,不支持面板操作,不支持ini保存配置。对于图层比较固定的同学来说,应该够用了。面板还有ini支持用到的相关函数,嵌套的太多,一下子放出来太废精力,可能会在其他帖子里慢慢放出来。确实对面板有要求的,可以考虑自己编一个,或者论坛里找一下。
ps,前面几层的也就算了,后面几天问wyb-file-readini的几个,你们是不是不看帖子的?我在发这帖子的第二天就在另外一个帖子了放出了文本读取和存储相关的几个函数,你要说那里面还是少函数也就算了,说没放出又是几个意思?
------------------------------------------------------------------------------------------------------------
简化版的之前没仔细测试,修复了下,现在应该可以了。
------------------------------------------------------------------------------------------------------------
2019.12.16

这程序怎么又被挖出来了,放个目前自己在用的版本v1.2.1。
通用程序还有预定义的代码之类的,请自己在我的其他帖子里找,这里不单独补了,太麻烦。如果没有,跟帖说明下,我再补。

------------------------------------------------------------------------------------------------------------
2022.9.29

原来的程序中,将对象更改图层,用的改ent代码的方式,效率很慢,在数据量大的时候很容易死机,将这部分的代码改了下,改成调用commad将对象图层改为当前图层的方式,能提高程序的效率和稳定性,相关代码如下,各位自己替换下
ps,修改了下,ssget的I模式,与laycur命令组合有问题,把I去了就正常了。

      ((setq ss (ssget)) ;;有选择集时,切换选择集的图层
            (wyb-error-init nil)
            (setq olay (getvar "clayer") ;;保存旧的当前图层,在defun局部参数里添加该参数
            (setvar "clayer" lay ) ;;将当前替换图层替换为目标图层
            (command "LAYCUR" ss"")   
            (command) ;;清空选择集
            (setvar "clayer" olay ) ;;恢复旧的当前图层
            (princ (strcat "选中对象移至图层 < " lay " > "))
            (wyb-error-end)
      )

------------------------------------------------------------------------------------------------------------
20230721 好心人打包了,懒人福利
http://bbs.mjtd.com/forum.php?mod=redirect&goto=findpost&ptid=175221&pid=946621&fromuid=7302297

------------------------------------------------------------------------------------------------------------
;|= 切换图层
@== SwitchLayers
#==
gvar: *Var_SwitchLayers*
ver:
    by lostbalance 20170802
    ADD: 保存参数至ini文件 by lostbalance 20170805
=========|;
(defun c:SwitchLayers (/ setdcl Opt)
    ;;==========主面板
    (defun setdcl   (/ str_lst init_lst infmsg ctl
                     lays n lay act ini Oldact
                  )
      (setq infmsg
            (strcat "切换图层(SwitchLayers)"
                  "\n\nv1.1 20170805"
                  "\n\n激活快速切换后,可以根据"
                  "\n自定义快捷键直接快速切换。"
                  "\n\nCopyright (c) 2017 lostbalance.\nEmail: 78250349@qq.com"
            )
      )
      (setq lays (wyb-sort-sspts (wyb-listlayers) "xX" nil)) ;;获取并整理所有图层
      (setq n (car *Var_SwitchLayers*)
            act (atoi (cadr (wyb-file-readini "SwitchLayers.ini" "active" '("act"))))
            ini (wyb-file-readini "SwitchLayers.ini" "keys" nil)
            lay (nth n lays)
            Oldact act ;;暂存act
      )
      (setq str_lst
            '(
                ("" "切换或移动对象至图层" ":boxed_row{")
                  ("n" "" "popup" "(setq lay (nth (setq n (atoi $value)) lays))" "" "lays" "")
                "}"
                ("" "快速切换" ":boxed_row{")
                  ("act" "激活快速切换" "toggle")
                  ("Opt" "配置" "button" "(done_dialog 2)")
                "}"
               
                "line"
                "ioc"
            )
      )
      (setq init_lst (list "n" n "act" act))
      (setq ctl (wyb-dcl-init "切换图层 (c) 2017 lostbalance." str_lst init_lst))
      (cond
            ((= act 1) (_DefunSwitchLayers 1 ini)) ;;激活时,定义函数
            ((and (= act 0) (= Oldact 1)) (_DefunSwitchLayers 0 ini)) ;;激活变不激活时,清空函数
            ((= Oldact act 0)) ;;保持不激活时,不执行
      )
      (setq *Var_SwitchLayers* (list n))
      (wyb-file-saveini "SwitchLayers.ini" "active" (list "act" act))
      (cond
            ((= ctl 0) (princ "操作取消!..."))
            ((= ctl 1) (_SwitchLayers lay))
            ((= ctl 2) (Opt))
      )
    )
    ;;==========配置快速切换
    (defun Opt(/ str_lst init_lst ctl
                   act ini k1 k2 k3 k4 k5 k6 lay1 lay2 lay3 lay4 lay5 lay6
                   lays n1 n2 n3 n4 n5 n6
                )
      (setq act(atoi (cadr (wyb-file-readini "SwitchLayers.ini" "active" '("act"))))
            ini(wyb-file-readini "SwitchLayers.ini" "keys" nil)
            k1   (cadr ini)
            lay1 (cadddr ini)
            k2   (nth 5 ini)
            lay2 (nth 7 ini)
            k3   (nth 9 ini)
            lay3 (nth 11 ini)
            k4   (nth 13 ini)
            lay4 (nth 15 ini)
            k5   (nth 17 ini)
            lay5 (nth 19 ini)
            k6   (nth 21 ini)
            lay6 (nth 23 ini)
      )
      (setq lays (wyb-sort-sspts (wyb-listlayers) "xX" nil)) ;;获取并整理所有图层
      (or (setq n1 (wyb-lst-position lay1 lays)) (setq n1 0 lay1 (car lays))) ;;在所有图层中定位图层,否则设为第一个图层
      (or (setq n2 (wyb-lst-position lay2 lays)) (setq n2 0 lay2 (car lays)))
      (or (setq n3 (wyb-lst-position lay3 lays)) (setq n3 0 lay3 (car lays)))
      (or (setq n4 (wyb-lst-position lay4 lays)) (setq n4 0 lay4 (car lays)))
      (or (setq n5 (wyb-lst-position lay5 lays)) (setq n5 0 lay5 (car lays)))
      (or (setq n6 (wyb-lst-position lay6 lays)) (setq n6 0 lay6 (car lays)))
      (setq str_lst
            '(
                ("act" "激活切换图层" "toggle" "" "" "" "")
                ("" "      快捷键      图层      " ":boxed_column{")
                  ":row{"
                        ("k1" "切换1" "str" "" "2" "" "")
                        ("n1" "" "popup" "(setq lay1 (nth (atoi $value) lays))" "18" "lays" "")
                  "}"
                  ":row{"
                        ("k2" "切换2" "str" "" "2" "" "")
                        ("n2" "" "popup" "(setq lay2 (nth (atoi $value) lays))" "18" "lays" "")
                  "}"
                  ":row{"
                        ("k3" "切换3" "str" "" "2" "" "")
                        ("n3" "" "popup" "(setq lay3 (nth (atoi $value) lays))" "18" "lays" "")
                  "}"
                  ":row{"
                        ("k4" "切换4" "str" "" "2" "" "")
                        ("n4" "" "popup" "(setq lay4 (nth (atoi $value) lays))" "18" "lays" "")
                  "}"
                  ":row{"
                        ("k5" "切换5" "str" "" "2" "" "")
                        ("n5" "" "popup" "(setq lay5 (nth (atoi $value) lays))" "18" "lays" "")
                  "}"
                  ":row{"
                        ("k6" "切换6" "str" "" "2" "" "")
                        ("n6" "" "popup" "(setq lay6 (nth (atoi $value) lays))" "18" "lays" "")
                  "}"
                "}"
                "ioc"
            )
      )
      (setq init_lst
            (list "act" act
                  "k1" k1 "n1" n1 "k2" k2 "n2" n2 "k3" k3 "n3" n3
                  "k4" k4 "n4" n4 "k5" k5 "n5" n5 "k6" k6 "n6" n6
            )
      )
      (setq ctl (wyb-dcl-init "配置 (c) 2017 lostbalance." str_lst init_lst))
      (cond
            ((= ctl 0) (princ "操作取消!..."))
            ((= ctl 1)
                (_DefunSwitchLayers 0 ini) ;;先清空原来的函数
                (setq ini (list "k1" k1 "lay1" lay1 "k2" k2 "lay2" lay2 "k3" k3 "lay3" lay3 "k4" k4 "lay4" lay4 "k5" k5 "lay5" lay5 "k6" k6 "lay6" lay6))
                (if (= act 1) (_DefunSwitchLayers 1 ini)) ;;激活时,定义新的函数
                (wyb-file-saveini "SwitchLayers.ini" "active" (list "act" act))
                (wyb-file-saveini "SwitchLayers.ini" "keys" ini)
            )
      )
    )
    ;==========
    (if (not (vl-consp *Var_SwitchLayers*)) (setq *Var_SwitchLayers* '(0)))
    (setdcl)
    (princ)
)
;;==========生成函数
(defun _DefunSwitchLayers (act ini / lst k v)
    (setq lst ini)
    (cond
      ((= act 1) ;;激活时,定义所有非空函数
            (while lst
                (setq k (cadr lst)
                      v (cadddr lst)
                      lst (cddddr lst)
                )
                (if k
                  (eval (read (strcat "(defun c:" k " () (_SwitchLayers \"" v "\"))")))
                )
            )
      )
      ((= act 0) ;;不激活时,清空所有函数
            (while lst
                (setq k (cadr lst)
                      lst (cddddr lst)
                )
                (if k
                  (eval (read (strcat "(defun c:" k " () nil)")))
                )
            )
      )
      ((= act -1) ;;不激活时,load后不定义函数,避免不必要的冲突
            nil
      )
    )
    (princ)
)
;;==========切换图层
(defun _SwitchLayers (lay / ss ln ent)
    (cond
      ((null (wyb-lst-position lay (wyb-listlayers)))
            (princ (strcat "\n没有图层 < " lay " >,操作取消!..."))
      )
      ((setq ss (ssget "i")) ;;有选择集时,切换选择集的图层
            (wyb-error-init nil)
            (repeat (setq ln (sslength ss))
                (setq ent (entget (ssname ss (setq ln (1- ln)))))
                (wyb-substmod ent 8 lay)
            )
            (command) ;;清空选择集
            (princ (strcat "选中对象移至图层 < " lay " > "))
            (wyb-error-end)
      )
      (t ;;没有选择集时,切换图层
            (wyb-error-init nil)
            (setvar "clayer" lay)
            (princ (strcat "切换当前图层为 < " lay " > "))
            (wyb-error-end)
      )
    )
    (princ)
)
;;==========load后默认配置
(defun _loadSwitchLayers (/ ini act)
    (if (null (setq act (cadr (wyb-file-readini "SwitchLayers.ini" "active" '("act"))))) ;;ini文件不存在时,创建
      (progn
            (setq act "0")
            (wyb-file-saveini "SwitchLayers.ini" "active" (list "act" act))
      )
    )
    (if (null (setq ini (wyb-file-readini "SwitchLayers.ini" "keys" nil)))
      (progn
            (setq ini (list "k1" "1" "lay1" "1" "k2" "2" "lay2" "2" "k3" "3" "lay3" "3" "k4" "4" "lay4" "4" "k5" "5" "lay5" "5" "k6" "6" "lay6" "6"))
            (wyb-file-saveini "SwitchLayers.ini" "keys" ini)
      )
    )
    (setq act (atoi act))
    (if (= act 0) (setq act -1)) ;;不激活时,不定义函数
    (_DefunSwitchLayers act ini)
)
;;==========启动预配置
(_loadSwitchLayers)





moshouhot 发表于 2023-5-5 11:16:02

本帖最后由 moshouhot 于 2023-5-8 09:20 编辑

内置了wyb函数库和vectra152个代码。
放在D盘根目录。
(load-wyb-library "D:/wyb函数库")
可以自行修改函数库位置,修复了运行中的报错,功能没有新增。版权归楼主所有,收费如果不合适请告知。

vlisp2012 发表于 2017-8-6 11:11:54

多谢分享了。很开心明经恢复开通了!!!

296715530 发表于 2019-12-16 09:44:48

ps:简化版可以用了。感谢楼主、命令:
命令: 1 切换当前图层为 < 1 >
命令:
命令: 2 切换当前图层为 < 2 >
命令:
命令: 3 切换当前图层为 < 3 >
命令:
命令: 4 切换当前图层为 < 4 >
命令:
命令: 5 切换当前图层为 < 5 >
命令:
命令: 6 切换当前图层为 < 6 >


选中对象移至图层 < 1 >
命令: 指定对角点或 [栏选(F)/圈围(WP)/圈交(CP)]:
命令: 2 *取消*
选中对象移至图层 < 2 >
命令: 指定对角点或 [栏选(F)/圈围(WP)/圈交(CP)]:
命令: 3 *取消*
选中对象移至图层 < 3 >
命令: 指定对角点或 [栏选(F)/圈围(WP)/圈交(CP)]:
命令: 4 *取消*
选中对象移至图层 < 4 >
命令: 指定对角点或 [栏选(F)/圈围(WP)/圈交(CP)]:
命令: 5 *取消*
选中对象移至图层 < 5 >
命令: 指定对角点或 [栏选(F)/圈围(WP)/圈交(CP)]:
命令: 6 *取消*
选中对象移至图层 < 6 >

davide888 发表于 2017-8-5 11:02:06

本帖最后由 davide888 于 2017-8-5 11:30 编辑

沙发抢了      
no function definition: WYB-FILE-READINI

yaokui25 发表于 2017-8-5 12:03:50

谢谢楼主,好像缺少个函数 WYB-FILE-READINI

linheyuanpcb 发表于 2017-8-6 09:49:43

支持一下

davide888 发表于 2017-8-7 10:25:33

错误: no function definition: WYB-FILE-READINI

sowin360 发表于 2017-8-7 16:21:03

支持一下

love1030312 发表于 2017-8-9 09:27:13

不错正是需要的

MENGZE 发表于 2017-8-9 17:21:45

把 WYB-FILE-READINI函数放出来吧,帮人帮到底,送佛送到西.也就是一完整程序了

429014673 发表于 2017-8-9 19:46:27

还是差函数呀,楼主
页: [1] 2 3 4 5 6 7
查看完整版本: [lostbalance]快速切换图层