明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 13663|回复: 76

[函数] [lostbalance]快速切换图层

  [复制链接]
发表于 2017-8-5 08:37 | 显示全部楼层 |阅读模式
本帖最后由 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?mo ... amp;fromuid=7302297

------------------------------------------------------------------------------------------------------------
  1. ;|= 切换图层
  2. @== SwitchLayers
  3. #==
  4. gvar: *Var_SwitchLayers*
  5. ver:
  6.     [1.0] by lostbalance 20170802
  7.     [1.1] ADD: 保存参数至ini文件 by lostbalance 20170805
  8. =========|;
  9. (defun c:SwitchLayers (/ setdcl Opt)
  10.     ;;==========主面板
  11.     (defun setdcl   (/ str_lst init_lst infmsg ctl
  12.                        lays n lay act ini Oldact
  13.                     )
  14.         (setq infmsg
  15.             (strcat "切换图层(SwitchLayers)"
  16.                     "\n\nv1.1 20170805"
  17.                     "\n\n激活快速切换后,可以根据"
  18.                     "\n自定义快捷键直接快速切换。"
  19.                     "\n\nCopyright (c) 2017 lostbalance.\nEmail: 78250349@qq.com"
  20.             )
  21.         )
  22.         (setq lays (wyb-sort-sspts (wyb-listlayers) "xX" nil)) ;;获取并整理所有图层
  23.         (setq n (car *Var_SwitchLayers*)
  24.               act (atoi (cadr (wyb-file-readini "SwitchLayers.ini" "active" '("act"))))
  25.               ini (wyb-file-readini "SwitchLayers.ini" "keys" nil)
  26.               lay (nth n lays)
  27.               Oldact act ;;暂存act
  28.         )
  29.         (setq str_lst
  30.             '(
  31.                 ("" "切换或移动对象至图层" ":boxed_row{")
  32.                     ("n" "" "popup" "(setq lay (nth (setq n (atoi $value)) lays))" "" "lays" "")
  33.                 "}"
  34.                 ("" "快速切换" ":boxed_row{")
  35.                     ("act" "激活快速切换" "toggle")
  36.                     ("Opt" "配置" "button" "(done_dialog 2)")
  37.                 "}"
  38.                
  39.                 "line"
  40.                 "ioc"
  41.             )
  42.         )
  43.         (setq init_lst (list "n" n "act" act))
  44.         (setq ctl (wyb-dcl-init "切换图层 (c) 2017 lostbalance." str_lst init_lst))
  45.         (cond
  46.             ((= act 1) (_DefunSwitchLayers 1 ini)) ;;激活时,定义函数
  47.             ((and (= act 0) (= Oldact 1)) (_DefunSwitchLayers 0 ini)) ;;激活变不激活时,清空函数
  48.             ((= Oldact act 0)) ;;保持不激活时,不执行
  49.         )
  50.         (setq *Var_SwitchLayers* (list n))
  51.         (wyb-file-saveini "SwitchLayers.ini" "active" (list "act" act))
  52.         (cond
  53.             ((= ctl 0) (princ "操作取消!..."))
  54.             ((= ctl 1) (_SwitchLayers lay))
  55.             ((= ctl 2) (Opt))
  56.         )
  57.     )
  58.     ;;==========配置快速切换
  59.     (defun Opt  (/ str_lst init_lst ctl
  60.                    act ini k1 k2 k3 k4 k5 k6 lay1 lay2 lay3 lay4 lay5 lay6
  61.                    lays n1 n2 n3 n4 n5 n6
  62.                 )
  63.         (setq act  (atoi (cadr (wyb-file-readini "SwitchLayers.ini" "active" '("act"))))
  64.               ini  (wyb-file-readini "SwitchLayers.ini" "keys" nil)
  65.               k1   (cadr ini)
  66.               lay1 (cadddr ini)
  67.               k2   (nth 5 ini)
  68.               lay2 (nth 7 ini)
  69.               k3   (nth 9 ini)
  70.               lay3 (nth 11 ini)
  71.               k4   (nth 13 ini)
  72.               lay4 (nth 15 ini)
  73.               k5   (nth 17 ini)
  74.               lay5 (nth 19 ini)
  75.               k6   (nth 21 ini)
  76.               lay6 (nth 23 ini)
  77.         )
  78.         (setq lays (wyb-sort-sspts (wyb-listlayers) "xX" nil)) ;;获取并整理所有图层
  79.         (or (setq n1 (wyb-lst-position lay1 lays)) (setq n1 0 lay1 (car lays))) ;;在所有图层中定位图层,否则设为第一个图层
  80.         (or (setq n2 (wyb-lst-position lay2 lays)) (setq n2 0 lay2 (car lays)))
  81.         (or (setq n3 (wyb-lst-position lay3 lays)) (setq n3 0 lay3 (car lays)))
  82.         (or (setq n4 (wyb-lst-position lay4 lays)) (setq n4 0 lay4 (car lays)))
  83.         (or (setq n5 (wyb-lst-position lay5 lays)) (setq n5 0 lay5 (car lays)))
  84.         (or (setq n6 (wyb-lst-position lay6 lays)) (setq n6 0 lay6 (car lays)))
  85.         (setq str_lst
  86.             '(
  87.                 ("act" "激活切换图层" "toggle" "" "" "" "")
  88.                 ("" "      快捷键      图层      " ":boxed_column{")
  89.                     ":row{"
  90.                         ("k1" "切换1" "str" "" "2" "" "")
  91.                         ("n1" "" "popup" "(setq lay1 (nth (atoi $value) lays))" "18" "lays" "")
  92.                     "}"
  93.                     ":row{"
  94.                         ("k2" "切换2" "str" "" "2" "" "")
  95.                         ("n2" "" "popup" "(setq lay2 (nth (atoi $value) lays))" "18" "lays" "")
  96.                     "}"
  97.                     ":row{"
  98.                         ("k3" "切换3" "str" "" "2" "" "")
  99.                         ("n3" "" "popup" "(setq lay3 (nth (atoi $value) lays))" "18" "lays" "")
  100.                     "}"
  101.                     ":row{"
  102.                         ("k4" "切换4" "str" "" "2" "" "")
  103.                         ("n4" "" "popup" "(setq lay4 (nth (atoi $value) lays))" "18" "lays" "")
  104.                     "}"
  105.                     ":row{"
  106.                         ("k5" "切换5" "str" "" "2" "" "")
  107.                         ("n5" "" "popup" "(setq lay5 (nth (atoi $value) lays))" "18" "lays" "")
  108.                     "}"
  109.                     ":row{"
  110.                         ("k6" "切换6" "str" "" "2" "" "")
  111.                         ("n6" "" "popup" "(setq lay6 (nth (atoi $value) lays))" "18" "lays" "")
  112.                     "}"
  113.                 "}"
  114.                 "ioc"
  115.             )
  116.         )
  117.         (setq init_lst
  118.             (list "act" act
  119.                   "k1" k1 "n1" n1 "k2" k2 "n2" n2 "k3" k3 "n3" n3
  120.                   "k4" k4 "n4" n4 "k5" k5 "n5" n5 "k6" k6 "n6" n6
  121.             )
  122.         )
  123.         (setq ctl (wyb-dcl-init "配置 (c) 2017 lostbalance." str_lst init_lst))
  124.         (cond
  125.             ((= ctl 0) (princ "操作取消!..."))
  126.             ((= ctl 1)
  127.                 (_DefunSwitchLayers 0 ini) ;;先清空原来的函数
  128.                 (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))
  129.                 (if (= act 1) (_DefunSwitchLayers 1 ini)) ;;激活时,定义新的函数
  130.                 (wyb-file-saveini "SwitchLayers.ini" "active" (list "act" act))
  131.                 (wyb-file-saveini "SwitchLayers.ini" "keys" ini)
  132.             )
  133.         )
  134.     )
  135.     ;==========
  136.     (if (not (vl-consp *Var_SwitchLayers*)) (setq *Var_SwitchLayers* '(0)))
  137.     (setdcl)
  138.     (princ)
  139. )
  140. ;;==========生成函数
  141. (defun _DefunSwitchLayers (act ini / lst k v)
  142.     (setq lst ini)
  143.     (cond
  144.         ((= act 1) ;;激活时,定义所有非空函数
  145.             (while lst
  146.                 (setq k (cadr lst)
  147.                       v (cadddr lst)
  148.                       lst (cddddr lst)
  149.                 )
  150.                 (if k
  151.                     (eval (read (strcat "(defun c:" k " () (_SwitchLayers \"" v "\"))")))
  152.                 )
  153.             )
  154.         )
  155.         ((= act 0) ;;不激活时,清空所有函数
  156.             (while lst
  157.                 (setq k (cadr lst)
  158.                       lst (cddddr lst)
  159.                 )
  160.                 (if k
  161.                     (eval (read (strcat "(defun c:" k " () nil)")))
  162.                 )
  163.             )
  164.         )
  165.         ((= act -1) ;;不激活时,load后不定义函数,避免不必要的冲突
  166.             nil
  167.         )
  168.     )
  169.     (princ)
  170. )
  171. ;;==========切换图层
  172. (defun _SwitchLayers (lay / ss ln ent)
  173.     (cond
  174.         ((null (wyb-lst-position lay (wyb-listlayers)))
  175.             (princ (strcat "\n没有图层 < " lay " >,操作取消!..."))
  176.         )
  177.         ((setq ss (ssget "i")) ;;有选择集时,切换选择集的图层
  178.             (wyb-error-init nil)
  179.             (repeat (setq ln (sslength ss))
  180.                 (setq ent (entget (ssname ss (setq ln (1- ln)))))
  181.                 (wyb-substmod ent 8 lay)
  182.             )
  183.             (command) ;;清空选择集
  184.             (princ (strcat "选中对象移至图层 < " lay " > "))
  185.             (wyb-error-end)
  186.         )
  187.         (t ;;没有选择集时,切换图层
  188.             (wyb-error-init nil)
  189.             (setvar "clayer" lay)
  190.             (princ (strcat "切换当前图层为 < " lay " > "))
  191.             (wyb-error-end)
  192.         )
  193.     )
  194.     (princ)
  195. )
  196. ;;==========load后默认配置
  197. (defun _loadSwitchLayers (/ ini act)
  198.     (if (null (setq act (cadr (wyb-file-readini "SwitchLayers.ini" "active" '("act"))))) ;;ini文件不存在时,创建
  199.         (progn
  200.             (setq act "0")
  201.             (wyb-file-saveini "SwitchLayers.ini" "active" (list "act" act))
  202.         )
  203.     )
  204.     (if (null (setq ini (wyb-file-readini "SwitchLayers.ini" "keys" nil)))
  205.         (progn
  206.             (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"))
  207.             (wyb-file-saveini "SwitchLayers.ini" "keys" ini)
  208.         )
  209.     )
  210.     (setq act (atoi act))
  211.     (if (= act 0) (setq act -1)) ;;不激活时,不定义函数
  212.     (_DefunSwitchLayers act ini)
  213. )
  214. ;;==========启动预配置
  215. (_loadSwitchLayers)






本帖子中包含更多资源

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

x

评分

参与人数 2明经币 +2 收起 理由
moshouhot + 1 你才是大佬!
USER2128 + 1 很给力!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下

本帖被以下淘专辑推荐:

发表于 2023-5-5 11:16 | 显示全部楼层
本帖最后由 moshouhot 于 2023-5-8 09:20 编辑

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

本帖子中包含更多资源

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

x

点评

非常不错,多谢好心人  发表于 2023-12-7 12:54

评分

参与人数 1明经币 +1 收起 理由
lostbalance + 1 竟然抢生意

查看全部评分

回复 支持 2 反对 1

使用道具 举报

发表于 2017-8-6 11:11 | 显示全部楼层
多谢分享了。很开心明经恢复开通了!!!
回复 支持 0 反对 1

使用道具 举报

发表于 2019-12-16 09:44 | 显示全部楼层
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 >
回复 支持 0 反对 1

使用道具 举报

发表于 2017-8-5 11:02 | 显示全部楼层
本帖最后由 davide888 于 2017-8-5 11:30 编辑

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

发表于 2017-8-5 12:03 | 显示全部楼层
谢谢楼主,好像缺少个函数 WYB-FILE-READINI
发表于 2017-8-7 10:25 | 显示全部楼层
错误: no function definition: WYB-FILE-READINI
发表于 2017-8-9 09:27 | 显示全部楼层
不错正是需要的
发表于 2017-8-9 17:21 | 显示全部楼层
把 WYB-FILE-READINI函数放出来吧,帮人帮到底,送佛送到西.也就是一完整程序了
发表于 2017-8-9 19:46 | 显示全部楼层
还是差函数呀,楼主
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-26 15:38 , Processed in 1.000231 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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